+```
+
+Ukiongeza classes nyingi kwenye kipengele cha HTML, mitindo ya class za kwanza inayoorodhesha inaweza kubatilishwa na classes za baadaye.
+
+Ili kuanza, ongeza class `one` kwa alama ya kwanza ya kipengele cha `div`.
+
+
+# --hints--
+
+Unapaswa kuongeza class `one` kwa alama ya kwanza ya kipengele cha `div`.
+
+```js
+const containerFirstChild = [...document.querySelector('.container')?.children][0];
+assert(containerFirstChild?.classList?.contains('one'));
+```
+
+Alama yako ya kwanza ya `div` inapaswa kuwa na classes za `marker` na `one`.
+
+```js
+const containerFirstChild = [...document.querySelector('.container')?.children][0];
+assert(containerFirstChild?.classList?.contains('marker') && containerFirstChild?.classList?.contains('one'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+--fcc-editable-region--
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ background-color: red;
+ margin: 10px auto;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764f23ea21477b76f3b80f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764f23ea21477b76f3b80f.md
new file mode 100644
index 00000000000..b48077b9727
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764f23ea21477b76f3b80f.md
@@ -0,0 +1,61 @@
+---
+id: 61764f23ea21477b76f3b80f
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Kisha, ondoa sifa ya `background-color` na thamani yake kutoka kwa sheria ya CSS ya `.marker`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.marker` haipaswi kuwa na sifa au thamani ya `background-color`.
+
+```js
+assert(!code.includes('background-color') && !new __helpers.CSSHelp(document).getStyle('.marker')?.backgroundColor);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+--fcc-editable-region--
+.marker {
+ width: 200px;
+ height: 25px;
+ background-color: red;
+ margin: 10px auto;
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764f7e5240eb7ccc7f6a0a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764f7e5240eb7ccc7f6a0a.md
new file mode 100644
index 00000000000..6ef04e901e6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764f7e5240eb7ccc7f6a0a.md
@@ -0,0 +1,68 @@
+---
+id: 61764f7e5240eb7ccc7f6a0a
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Kisha, unda sheria mpya ya CSS inayolenga class ya `one` na uweke sifa ya `background-color` kuwa `red`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha class kulenga class ya `one`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one'));
+```
+
+Sheria yako ya CSS ya `.one` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `red`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor === 'red');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764fdda535587e1fefb3aa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764fdda535587e1fefb3aa.md
new file mode 100644
index 00000000000..c8800847288
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764fdda535587e1fefb3aa.md
@@ -0,0 +1,86 @@
+---
+id: 61764fdda535587e1fefb3aa
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Ongeza class ya `two` kwa alama ya pili `div`, na uongeze class ya `three` kwa alama ya tatu `div`.
+
+# --hints--
+
+Unapaswa kuongeza class ya `two` kwa alama ya pili ya kipengele cha pili cha `div` katika `container` `div`.
+
+```js
+const containerSecondChild = [...document.querySelector('.container')?.children][1];
+assert(containerSecondChild?.classList?.contains('two'));
+```
+
+`div` ya alama yako ya pili inapaswa kuwa na classes za `marker` na `two`.
+
+```js
+const containerSecondChild = [...document.querySelector('.container')?.children][1];
+assert(containerSecondChild?.classList?.contains('marker') && containerSecondChild.classList?.contains('two'));
+```
+
+Unapaswa kuongeza class ya `three` kwa alama ya tatu ya kipengele cha pili cha `div` katika `container` `div`.
+
+```js
+const containerThirdChild = [...document.querySelector('.container')?.children][2];
+assert(containerThirdChild?.classList?.contains('three'));
+```
+
+`div` ya alama yako ya tatu inapaswa kuwa na classes za `marker` na `three`.
+
+```js
+const containerThirdChild = [...document.querySelector('.container')?.children][2];
+assert(containerThirdChild?.classList?.contains('marker') && containerThirdChild?.classList?.contains('three'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+--fcc-editable-region--
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: red;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/6176519636a76b810ab1219a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/6176519636a76b810ab1219a.md
new file mode 100644
index 00000000000..be506407bb6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/6176519636a76b810ab1219a.md
@@ -0,0 +1,86 @@
+---
+id: 6176519636a76b810ab1219a
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Unda sheria ya CSS inayolenga class ya `two` na uweke kipengele chake cha `background-color` kuwa `green`.
+
+Pia, unda sheria tofauti ya CSS inayolenga class ya `three` na uweke `background-color` kuwa `blue`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha class kulenga class ya `two`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two'));
+```
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `green`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'green');
+```
+
+Unapaswa kutumia kichaguzi cha class kulenga class ya `three`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.three'));
+```
+
+Sheria yako ya CSS ya `.three` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `blue`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.three')?.backgroundColor === 'blue');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: red;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b65579ce424bf5f02ca73.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b65579ce424bf5f02ca73.md
new file mode 100644
index 00000000000..b919937e21c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b65579ce424bf5f02ca73.md
@@ -0,0 +1,84 @@
+---
+id: 617b65579ce424bf5f02ca73
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Kuna miundo miwili mikuu ya rangi: muundo wa
additive RGB (red, green, blue) unaotumika katika vifaa vya kielektroniki, na
subtractive CMYK (cyan, magenta, yellow, black) unaotumika katika magazeti.
+
+Katika mradi huu, utafanya kazi na muundo wa RGB. Hii inamaanisha kuwa rangi huanza kuwa nyeusi, na hubadilika kadri viwango tofauti vya nyekundu, kijani kibichi na bluu vinapoongezwa. Njia rahisi ya kuona hii ni kwa kutumia kitendakazi cha CSS `rgb`.
+
+Unda sheria mpya ya CSS inayolenga class ya `container` na uweke sifa ya `background-color` kuwa nyeusi na `rgb(0, 0, 0)`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha class kulenga class ya `container`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.container'));
+```
+
+Sheria yako ya CSS ya `.container` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.container')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: red;
+}
+
+.two {
+ background-color: green;
+}
+
+.three {
+ background-color: blue;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b8b38f32bf2080a140675.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b8b38f32bf2080a140675.md
new file mode 100644
index 00000000000..3303f602b45
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b8b38f32bf2080a140675.md
@@ -0,0 +1,90 @@
+---
+id: 617b8b38f32bf2080a140675
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Kitendakazi ni kipande cha msimbo ambacho kinaweza kuchukua ingizo na kutekeleza kitendo mahususi. Ktendakazi cha CSS cha `rgb` hukubali thamani, au
hoja , kwa nyekundu, kijani kibichi na buluu, na hutoa rangi:
+
+```css
+rgb(red, green, blue);
+```
+
+Kila thamani nyekundu, kijani na bluu ni nambari kutoka `0` hadi `255`. `0` inamaanisha kuwa kuna 0% ya rangi hiyo, na ni nyeusi. `255` inamaanisha kuwa kuna 100% ya rangi hiyo.
+
+Katika sheria ya CSS ya `.one` CSS, badilisha nenomsingi la rangi `red` na kitendakazi cha `rgb`. Kwa kitendakazi cha `rgb` weka thamani ya nyekundu kuwa `255`, thamani ya kijani kuwa `0`, na thamani ya bluu kuwa `0`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.one` haipaswi kutumia nenomsingi la rangi ya `red` kuweka sifa ya `background-color`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor !== 'red');
+```
+
+Sheria yako ya CSS ya `.one` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor === 'rgb(255, 0, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(0, 0, 0);
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.one {
+ background-color: red;
+}
+--fcc-editable-region--
+
+.two {
+ background-color: green;
+}
+
+.three {
+ background-color: blue;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b8e0d93a8d10d9a90e720.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b8e0d93a8d10d9a90e720.md
new file mode 100644
index 00000000000..e1fdccfeae3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b8e0d93a8d10d9a90e720.md
@@ -0,0 +1,98 @@
+---
+id: 617b8e0d93a8d10d9a90e720
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Fahamu kuwa `background-color` ya alama yako bado ni nyekundu. Hii ni kwa sababu umeweka thamani nyekundu kwa kitendakazi cha `rgb` hadi upeo wa `255`, au 100% nyekundu, na kuweka thamani zote mbili za kijani na bluu kuwa `0`.
+
+Sasa tumia kitendakazi cha `rgb` kuweka rangi zingine.
+
+Katika sheria ya CSS ya `.two`, tumia kitendakazi cha `rgb` kuweka `background-color` kuwa na thamani ya juu zaidi ya kijani, na `0` kwa thamani zingine. Na katika sheria ya CSS ya `.three`, tumia kitendakazi cha `rgb` kuweka `background-color` kuwa na thamani ya juu zaidi ya bluu, na `0` kwa thamani zingine.
+
+# --hints--
+
+Sheria yako ya CSS ya `.two` haipaswi kutumia nenomsingi la rangi ya `green` kuweka sifa ya `background-color`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor !== 'green');
+```
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 255, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 255, 0)');
+```
+
+Sheria yako ya CSS ya `.three` haipaswi kutumia nenomsingi la rangi ya `blue` kuweka sifa ya `background-color`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.three')?.backgroundColor !== 'blue');
+```
+
+Sheria yako ya CSS ya `.three` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 255)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.three')?.backgroundColor === 'rgb(0, 0, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(0, 0, 0);
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 0, 0);
+}
+
+--fcc-editable-region--
+.two {
+ background-color: green;
+}
+
+.three {
+ background-color: blue;
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b92b9de349513466f6156.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b92b9de349513466f6156.md
new file mode 100644
index 00000000000..7e7aeb11e9f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b92b9de349513466f6156.md
@@ -0,0 +1,78 @@
+---
+id: 617b92b9de349513466f6156
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Wakati alama nyekundu na bluu zinaonekana sawa, moja ya kijani ni nyepesi zaidi kuliko ilivyokuwa hapo awali. Hii ni kwa sababu neno kuu la rangi ya `green` ni kivuli cheusi, na iko karibu nusu kati ya nyeusi na thamani ya juu zaidi ya kijani.
+
+Katika sheria ya CSS ya `.two`, weka thamani ya kijani katika kitendakazi cha `rgb` kuwa `127` ili kupunguza ukubwa wake.
+
+# --hints--
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 127, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 127, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(0, 0, 0);
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 0, 0);
+}
+
+--fcc-editable-region--
+.two {
+ background-color: rgb(0, 255, 0);
+}
+--fcc-editable-region--
+
+.three {
+ background-color: rgb(0, 0, 255);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b954d9f4f6217a749380e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b954d9f4f6217a749380e.md
new file mode 100644
index 00000000000..3f02c44b6b0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b954d9f4f6217a749380e.md
@@ -0,0 +1,84 @@
+---
+id: 617b954d9f4f6217a749380e
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Sasa ongeza nafasi wima zaidi kati ya vialamisho vyako na ukingo wa kipengele cha `container` walichomo.
+
+Katika sheria ya CSS ya `.container`, tumia sifa ya mkato ya `padding` kuongeza `10px` ya padding ya juu na chini, na kuweka padding ya kushoto na kulia kuwa `0`. Hii inafanya kazi sawa na sifa ya mkato ya `margin` ulichotumia awali.
+
+# --hints--
+
+Hupaswi kuondoa sifa ya `background-color` na thamani yake kutoka kwa sheria ya CSS ya `.container`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.container')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+Sheria yako ya CSS ya `.container` inapaswa kuwa na sifa ya `padding` iliyowekwa kuwa `10px 0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.container')?.padding === '10px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+--fcc-editable-region--
+.container {
+ background-color: rgb(0, 0, 0);
+}
+--fcc-editable-region--
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 127, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 255);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b97abd9f3f61d1590b815.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b97abd9f3f61d1590b815.md
new file mode 100644
index 00000000000..7c3411a840b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b97abd9f3f61d1590b815.md
@@ -0,0 +1,79 @@
+---
+id: 617b97abd9f3f61d1590b815
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Katika modeli ya rangi ya ziada ya RGB,
primary colors ni rangi ambazo, zikiunganishwa, huunda nyeupe safi. Lakini kwa hili kutokea, kila rangi inahitaji kuwa katika kiwango chake cha juu.
+
+Kabla ya kuchanganya rangi, rudisha alama yako ya kijani kuwa kijani kibichi. Kwa kitendakazi cha `rgb` katika sheria ya CSS ya `.two`, rudisha thamani ya green kuwa juu zaidi `255`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 255, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 255, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(0, 0, 0);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 0, 0);
+}
+
+--fcc-editable-region--
+.two {
+ background-color: rgb(0, 127, 0);
+}
+--fcc-editable-region--
+
+.three {
+ background-color: rgb(0, 0, 255);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b9ad735109e217284e095.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b9ad735109e217284e095.md
new file mode 100644
index 00000000000..39cf4777795
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b9ad735109e217284e095.md
@@ -0,0 +1,79 @@
+---
+id: 617b9ad735109e217284e095
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Kwa kuwa sasa una rangi za msingi za RGB, ni wakati wa kuzichanganya.
+
+Kwa kitendakazi cha `rgb` katika sheria ya `.container`, weka thamani nyekundu, kijani na bluu hadi alama ya juu zaidi ya `255`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.container` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 255, 255)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.container')?.backgroundColor === 'rgb(255, 255, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+--fcc-editable-region--
+.container {
+ background-color: rgb(0, 0, 0);
+ padding: 10px 0;
+}
+--fcc-editable-region--
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 255, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 255);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb5624a75e86463b7e638.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb5624a75e86463b7e638.md
new file mode 100644
index 00000000000..0e92b6f7e4d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb5624a75e86463b7e638.md
@@ -0,0 +1,79 @@
+---
+id: 617bb5624a75e86463b7e638
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+
Secondary colors ni rangi unazopata unapochanganya primary colors. Huenda umegundua baadhi ya rangi za sekondari katika hatua ya mwisho unapobadilisha thamani nyekundu, kijani kibichi na bluu.
+
+Ili kuunda rangi yz sekondari ya, magenta, sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.one` ili kuchanganya nyekundu safi na kijani safi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.one` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 255, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor === 'rgb(255, 255, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.one {
+ background-color: rgb(255, 0, 0);
+}
+--fcc-editable-region--
+
+.two {
+ background-color: rgb(0, 255, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 255);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb77353188166af43f3ac.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb77353188166af43f3ac.md
new file mode 100644
index 00000000000..f0659206fd9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb77353188166af43f3ac.md
@@ -0,0 +1,77 @@
+---
+id: 617bb77353188166af43f3ac
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Ili kuunda rangi ya sekondari ya, cyan, sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.two` ili kuchanganya kijani safi na bluu safi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 255, 255)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 255, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 255, 0);
+}
+
+--fcc-editable-region--
+.two {
+ background-color: rgb(0, 255, 0);
+}
+--fcc-editable-region--
+
+.three {
+ background-color: rgb(0, 0, 255);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb9fdef27bc6aa0470ac2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb9fdef27bc6aa0470ac2.md
new file mode 100644
index 00000000000..b5d7d1493b9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bb9fdef27bc6aa0470ac2.md
@@ -0,0 +1,77 @@
+---
+id: 617bb9fdef27bc6aa0470ac2
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Ili kuunda rangi ya sekondari ya, magenta, sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.three` ili kuchanganya bluu safi na nyekundu safi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.three` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 0, 255)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.three')?.backgroundColor === 'rgb(255, 0, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 255, 0);
+}
+
+.two {
+ background-color: rgb(0, 255, 255);
+}
+
+--fcc-editable-region--
+.three {
+ background-color: rgb(0, 0, 255);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bbb6b97a83f6d1f7d6e38.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bbb6b97a83f6d1f7d6e38.md
new file mode 100644
index 00000000000..d79e55442ba
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bbb6b97a83f6d1f7d6e38.md
@@ -0,0 +1,79 @@
+---
+id: 617bbb6b97a83f6d1f7d6e38
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Kwa kuwa sasa unaufahamu wa secondary colors, utajifunza jinsi ya kuunda
tertiary colors . Tertiary colors huundwa kwa kuchanganya rangi ya primary na ya secondary iliyo karibu.
+
+Ili kuunda rangi ya tertiary ya chungwa, sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.one` ili nyekundu iwe kwenye thamani ya juu zaidi, na uweke kijani kuwa `127`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.one` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 127, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor === 'rgb(255, 127, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.one {
+ background-color: rgb(255, 255, 0);
+}
+--fcc-editable-region--
+
+.two {
+ background-color: rgb(0, 255, 255);
+}
+
+.three {
+ background-color: rgb(255, 0, 255);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bc3386dc7d07d6469bf20.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bc3386dc7d07d6469bf20.md
new file mode 100644
index 00000000000..c5e7c14f1b7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bc3386dc7d07d6469bf20.md
@@ -0,0 +1,79 @@
+---
+id: 617bc3386dc7d07d6469bf20
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Fahamu kwamba, ili kuunda rangi ya chungwa, ilibidi uongeze nguvu ya nyekundu na kupunguza ukubwa wa thamani za kijani katika `rgb`. Hii ni kwa sababu rangi ya chungwa ni mchanganyiko wa nyekundu na njano, na huanguka kati ya rangi mbili kwenye gurudumu la rangi.
+
+Ili kuunda rangi ya tertiary ya chemchemi ya kijani, changanya cyan na kijani. Sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.two` ili kijani kifikie thamani ya juu zaidi, na uweke bluu kuwa `127`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 255, 127)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 255, 127)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 127, 0);
+}
+
+--fcc-editable-region--
+.two {
+ background-color: rgb(0, 255, 255);
+}
+--fcc-editable-region--
+
+.three {
+ background-color: rgb(255, 0, 255);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bc4824e233180553a8069.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bc4824e233180553a8069.md
new file mode 100644
index 00000000000..1d744b9586f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bc4824e233180553a8069.md
@@ -0,0 +1,77 @@
+---
+id: 617bc4824e233180553a8069
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Na kuunda rangi tertiary ya violet, changanya magenta na bluu. Sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.three` ili bluu ifikie thamani ya juu zaidi, na uweke nyekundu kuwa `127`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.three` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(127, 0, 255)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.three')?.backgroundColor === 'rgb(127, 0, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 127, 0);
+}
+
+.two {
+ background-color: rgb(0, 255, 127);
+}
+
+--fcc-editable-region--
+.three {
+ background-color: rgb(255, 0, 255);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bd6ec666b1da2587e4e37.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bd6ec666b1da2587e4e37.md
new file mode 100644
index 00000000000..c540be6daa8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617bd6ec666b1da2587e4e37.md
@@ -0,0 +1,95 @@
+---
+id: 617bd6ec666b1da2587e4e37
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Kuna rangi tatu zaidi za tertiary: chartreuse green (kijani + njano), azure (bluu + cyan), na rose (nyekundu + magenta).
+
+Ili kuunda chartreuse green, sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.one` ili nyekundu iwe `127`, na uweke kijani kuwa thamani ya juu zaidi.
+
+Kwa azure, sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.two` ili kijani kiwe `127` na bluu iwe katika thamani ya juu zaidi.
+
+Na kwa rose, ambayo wakati mwingine huitwa bright pink, sasisha kitendakazi cha `rgb` katika sheria ya CSS ya `.three` ili bluu iwe `127` na nyekundu. iko kwenye thamani ya juu.
+
+# --hints--
+
+Sheria yako ya CSS ya `.one` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(127, 255, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor === 'rgb(127, 255, 0)');
+```
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 127, 255)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 127, 255)');
+```
+
+Sheria yako ya CSS ya `.three` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 0, 127)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.three')?.backgroundColor === 'rgb(255, 0, 127)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.one {
+ background-color: rgb(255, 127, 0);
+}
+
+.two {
+ background-color: rgb(0, 255, 127);
+}
+
+.three {
+ background-color: rgb(127, 0, 255);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a00ed1ca871a2b3aca0cb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a00ed1ca871a2b3aca0cb.md
new file mode 100644
index 00000000000..3aee25f8134
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a00ed1ca871a2b3aca0cb.md
@@ -0,0 +1,91 @@
+---
+id: 618a00ed1ca871a2b3aca0cb
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Kwa kuwa sasa umepitia rangi zote za primary, secondary, na tertiary kwenye gurudumu la rangi, itakuwa rahisi kuelewa dhana nyingine za nadharia ya rangi na jinsi zinavyoathiri muundo.
+
+Kwanza, katika sheria za CSS za `.one`, `.two`, na `.three`, rekebisha thamani katika kitendakazi cha `rgb` ili `background-color` ya kila kipengele iwekwe nyeusi kabisa. Kumbuka kwamba kitendakazi cha `rgb` hutumia modeli ya rangi ya addictive, ambapo rangi huanza kuwa nyeusi na kubadilika kadri thamani za nyekundu, kijani na buluu zinavyoongezeka.
+
+# --hints--
+
+Sheria yako ya CSS ya `.one` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+Sheria yako ya CSS ya `.three` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.three')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.one {
+ background-color: rgb(127, 255, 0);
+}
+
+.two {
+ background-color: rgb(0, 127, 255);
+}
+
+.three {
+ background-color: rgb(255, 0, 127);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a0927005553b74bfa05ae.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a0927005553b74bfa05ae.md
new file mode 100644
index 00000000000..1b62fb0a8c7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a0927005553b74bfa05ae.md
@@ -0,0 +1,87 @@
+---
+id: 618a0927005553b74bfa05ae
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Gurudumu la rangi ni mduara ambapo rangi zinazofanana, au
hues , ziko karibu, na tofauti ziko kando zaidi. Kwa mfano, nyekundu safi ni kati ya hues ya rose na chungwa.
+
+Rangi mbili zilizo kinyume kutoka kwa kila moja kwenye gurudumu la rangi huitwa
complementary colors . Ikiwa rangi mbili za complementary zitaunganishwa, hutoa kijivu. Lakini zinapowekwa kando ya nyingine, rangi hizi hutokeza utofauti mkubwa wa kuona na kuonekana kung’aa.
+
+Katika kitendakazi cha `rgb` kwa sheria ya CSS ya `.one`, weka thamani ya nyekundu hadi juu zaidi `255` ili kutoa nyekundu safi. Katika kitendakazi cha `rgb` kwa sheria ya CSS ya `.two`, weka thamani ya kijani na bluu hadi juu zaidi `255` ili kutoa cyan.
+
+# --hints--
+
+Sheria yako ya CSS ya `.one` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor === 'rgb(255, 0, 0)');
+```
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 255, 255)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 255, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.one {
+ background-color: rgb(0, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 0, 0);
+}
+--fcc-editable-region--
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a0b2befb143baefab632b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a0b2befb143baefab632b.md
new file mode 100644
index 00000000000..e72f54640cf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a0b2befb143baefab632b.md
@@ -0,0 +1,87 @@
+---
+id: 618a0b2befb143baefab632b
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Ona kwamba rangi nyekundu na cyan zinang'aa sana karibu na kila mmoja. Tofauti hii inaweza kusumbua ikiwa inatumika kupita kiasi kwenye tovuti, na inaweza kufanya maandishi kuwa magumu kusomeka ikiwa yamewekwa kwenye mandharinyuma yenye rangi inayosaidiana.
+
+Ni vyema kufanya mazoezi ya kuchagua rangi moja kama rangi kuu na kutumia rangi yake inayosaidiana kama lafudhi ili kuleta usikivu wa maudhui fulani kwenye ukurasa.
+
+Kwanza, katika sheria ya `h1`, tumia kitendakazi cha `rgb` kuweka `background-color` kuwa cyan.
+
+# --hints--
+
+Hupaswi kuondoa au kurekebisha kipengele cha sifa ya `text-align` au thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.textAlign === 'center');
+```
+
+Sheria yako ya CSS ya `h1` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 255, 255)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.backgroundColor === 'rgb(0, 255, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+--fcc-editable-region--
+h1 {
+ text-align: center;
+}
+--fcc-editable-region--
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(255, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 255, 255);
+}
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a1275e873dcc803c2d1aa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a1275e873dcc803c2d1aa.md
new file mode 100644
index 00000000000..ef55bace7e5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a1275e873dcc803c2d1aa.md
@@ -0,0 +1,84 @@
+---
+id: 618a1275e873dcc803c2d1aa
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Kisha, katika cheria ya CSS ya `.one`, tumia kitendakazi cha `rgb` kuweka `background-color` kuwa nyeusi. Na katika sheria ya CSS ya `.two`, tumia kitendakazi cha `rgb` kuweka `background-color` kuwa nyekundu.
+
+# --hints--
+
+Sheria yako ya CSS ya `.one` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.one')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(255, 0, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+ background-color: rgb(0, 255, 255);
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.one {
+ background-color: rgb(255, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 255, 255);
+}
+--fcc-editable-region--
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a132676346ac9f7fd59dd.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a132676346ac9f7fd59dd.md
new file mode 100644
index 00000000000..51cc266725d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a132676346ac9f7fd59dd.md
@@ -0,0 +1,82 @@
+---
+id: 618a132676346ac9f7fd59dd
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Je! umeona jinsi macho yako yanavyovutiwa kwa rangi nyekundu katikati? Wakati wa kuunda tovuti, unaweza kutumia athari hii ili kuvutia vichwa muhimu, vifungo, au viungo.
+
+Kuna michanganyiko mingine kadhaa ya rangi muhimu nje ya rangi zinazosaidiana, lakini utajifunza hizo baadaye.
+
+Kwa sasa, tumia kitendakazi cha `rgb` katika sheria ya CSS ya `.two` ili kuweka `background-color` kuwa nyeusi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.two` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.two')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+ background-color: rgb(0, 255, 255);
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(0, 0, 0);
+}
+
+--fcc-editable-region--
+.two {
+ background-color: rgb(255, 0, 0);
+}
+--fcc-editable-region--
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a16873520a8d088ffdf44.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a16873520a8d088ffdf44.md
new file mode 100644
index 00000000000..4baeee04b88
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a16873520a8d088ffdf44.md
@@ -0,0 +1,79 @@
+---
+id: 618a16873520a8d088ffdf44
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Na katika sheria ya CSS ya `h1`, ondoa sifa ya `background-color` na thamani ili kurudi kwenye rangi nyeupe chaguo-msingi.
+
+# --hints--
+
+Sheria yako ya CSS ya `h1` haipaswi kuwa na sifa au thamani ya `background-color`.
+
+```js
+const backgroundColorInstances = code.match(/background-color:.*;/gi);
+assert(backgroundColorInstances.length === 4 && !new __helpers.CSSHelp(document).getStyle('h1')?.backgroundColor);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+--fcc-editable-region--
+h1 {
+ text-align: center;
+ background-color: rgb(0, 255, 255);
+}
+--fcc-editable-region--
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(0, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 0, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a16d21bd3dad1bb3aa8ef.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a16d21bd3dad1bb3aa8ef.md
new file mode 100644
index 00000000000..2f5ff9a1ec0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/618a16d21bd3dad1bb3aa8ef.md
@@ -0,0 +1,87 @@
+---
+id: 618a16d21bd3dad1bb3aa8ef
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Sasa ni wakati wa kuongeza maelezo mengine kwa alama, kuanzia na ya kwanza.
+
+Katika kipengele cha `div` cha alama ya kwanza, badilisha class `one` hadi `red`.
+
+# --hints--
+
+Alama yako ya kwanza ya `div` haipaswi kuwa na class ya `one`.
+
+```js
+const containerFirstChild = [...document.querySelector('.container')?.children][0];
+assert(!containerFirstChild?.classList?.contains('one'));
+```
+
+Alama yako ya kwanza ya `div` inapaswa kuwa na classes za `marker` na `red`.
+
+```js
+const containerFirstChild = [...document.querySelector('.container')?.children][0];
+assert(containerFirstChild?.classList?.contains('marker') && containerFirstChild?.classList?.contains('red'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+ --fcc-editable-region--
+
+
+
+
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.one {
+ background-color: rgb(0, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 0, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b72a0db211f1c29afb906.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b72a0db211f1c29afb906.md
new file mode 100644
index 00000000000..7c069d894c3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b72a0db211f1c29afb906.md
@@ -0,0 +1,89 @@
+---
+id: 619b72a0db211f1c29afb906
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Sasisha sheria ya CSS ya `.one` ili kulenga class mpya ya `red`.
+
+# --hints--
+
+Msimbo wako haufai tena kuwa na kichaguzi cha class ya `.one`.
+
+```js
+assert(!new __helpers.CSSHelp(document).getStyle('.one'));
+```
+
+Unapaswa kutumia kichaguzi cha class kulenga class ya `red`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.red'));
+```
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.red')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.one {
+ background-color: rgb(0, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 0, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7396e57b771f903be90d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7396e57b771f903be90d.md
new file mode 100644
index 00000000000..43c6de230b6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7396e57b771f903be90d.md
@@ -0,0 +1,77 @@
+---
+id: 619b7396e57b771f903be90d
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Na usasishe kitendakazi cha `rgb` katika sheria ya CSS ya `.red` ili thamani ya nyekundu iwe juu zaidi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(255, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.red')?.backgroundColor === 'rgb(255, 0, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background-color: rgb(0, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 0, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7424f43ec9215e538afe.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7424f43ec9215e538afe.md
new file mode 100644
index 00000000000..74ad7817af0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7424f43ec9215e538afe.md
@@ -0,0 +1,99 @@
+---
+id: 619b7424f43ec9215e538afe
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Kisha, badilisha class ya `two` iwe `green` katika alama ya pili ya `div` na class ya `three` iwe `blue` katika alama ya tatu ya `div`.
+
+# --hints--
+
+`div`ya alama yako ya pili haipaswi kuwa na class ya `two`.
+
+```js
+const containerSecondChild = [...document.querySelector('.container')?.children][1];
+assert(!containerSecondChild?.classList?.contains('two'));
+```
+
+`div` ya alama yako ya pili inapaswa kuwa na classes za `marker` na `green`.
+
+```js
+const containerSecondChild = [...document.querySelector('.container')?.children][1];
+assert(containerSecondChild?.classList?.contains('marker') && containerSecondChild?.classList?.contains('green'));
+```
+
+`div`ya alama yako ya tatu haipaswi kuwa na class ya `three`.
+
+```js
+const containerThirdChild = [...document.querySelector('.container')?.children][2];
+assert(!containerThirdChild?.classList?.contains('three'));
+```
+
+`div` ya alama yako ya tatu inapaswa kuwa na classes za `marker` na `blue`.
+
+```js
+const containerThirdChild = [...document.querySelector('.container')?.children][2];
+assert(containerThirdChild?.classList?.contains('marker') && containerThirdChild?.classList?.contains('blue'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+ --fcc-editable-region--
+
+
+
+
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background-color: rgb(255, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 0, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b74fa777a2b2473c94f82.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b74fa777a2b2473c94f82.md
new file mode 100644
index 00000000000..97a66fa5a35
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b74fa777a2b2473c94f82.md
@@ -0,0 +1,107 @@
+---
+id: 619b74fa777a2b2473c94f82
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Sasisha kichaguzi cha class ya CSS ya `.two` ili kilenge class mpya ya `green`. Na usasishe kichaguzi cha class ya `.three` ili kilenge class mpya ya `blue`.
+
+# --hints--
+
+Msimbo wako haufai tena kuwa na kichaguzi cha class ya `.two`.
+
+```js
+assert(!new __helpers.CSSHelp(document).getStyle('.two'));
+```
+
+Unapaswa kutumia kichaguzi cha class kulenga class ya `green`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.green'));
+```
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.green')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+Msimbo wako haufai tena kuwa na kichaguzi cha class ya `.three`.
+
+```js
+assert(!new __helpers.CSSHelp(document).getStyle('.three'));
+```
+
+Unapaswa kutumia kichaguzi cha class kulenga class ya `blue`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.blue'));
+```
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(0, 0, 0)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.blue')?.backgroundColor === 'rgb(0, 0, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background-color: rgb(255, 0, 0);
+}
+
+.two {
+ background-color: rgb(0, 0, 0);
+}
+
+.three {
+ background-color: rgb(0, 0, 0);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b761916dac02643940022.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b761916dac02643940022.md
new file mode 100644
index 00000000000..8891491301c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b761916dac02643940022.md
@@ -0,0 +1,81 @@
+---
+id: 619b761916dac02643940022
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Njia ya kawaida sana ya kuweka rangi kwenye kipengele kilicho na CSS ni kwa
hexadecimal au thamani za heksi. Ingawa thamani za hex zinakaa kuwa ngumu, kwa kweli ni aina nyingine ya thamani za RGB.
+
+Thamani za rangi za Hex huanza na alama ya `#` na kuchukua nambari sita kutoka 0-9 na A-F. Jozi ya kwanza ya wahusika inawakilisha nyekundu, jozi ya pili inawakilisha kijani, na jozi ya tatu inawakilisha bluu. Kwa mfano, `#4B5320`.
+
+Katika kichaguzi cha class ya `.green`, weka `background-color` kuwa msimbo wa rangi wa hex wenye thamani `00` kwa nyekundu, `FF` kwa kijani, na `00` bluu.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `#00FF00`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.green')?.backgroundColor === 'rgb(0, 255, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background-color: rgb(255, 0, 0);
+}
+
+--fcc-editable-region--
+.green {
+ background-color: rgb(0, 0, 0);
+}
+--fcc-editable-region--
+
+.blue {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7c3c83de403126b69c1e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7c3c83de403126b69c1e.md
new file mode 100644
index 00000000000..c9adf811cf4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7c3c83de403126b69c1e.md
@@ -0,0 +1,85 @@
+---
+id: 619b7c3c83de403126b69c1e
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Huenda tayari unafahamu desimali, au thamani za msingi 10, ambazo huenda kutoka 0 - 9. Hexadecimal, au thamani za msingi 16, huenda kutoka 0 - 9, kisha A - F:
+
+```js
+0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
+```
+
+Kwa rangi za heksi, `00` ni 0% ya rangi hiyo, na `FF` ni 100%. Kwa hivyo `#00FF00` hutafsiri hadi 0% nyekundu, 100% ya kijani, na 0% ya bluu, na ni sawa na `rgb(0, 255, 0)`.
+
+Punguza ukubwa wa kijani kwa kuweka thamani ya kijani ya rangi ya hex kuwa `7F`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `#007F00`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.green')?.backgroundColor === 'rgb(0, 127, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background-color: rgb(255, 0, 0);
+}
+
+--fcc-editable-region--
+.green {
+ background-color: #00FF00;
+}
+--fcc-editable-region--
+
+.blue {
+ background-color: rgb(0, 0, 0);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7fd56aa2253778bcf5f7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7fd56aa2253778bcf5f7.md
new file mode 100644
index 00000000000..255d9543775
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7fd56aa2253778bcf5f7.md
@@ -0,0 +1,87 @@
+---
+id: 619b7fd56aa2253778bcf5f7
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Muundo wa rangi wa
HSL , au hue, saturation, na lightness, ni njia nyingine ya kuwakilisha rangi.
+
+Kitendakazi cha CSS cha hsl hukubali thamani 3: nambari kutoka 0 hadi 360 kwa hue, asilimia kutoka 0 hadi 100 kwa saturation, na asilimia kutoka 0 hadi 100 kwa lightness.
+
+Ikiwa unafikiria gurudumu la rangi, hue nyekundu iko kwenye digrii 0, kijani iko kwenye digrii 120, na bluu iko kwenye digrii 240.
+
+Saturation ni ukubwa wa rangi kutoka 0%, au kijivu, hadi 100% kwa rangi safi. Lazima uongeze alama ya asilimia `%` kwa thamani za saturation na lightness.
+
+Lightness ni jinsi rangi angavu inavyoonekana, kutoka 0%, au nyeusi kamili, hadi 100%, nyeupe kamili, na 50% kuwa upande wowote.
+
+Katika sheria ya `.blue`, tumia kitendakazi cha `hsl` ili kuweka sifa `background-color` kuwa bluu safi. Weka hue iwe `240`, saturation iwe `100%`, na lightness iwe `50%`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `hsl(240, 100%, 50%)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.blue')?.backgroundColor === 'rgb(0, 0, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background-color: rgb(255, 0, 0);
+}
+
+.green {
+ background-color: #007F00;
+}
+
+--fcc-editable-region--
+.blue {
+ background-color: rgb(0, 0, 0);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a489b8579e87364b2d2cdb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a489b8579e87364b2d2cdb.md
new file mode 100644
index 00000000000..213af07e441
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a489b8579e87364b2d2cdb.md
@@ -0,0 +1,83 @@
+---
+id: 61a489b8579e87364b2d2cdb
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Umejifunza njia chache za kuweka rangi bapa katika CSS, lakini pia unaweza kutumia mpito wa rangi, au
gradient , kwenye kipengele.
+
+Gradient ni wakati rangi moja inabadilika kuwa nyingine. Kitendakazi cha CSS cha `linear-gradient` hukuwezesha kudhibiti mwelekeo wa mpito kando ya mstari, na rangi zipi zinatumika.
+
+Jambo moja la kukumbuka ni kwamba kitendakazi cha `linear-gradient` huunda kipengele cha `image`, na kwa kawaida huoanishwa na `background` ambayo inaweza kukubali picha kama thamani.
+
+Katika sheria ya CSS ya `.red`, badilisha sifa ya `background-color` kuwa `background`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` yenye thamani `rgb(255, 0, 0)`.
+
+```js
+assert.match(__helpers.removeWhiteSpace(code), /\.red\{.*?background:rgb\(255,0,0\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background-color: rgb(255, 0, 0);
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a493ead935c148d2b76312.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a493ead935c148d2b76312.md
new file mode 100644
index 00000000000..4b949fb8676
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a493ead935c148d2b76312.md
@@ -0,0 +1,87 @@
+---
+id: 61a493ead935c148d2b76312
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Kitendaji cha `linear-gradient` kinaweza kunyumbulika sana -- hapa kuna sintaksia ya msingi utakayotumia katika somo hili:
+
+```css
+linear-gradient(gradientDirection, color1, color2, ...);
+```
+
+`gradientDirection` ni mwelekeo wa njia inayotumika kwa mpito. `color1` na `color2` ni hoja za rangi, ambazo ndizo rangi zitakazotumika katika mpito wenyewe. Hizi zinaweza kuwa aina yoyote ya rangi, ikijumuisha manenomsingi ya rangi, heksi, `rgb` au `hsl`.
+
+Sasa utaweka upinde rangi nyekundu hadi kijani kibichi kando ya mstari wa digrii 90 kwenye alama ya kwanza.
+
+Kwanza, katika sheria ya CSS ya `.red`, weka sifa ya `background` kuwa `linear-gradient()`, na uipitishe thamani `90deg` kama `gradientDirection`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` yenye thamani `linear-gradient(90deg)`.
+
+```js
+assert.match(__helpers.removeWhiteSpace(code), /\.red\{.*?background:linear-gradient\(90deg\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: rgb(255, 0, 0);
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a498399534644f59cff05e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a498399534644f59cff05e.md
new file mode 100644
index 00000000000..6a85d255692
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a498399534644f59cff05e.md
@@ -0,0 +1,79 @@
+---
+id: 61a498399534644f59cff05e
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Kama unavyoona, kitendakazi cha `linear-gradient` kilitoa upinde rangi nyekundu-kijani laini. Ingawa kitendakazi cha `linear-gradient` kinahitaji uchache wa hoja mbili za rangi ili kufanya kazi, kinaweza kukubali hoja nyingi za rangi.
+
+Tumia kitendakazi cha `rgb` ili kuongeza samawati safi kama hoja ya tatu ya rangi kwenye kitendakazi cha `linear-gradient`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(90deg, rgb(255, 0, 0), rgb(0, 255, 0), rgb(0, 0, 255))`.
+
+```js
+assert.include(['linear-gradient(90deg,rgb(255,0,0),rgb(0,255,0),rgb(0,0,255))', 'rgba(0,0,0,0)linear-gradient(90deg,rgb(255,0,0),rgb(0,255,0),rgb(0,0,255))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(90deg, rgb(255, 0, 0), rgb(0, 255, 0));
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a49d15bdbb5e57cc6fd280.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a49d15bdbb5e57cc6fd280.md
new file mode 100644
index 00000000000..f44ba7656a7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a49d15bdbb5e57cc6fd280.md
@@ -0,0 +1,85 @@
+---
+id: 61a49d15bdbb5e57cc6fd280
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Color-stops hukuruhusu kurekebisha vizuri mahali rangi zimewekwa kando ya mstari wa gradient. Ni kitengo cha urefu kama `px` au asilimia zinazofuata rangi katika kitendakazi cha `linear-gradient`.
+
+Kwa mfano, katika gradient ya red-black, mpito kutoka nyekundu hadi nyeusi hufanyika katika hatua ya 90% kando ya mstari wa gradient, kwa hivyo nyekundu inachukua nafasi kubwa inayopatikana:
+
+```css
+linear-gradient(90deg, red 90%, black);
+```
+
+Katika kipengele cha `linear-gradient`, ongeza color-stop ya `75%` baada ya hoja ya kwanza ya rangi nyekundu. Usiongeze color-stops kwenye hoja za rangi zingine.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(90deg, rgb(255, 0, 0) 75%, rgb(0, 255, 0), rgb(0, 0, 255))`.
+
+```js
+assert.include(['linear-gradient(90deg,rgb(255,0,0)75%,rgb(0,255,0),rgb(0,0,255))', 'rgba(0,0,0,0)linear-gradient(90deg,rgb(255,0,0)75%,rgb(0,255,0),rgb(0,0,255))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(90deg, rgb(255, 0, 0), rgb(0, 255, 0), rgb(0, 0, 255));
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a53c4459446dc134a1c6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a53c4459446dc134a1c6.md
new file mode 100644
index 00000000000..1af99de3166
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a53c4459446dc134a1c6.md
@@ -0,0 +1,79 @@
+---
+id: 61a4a53c4459446dc134a1c6
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Kwa kuwa sasa unajua misingi ya jinsi `linear-gradient` inavyotendakazi na jinsi color-stops hufanya kazi, unaweza kuzitumia kufanya vialamisho kuonekana vya kweli zaidi.
+
+Katika kitendakazi cha `linear-gradient`, weka `gradientDirection` kuwa `180deg`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(180deg, rgb(255, 0, 0) 75%, rgb(0, 255, 0), rgb(0, 0, 255))`.
+
+```js
+assert.include(['linear-gradient(rgb(255,0,0)75%,rgb(0,255,0),rgb(0,0,255))', 'rgba(0,0,0,0)linear-gradient(rgb(255,0,0)75%,rgb(0,255,0),rgb(0,0,255))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(90deg, rgb(255, 0, 0) 75%, rgb(0, 255, 0), rgb(0, 0, 255));
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a6e908bc34725b4c25ac.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a6e908bc34725b4c25ac.md
new file mode 100644
index 00000000000..444a08ab4c6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a6e908bc34725b4c25ac.md
@@ -0,0 +1,77 @@
+---
+id: 61a4a6e908bc34725b4c25ac
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Kisha, weka color-stop ya nyekundu kuwa `0%`, color-stop ya kijani hadi `50%`, na color kwa bluu hadi `100%`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(180deg, rgb(255, 0, 0) 0%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 100%)`.
+
+```js
+assert.include(['linear-gradient(rgb(255,0,0)0%,rgb(0,255,0)50%,rgb(0,0,255)100%)', 'rgba(0,0,0,0)linear-gradient(rgb(255,0,0)0%,rgb(0,255,0)50%,rgb(0,0,255)100%)repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(180deg, rgb(255, 0, 0) 75%, rgb(0, 255, 0), rgb(0, 0, 255));
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a7877da33a73a1c1723e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a7877da33a73a1c1723e.md
new file mode 100644
index 00000000000..40eb04efc1a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4a7877da33a73a1c1723e.md
@@ -0,0 +1,79 @@
+---
+id: 61a4a7877da33a73a1c1723e
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Kwa kuwa sasa color-stops zimewekwa, utatumia vivuli tofauti vya rangi nyekundu kwa kila hoja ya rangi katika kitendakazi cha `linear-gradient`. Vivuli kwenye kingo za juu na chini za kialama zitakuwa nyeusi zaidi, huku zile za katikati zitakuwa nyepesi kana kwamba kuna mwanga juu yake.
+
+Kwa hoja ya kwanza ya rangi, ambayo kwa sasa ni nyekundu kabisa, sasisha kitendakazi cha `rgb` ili thamani ya nyekundu iwe `122`, thamani ya kijani ni `74`, na thamani ya bluu ni `14`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 100%)`.
+
+```js
+assert.include(['linear-gradient(rgb(122,74,14)0%,rgb(0,255,0)50%,rgb(0,0,255)100%)', 'rgba(0,0,0,0)linear-gradient(rgb(122,74,14)0%,rgb(0,255,0)50%,rgb(0,0,255)100%)repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(180deg, rgb(255, 0, 0) 0%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 100%);
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ac092eb21e7dbfe61c33.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ac092eb21e7dbfe61c33.md
new file mode 100644
index 00000000000..b38be58b44b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ac092eb21e7dbfe61c33.md
@@ -0,0 +1,79 @@
+---
+id: 61a4ac092eb21e7dbfe61c33
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Sasa rekebisha hoja ya pili ya rangi katika kitendakazi cha `linear-gradient`, ambayo kwa sasa ni ya kijani kibichi.
+
+Sasisha `rgb` ili thamani ya nyekundu iwe `245`, thamani ya kijani ni `62`, na thamani ya bluu ni `113`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(245, 62, 113) 50%, rgb(0, 0, 255) 100%)`.
+
+```js
+assert.include(['linear-gradient(rgb(122,74,14)0%,rgb(245,62,113)50%,rgb(0,0,255)100%)', 'rgba(0,0,0,0)linear-gradient(rgb(122,74,14)0%,rgb(245,62,113)50%,rgb(0,0,255)100%)repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 100%);
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4acbb5587197f68544d00.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4acbb5587197f68544d00.md
new file mode 100644
index 00000000000..27cedf78b77
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4acbb5587197f68544d00.md
@@ -0,0 +1,79 @@
+---
+id: 61a4acbb5587197f68544d00
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Sasa rekebisha hoja ya tatu ya rangi katika kitendakazi cha `linear-gradient`, ambayo kwa sasa ni ya bluu safi.
+
+Sasisha `rgb` ili thamani ya nyekundu iwe `162`, thamani ya kijani ni `27`, na thamani ya bluu ni `27`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(245, 62, 113) 50%, rgb(162, 27, 27) 100%)`.
+
+```js
+assert.include(['linear-gradient(rgb(122,74,14)0%,rgb(245,62,113)50%,rgb(162,27,27)100%)', 'rgba(0,0,0,0)linear-gradient(rgb(122,74,14)0%,rgb(245,62,113)50%,rgb(162,27,27)100%)repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(245, 62, 113) 50%, rgb(0, 0, 255) 100%);
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ada3aabeec822b2975d9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ada3aabeec822b2975d9.md
new file mode 100644
index 00000000000..d8ec15f4a29
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ada3aabeec822b2975d9.md
@@ -0,0 +1,79 @@
+---
+id: 61a4ada3aabeec822b2975d9
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Alama nyekundu inaonekana ya kweli zaidi. Sasa utafanya vivyo hivyo kwa alama ya kijani kibichi, kwa kutumia mchanganyiko wa kitendakazi cha `linear-gradient` na rangi za heksi.
+
+Katika sheria ya CSS ya `.green`, badilisha sifa ya `background-color` kuwa `background`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya `background` yenye thamani `#007F00`.
+
+```js
+assert.match(__helpers.removeWhiteSpace(code), /\.green\{.*?background:#007F00/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(245, 62, 113) 50%, rgb(162, 27, 27) 100%);
+}
+
+--fcc-editable-region--
+.green {
+ background-color: #007F00;
+}
+--fcc-editable-region--
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ae5f29eb5584187201c3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ae5f29eb5584187201c3.md
new file mode 100644
index 00000000000..67014a53abc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a4ae5f29eb5584187201c3.md
@@ -0,0 +1,79 @@
+---
+id: 61a4ae5f29eb5584187201c3
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Kwa alama hii, utatumia misimbo ya rangi ya heksi kwa gradient yako.
+
+Tumia kitendakazi cha `linear-gradient` na uweke `gradientDirection` hadi `180deg`. Na kwa hoja ya kwanza ya rangi, tumia msimbo wa rangi wa hex wenye thamani `55` kwa nyekundu, `68` kwa kijani, na `0D` kwa bluu.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya `background` yenye thamani `linear-gradient(180deg, #55680D)`.
+
+```js
+assert.match(__helpers.removeWhiteSpace(code), /\.green\{.*?background:linear-gradient\(180deg,#55680D\)/i);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(245, 62, 113) 50%, rgb(162, 27, 27) 100%);
+}
+
+--fcc-editable-region--
+.green {
+ background: #007F00;
+}
+--fcc-editable-region--
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5be9833e7dc178de2af10.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5be9833e7dc178de2af10.md
new file mode 100644
index 00000000000..67ea042c8d7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5be9833e7dc178de2af10.md
@@ -0,0 +1,79 @@
+---
+id: 61a5be9833e7dc178de2af10
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Hiyo inaonekana bora zaidi, lakini ukingo wa chini wa alama ya kijani kibichi unahitaji kuwa nyeusi ili kuongeza mwelekeo zaidi.
+
+Katika kitendakazi sawa cha `linear-gradient`, ongeza msimbo wa rangi wa hex wenye thamani `11` ya nyekundu, `6C` ya kijani, na `31` kwa bluu kama hoja ya tatu ya rangi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya `background` yenye thamani `linear-gradient(180deg, #55680D, #71F53E, #116C31)`.
+
+```js
+assert.include(['linear-gradient(rgb(85,104,13),rgb(113,245,62),rgb(17,108,49))', 'rgba(0,0,0,0)linear-gradient(rgb(85,104,13),rgb(113,245,62),rgb(17,108,49))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.green')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(245, 62, 113) 50%, rgb(162, 27, 27) 100%);
+}
+
+--fcc-editable-region--
+.green {
+ background: linear-gradient(180deg, #55680D, #71F53E);
+}
+--fcc-editable-region--
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5bfe091060f1d6a629dd0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5bfe091060f1d6a629dd0.md
new file mode 100644
index 00000000000..79446aba00a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5bfe091060f1d6a629dd0.md
@@ -0,0 +1,81 @@
+---
+id: 61a5bfe091060f1d6a629dd0
+title: Hatua ya 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+Hata bila color-stops, unaweza kuwa umegundua kuwa rangi za mpito wa alama ya kijani katika sehemu sawa na za alama nyekundu. Rangi ya kwanza iko mwanzoni (0%), ya pili iko katikati (50%), na ya mwisho iko mwishoni (100%) wa mstari wa gradient.
+
+Kitendakazi cha `linear-gradient` hukukokotea thamani hizi kiotomatiki, na huweka rangi sawasawa kwenye mstari wa gradient kwa chaguomsingi.
+
+Katika sheria za CSS za `.red`, ondoa vituo vitatu vya rangi kutoka kwa kitendakazi cha `linear-gradient` ili kusafisha msimbo wako kidogo.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(180deg, rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27))`.
+
+```js
+assert.include(['linear-gradient(rgb(122,74,14),rgb(245,62,113),rgb(162,27,27))', 'rgba(0,0,0,0)linear-gradient(rgb(122,74,14),rgb(245,62,113),rgb(162,27,27))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(245, 62, 113) 50%, rgb(162, 27, 27) 100%);
+}
+--fcc-editable-region--
+
+.green {
+ background: linear-gradient(180deg, #55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5c906ab73313316e342f0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5c906ab73313316e342f0.md
new file mode 100644
index 00000000000..c1f18603ab0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5c906ab73313316e342f0.md
@@ -0,0 +1,91 @@
+---
+id: 61a5c906ab73313316e342f0
+title: Hatua ya 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Ikiwa hakuna hoja ya `gradientDirection` ambayo imetolewa kwa kitendakazi cha `linear-gradient`, inapaswa kupanga rangi kutoka juu hadi chini, au pamoja na mstari wa digrii 180, kwa chaguo-msingi.
+
+Safisha msimbo wako zaidi kidogo kwa kuondoa hoja ya `gradientDirection` kutoka kwa vitendaji vyote viwili vya `linear-gradient`.
+
+# --hints--
+
+Unapaswa kuondoa hoja za `gradientDirection` kutoka kwa vitendakazi vya `linear-gradient` katika sheria zako za CSS za `.red` na `.green`.
+
+```js
+assert(!code.match(/linear-gradient\s*\(\s*180deg/gi));
+```
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27))`.
+
+```js
+assert.include(['linear-gradient(rgb(122,74,14),rgb(245,62,113),rgb(162,27,27))', 'rgba(0,0,0,0)linear-gradient(rgb(122,74,14),rgb(245,62,113),rgb(162,27,27))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya `background` yenye thamani `linear-gradient(#55680D, #71F53E, #116C31)`.
+
+```js
+assert.include(['linear-gradient(rgb(85,104,13),rgb(113,245,62),rgb(17,108,49))', 'rgba(0,0,0,0)linear-gradient(rgb(85,104,13),rgb(113,245,62),rgb(17,108,49))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.green')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(180deg, rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(180deg, #55680D, #71F53E, #116C31);
+}
+--fcc-editable-region--
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5ca57f50ded36d33eef96.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5ca57f50ded36d33eef96.md
new file mode 100644
index 00000000000..2f9f9212904
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5ca57f50ded36d33eef96.md
@@ -0,0 +1,79 @@
+---
+id: 61a5ca57f50ded36d33eef96
+title: Hatua ya 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Sasa utaweka upinde rangi kwenye kialama cha bluu, wakati huu ukitumia kitendakazi cha `hsl` kama hoja za rangi.
+
+Katika sheria ya CSS ya `.blue`, badilisha sifa ya `background-color` kuwa `background`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya `background` yenye thamani `hsl(240, 100%, 50%)`.
+
+```js
+assert.match(__helpers.removeWhiteSpace(code), /\.blue\{.*?background:hsl\(240,100%,50%\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+--fcc-editable-region--
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d594b887335228ee6533.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d594b887335228ee6533.md
new file mode 100644
index 00000000000..b71c4c29f33
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d594b887335228ee6533.md
@@ -0,0 +1,77 @@
+---
+id: 61a5d594b887335228ee6533
+title: Hatua ya 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Tumia kitendakazi cha `linear-gradient`, na katika kitendakazi cha `hsl` weka thamani za `186` kwa hue, `76%` kwa kueneza, na `16%` kwa wepesi kama hoja ya kwanza ya rangi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya `background` yenye thamani `linear-gradient(hsl(186, 76%, 16%))`.
+
+```js
+assert.match(__helpers.removeWhiteSpace(code), /\.blue\{.*?background:linear-gradient\(hsl\(186,76%,16%\)\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+--fcc-editable-region--
+.blue {
+ background: hsl(240, 100%, 50%);
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d6701ee08953ca375243.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d6701ee08953ca375243.md
new file mode 100644
index 00000000000..f7e16afc30a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d6701ee08953ca375243.md
@@ -0,0 +1,77 @@
+---
+id: 61a5d6701ee08953ca375243
+title: Hatua ya 68
+challengeType: 0
+dashedName: step-68
+---
+
+# --description--
+
+Na kama hoja ya pili ya rangi, katika kitendakazi cha `hsl` weka thamani za `223` kwa hue, `90%` kwa kueneza, na `60%` kwa wepesi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%))`.
+
+```js
+assert.include(['linear-gradient(rgb(10,66,72),rgb(61,113,245))', 'rgba(0,0,0,0)linear-gradient(rgb(10,66,72),rgb(61,113,245))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.blue')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+--fcc-editable-region--
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%));
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d79c858bef560e26c685.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d79c858bef560e26c685.md
new file mode 100644
index 00000000000..3e588be581d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d79c858bef560e26c685.md
@@ -0,0 +1,77 @@
+---
+id: 61a5d79c858bef560e26c685
+title: Hatua ya 69
+challengeType: 0
+dashedName: step-69
+---
+
+# --description--
+
+Na kama hoja ya tatu ya rangi, katika kitendakazi cha `hsl` weka thamani `240` za hue, `56%` za kueneza, na `42%` kwa wepesi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%))`.
+
+```js
+assert.include(['linear-gradient(rgb(10,66,72),rgb(61,113,245),rgb(47,47,167))', 'rgba(0,0,0,0)linear-gradient(rgb(10,66,72),rgb(61,113,245),rgb(47,47,167))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.blue')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+--fcc-editable-region--
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%));
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d7ef1cfcf45764df07a2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d7ef1cfcf45764df07a2.md
new file mode 100644
index 00000000000..c9154b3cfcf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61a5d7ef1cfcf45764df07a2.md
@@ -0,0 +1,87 @@
+---
+id: 61a5d7ef1cfcf45764df07a2
+title: Hatua ya 70
+challengeType: 0
+dashedName: step-70
+---
+
+# --description--
+
+Sasa kwa kuwa alama zina rangi sahihi, ni wakati wa kujenga sleeves za alama. Anza na alama nyekundu.
+
+Ndani ya kipengee cha alama nyekundu cha `div`, unda kipengele kipya cha `div` na ukipe class ya `sleeve`.
+
+# --hints--
+
+Kipengele chako kipya cha `div` kinafaa kuwa ndani ya kipengee cha `div` cha alama nyekundu.
+
+```js
+const redMarkerChildren = [...document.querySelector('.red')?.children];
+assert(redMarkerChildren.every(child => child?.localName === 'div') && redMarkerChildren.length === 1);
+```
+
+Kipengele chako kipya cha `div` kinapaswa kuwa na class ya `sleeve`.
+
+```js
+const redMarkerChild = [...document.querySelector('.red')?.children][0];
+assert(redMarkerChild?.classList?.contains('sleeve'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+ --fcc-editable-region--
+
+
+ --fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61adc60b69cd4b87739d2174.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61adc60b69cd4b87739d2174.md
new file mode 100644
index 00000000000..fe72c7b6ed3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61adc60b69cd4b87739d2174.md
@@ -0,0 +1,92 @@
+---
+id: 61adc60b69cd4b87739d2174
+title: Hatua ya 71
+challengeType: 0
+dashedName: step-71
+---
+
+# --description--
+
+Unda sheria mpya ya CSS inayolenga class ya `sleeve`. Weka sifa ya `width` kuwa `110px` na sifa ya `height` kuwa `25px`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha class kulenga class ya `sleeve`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve'));
+```
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya `width` iliyowekwa kuwa `110px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.width === '110px');
+```
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya `height` iliyowekwa kuwa `25px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.height === '25px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61adc91467b5d59328b9f781.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61adc91467b5d59328b9f781.md
new file mode 100644
index 00000000000..b90976a9c84
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61adc91467b5d59328b9f781.md
@@ -0,0 +1,98 @@
+---
+id: 61adc91467b5d59328b9f781
+title: Hatua ya 79
+challengeType: 0
+dashedName: step-79
+---
+
+# --description--
+
+Katika mradi uliopita, ulijifunza kidogo kuhusu mipaka na sifa ya `border-color`.
+
+Vipengele vyote vya HTML vina mipaka, ingawa kwa kawaida huwekwa kuwa `none` kwa chaguo-msingi. Ukiwa na CSS, unaweza kudhibiti vipengele vyote vya mpaka wa kipengele na kuweka mpaka pande zote, au upande mmoja tu kwa wakati mmoja. Ili mpaka uonekane, unahitaji kuweka upana wake na mtindo.
+
+Katika sheria ya CSS ya `.sleeve`, ongeza `border-left-width` yenye thamani ya `10px`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya `border-left-width` yenye thamani ya `10px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.borderLeftWidth === '10px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+}
+--fcc-editable-region--
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61add79e739a5faee9d96080.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61add79e739a5faee9d96080.md
new file mode 100644
index 00000000000..2ec2c8be227
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61add79e739a5faee9d96080.md
@@ -0,0 +1,97 @@
+---
+id: 61add79e739a5faee9d96080
+title: Hatua ya 80
+challengeType: 0
+dashedName: step-80
+---
+
+# --description--
+
+Mipaka ina mitindo kadhaa ya kuchagua. Unaweza kufanya mpaka wako kuwa mstari dhabiti, lakini pia unaweza kutumia laini iliyokatika au yenye vitone ukipenda. Mistari thabiti ya mpaka ndiyo inayojulikana zaidi.
+
+Katika sheria ya CSS ya `.sleeve`, ongeza `border-left-style` yenye thamani ya `solid`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya `border-left-style` yenye thamani ya `solid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.borderLeftStyle === 'solid');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left-width: 10px;
+}
+--fcc-editable-region--
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61add929e41980b1edbdba7e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61add929e41980b1edbdba7e.md
new file mode 100644
index 00000000000..f433504d61e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61add929e41980b1edbdba7e.md
@@ -0,0 +1,100 @@
+---
+id: 61add929e41980b1edbdba7e
+title: Hatua ya 81
+challengeType: 0
+dashedName: step-81
+---
+
+# --description--
+
+Mpaka wako unapaswa kuonekana sasa. Ikiwa hakuna rangi iliyowekwa, nyeusi hutumiwa kwa chaguo-msingi.
+
+Lakini ili kufanya code yako isomeke kwa urahisi, ni bora kuweka rangi ya mpaka kwa uwazi.
+
+Katika sheria ya CSS ya `.sleeve`, ongeza `border-left-color` yenye thamani ya `black`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya `border-left-color` yenye thamani ya `black`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.borderLeftColor === 'black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left-width: 10px;
+ border-left-style: solid;
+}
+--fcc-editable-region--
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61addaf7e83988b59a7d18ff.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61addaf7e83988b59a7d18ff.md
new file mode 100644
index 00000000000..56beba85680
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61addaf7e83988b59a7d18ff.md
@@ -0,0 +1,123 @@
+---
+id: 61addaf7e83988b59a7d18ff
+title: Hatua ya 82
+challengeType: 0
+dashedName: step-82
+---
+
+# --description--
+
+Sifa ya `border-left` hukuwezesha kuweka upana, mtindo na rangi ya mpaka wa kushoto kwa wakati mmoja.
+
+Hapa kuna sintaksia:
+
+```css
+border-left: width style color;
+```
+
+Katika sheria ya CSS ya `.sleeve`, badilisha sifa za `border-left-width`, `border-left-style` na `border-left-color` na sifa ya mkato ya `border-left`. Thamani za upana, mtindo, na rangi ya mpaka wa kushoto zinapaswa kuwa sawa.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` haipaswi kuwa na sifa na thamani ya `border-left-width`.
+
+```js
+assert(!/border-left-width/g.test(code));
+```
+
+Sheria yako ya CSS ya `.sleeve` haipaswi kuwa na sifa na thamani ya `border-left-style`.
+
+```js
+assert(!/border-left-style/g.test(code));
+```
+
+Sheria yako ya CSS ya `.sleeve` haipaswi kuwa na sifa na thamani ya `border-left-color`.
+
+```js
+assert(!/border-left-color/g.test(code));
+```
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya mkato ya `border-left` yenye thamani ya `10px solid black`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.sleeve')?.borderLeft, '10px solid black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left-width: 10px;
+ border-left-style: solid;
+ border-left-color: black;
+}
+--fcc-editable-region--
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61ade49b2dad60c076cbd32d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61ade49b2dad60c076cbd32d.md
new file mode 100644
index 00000000000..f57bb6e55d1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61ade49b2dad60c076cbd32d.md
@@ -0,0 +1,97 @@
+---
+id: 61ade49b2dad60c076cbd32d
+title: Hatua ya 83
+challengeType: 0
+dashedName: step-83
+---
+
+# --description--
+
+Alama yako inaonekana vizuri. Lakini ili kuifanya ionekane kuwa ya kweli zaidi, unaweza kubadilisha mtindo wa mpaka kwa mipaka thabiti mara mbili.
+
+Kwa sifa ya mkato ya `border-left`, badilisha thamani ya mtindo wa mpaka kutoka `solid` hadi `double`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya mkato ya `border-left` yenye thamani ya `10px double black`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.borderLeft === '10px double black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px solid black;
+}
+--fcc-editable-region--
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b092eb9e7fc020b43b1bb2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b092eb9e7fc020b43b1bb2.md
new file mode 100644
index 00000000000..c3cc4d28a44
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b092eb9e7fc020b43b1bb2.md
@@ -0,0 +1,85 @@
+---
+id: 61b092eb9e7fc020b43b1bb2
+title: Hatua ya 72
+challengeType: 0
+dashedName: step-72
+---
+
+# --description--
+
+Ili kufanya alama iwe ya kweli zaidi, toa sleeve rangi nyeupe ya uwazi.
+
+Kwanza, weka `background-color` kwa kipengele cha sleeve kuwa `white`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `white`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.backgroundColor === 'white');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+}
+--fcc-editable-region--
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093179e7fc020b43b1bb3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093179e7fc020b43b1bb3.md
new file mode 100644
index 00000000000..ddc5b089335
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093179e7fc020b43b1bb3.md
@@ -0,0 +1,88 @@
+---
+id: 61b093179e7fc020b43b1bb3
+title: Hatua ya 73
+challengeType: 0
+dashedName: step-73
+---
+
+# --description--
+
+
Opacity inaeleza jinsi kitu kilivyo giza, au kisicho wazi. Kwa mfano, ukuta imara ni opaque, na hakuna mwanga unaweza kupita. Lakini glasi ya kunywa ni ya uwazi zaidi, na unaweza kuona kupitia glasi hadi upande mwingine.
+
+Ukiwa na sifa ya CSS ya `opacity`, unaweza kudhibiti jinsi kipengele kilivyo giza au uwazi. Kwa thamani `0`, au 0%, kipengele kitakuwa wazi kabisa, na kwa `1.0`, au 100%, kipengele kitakuwa opaque kama kilivyo kwa chaguomsingi.
+
+Katika sheria ya CSS ya `.sleeve`, ongeza `opacity` yenye thamani ya `0.5`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya `opacity` iliyowekwa kuwa `0.5`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.opacity === '0.5');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: white;
+}
+--fcc-editable-region--
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093219e7fc020b43b1bb4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093219e7fc020b43b1bb4.md
new file mode 100644
index 00000000000..175c5bdd659
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093219e7fc020b43b1bb4.md
@@ -0,0 +1,89 @@
+---
+id: 61b093219e7fc020b43b1bb4
+title: Hatua ya 74
+challengeType: 0
+dashedName: step-74
+---
+
+# --description--
+
+Njia nyingine ya kuweka uwazi wa kipengele ni kwa
alpha channel . Sawa na kipengele cha `opacity`, chaneli ya alpha hudhibiti jinsi rangi ilivyo uwazi au isiyo wazi.
+
+Tayari umeweka uwazi wa sleeve na rangi iliyotajwa na kipengele cha `opacity`, lakini unaweza kuongeza kituo cha alfa kwenye sifa nyingine za rangi za CSS.
+
+Ndani ya sheria ya `.sleeve`, ondoa sifa na thamani ya `opacity`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` haipaswi kuwa na sifa na thamani ya `opacity`.
+
+```js
+assert(!new __helpers.CSSHelp(document).getStyle('.sleeve')?.opacity);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: white;
+ opacity: 0.5;
+}
+--fcc-editable-region--
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093329e7fc020b43b1bb5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093329e7fc020b43b1bb5.md
new file mode 100644
index 00000000000..23fc460be4d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093329e7fc020b43b1bb5.md
@@ -0,0 +1,94 @@
+---
+id: 61b093329e7fc020b43b1bb5
+title: Hatua ya 75
+challengeType: 0
+dashedName: step-75
+---
+
+# --description--
+
+Tayari una uzoefu wa kutumia kitendakazi cha `rgb` kuweka rangi. Ili kuongeza kituo cha alpha kwenye rangi ya `rgb`, tumia kitendakazi cha `rgba` badala yake.
+
+Kitendakazi cha `rgba` hufanya kazi kama kitendakazi cha `rgb`, lakini huchukua nambari moja zaidi kutoka `0` hadi `1.0` kwa kituo cha alpha:
+
+```css
+rgba(redValue, greenValue, blueValue, alphaValue);
+```
+
+Unaweza pia kutumia kituo cha alpha chenye rangi za `hsl` na `hex`. Utaona jinsi ya kufanya hivyo hivi karibuni.
+
+Katika sheria ya `.sleeve`, tumia kitendakazi cha `rgba` ili kuweka `background-color` kuwa nyeupe kabisa yenye opacity ya 50%.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgba(255, 255, 255, 0.5)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.backgroundColor === 'rgba(255, 255, 255, 0.5)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: white;
+}
+--fcc-editable-region--
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093429e7fc020b43b1bb6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093429e7fc020b43b1bb6.md
new file mode 100644
index 00000000000..a866e3296ef
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b093429e7fc020b43b1bb6.md
@@ -0,0 +1,103 @@
+---
+id: 61b093429e7fc020b43b1bb6
+title: Hatua ya 76
+challengeType: 0
+dashedName: step-76
+---
+
+# --description--
+
+Sleeve yako inaonekana vizuri, lakini ingeonekana bora zaidi ikiwa ingewekwa zaidi upande wa kulia wa kialamisho. Njia moja ya kufanya hivyo ni kuongeza kipengee kingine kabla ya sleeve ili kuisukuma kulia.
+
+Ongeza `div` mpya yenye class ya `cap` kabla ya `div` ya kipengee cha sleeve.
+
+# --hints--
+
+Kipengele chako kipya cha `div` kinafaa kuwa ndani ya kipengee cha `div` cha alama nyekundu.
+
+```js
+const redMarkerChildren = [...document.querySelector('div.red')?.children];
+assert(redMarkerChildren.every(child => child?.localName === 'div') && redMarkerChildren.length === 2);
+```
+
+Kipengele chako kipya cha `div` kinapaswa kuwa na class ya `cap`.
+
+```js
+const redMarkerChildren = [...document.querySelector('div.red')?.children];
+assert(redMarkerChildren.some(child => child?.classList?.contains('cap')));
+```
+
+`div` ya cap yako inapaswa kuwa kabla ya `div` ya sleeve.
+
+```js
+const redMarkerChildren = [...document.querySelector('div.red')?.children];
+const cap = document.querySelector('div.cap');
+const sleeve = document.querySelector('div.sleeve');
+assert(redMarkerChildren.indexOf(cap) < redMarkerChildren.indexOf(sleeve));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0934c9e7fc020b43b1bb7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0934c9e7fc020b43b1bb7.md
new file mode 100644
index 00000000000..2e317c5cbe0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0934c9e7fc020b43b1bb7.md
@@ -0,0 +1,99 @@
+---
+id: 61b0934c9e7fc020b43b1bb7
+title: Hatua ya 77
+challengeType: 0
+dashedName: step-77
+---
+
+# --description--
+
+Unda sheria mpya ya CSS inayolenga class ya `cap`. Katika sheria mpya, weka sifa ya `width` kuwa `60px`, na `height` kuwa `25px`.
+
+# --hints--
+
+Unapaswa kutumia kiteuzi cha class kulenga class ya `cap`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.cap'));
+```
+
+Sheria yako ya CSS ya `.cap` inapaswa kuwa na sifa ya `width` iliyowekwa kuwa `60px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.cap')?.width === '60px');
+```
+
+Sheria yako ya CSS ya `.cap` inapaswa kuwa na sifa ya `height` iliyowekwa kuwa `25px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.cap')?.height === '25px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0936d9e7fc020b43b1bb8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0936d9e7fc020b43b1bb8.md
new file mode 100644
index 00000000000..00a8b3dcd5d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0936d9e7fc020b43b1bb8.md
@@ -0,0 +1,104 @@
+---
+id: 61b0936d9e7fc020b43b1bb8
+title: Hatua ya 78
+challengeType: 0
+dashedName: step-78
+---
+
+# --description--
+
+Inaonekana sleeve yako imepotea, lakini usijali -- bado ipo. Kilichotokea ni kwamba `div` ya cap yako mpya inachukua upana mzima wa alama, na inasukuma sleeve chini hadi mstari unaofuata.
+
+Hii ni kwa sababu sifa chaguomsingi ya `display` ya vipengele vya `div` ni `block`. Kwa hivyo vipengele viwili vya `block` vikiwa karibu na vingine, vinajipanga kama vizuizi halisi. Kwa mfano, vipengele vyako vya kialamishi vyote vimepangwa juu ya vingine.
+
+Ili kuweka vipengele viwili vya `div` kwenye mstari mmoja, weka sifa zao za `display` kuwa `inline-block`.
+
+Unda sheria mpya ili kulenga classes za `cap` na `sleeve`, na uweke `display` kuwa `inline-block`.
+
+# --hints--
+
+Unapaswa kutumia kiteuzi cha class kulenga classes za `cap` na `sleeve`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.cap, .sleeve') || new __helpers.CSSHelp(document).getStyle('.sleeve, .cap'));
+```
+
+Sheria yako ya CSS inapaswa kuwa na sifa ya `display` iliyowekwa kuwa `inline-block`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.cap, .sleeve')?.display === 'inline-block' || new __helpers.CSSHelp(document).getStyle('.sleeve, .cap')?.display === 'inline-block');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095989e7fc020b43b1bb9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095989e7fc020b43b1bb9.md
new file mode 100644
index 00000000000..6066ba8e5cf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095989e7fc020b43b1bb9.md
@@ -0,0 +1,79 @@
+---
+id: 61b095989e7fc020b43b1bb9
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Utatumia kitendakazi cha `rgb` kwa rangi za gradient hii.
+
+Katika kitendakazi cha `linear-gradient`, tumia kitendakazi cha `rgb` ili kuweka hoja ya kwanza ya rangi kuwa nyekundu kabisa.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` yenye thamani `linear-gradient(90deg, rgb(255, 0, 0))`.
+
+```js
+assert.match(__helpers.removeWhiteSpace(code), /\.red\{.*?background:linear-gradient\(90deg,rgb\(255,0,0\)\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(90deg);
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095a79e7fc020b43b1bba.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095a79e7fc020b43b1bba.md
new file mode 100644
index 00000000000..719b70df3e6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095a79e7fc020b43b1bba.md
@@ -0,0 +1,79 @@
+---
+id: 61b095a79e7fc020b43b1bba
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Bado hutaona gradient kwa sababu kitendakazi cha `linear-gradient` kinahitaji angalau hoja mbili za rangi ili kufanya kazi.
+
+Katika kitendakazi sawa cha `linear-gradient`, tumia kitendakazi cha `rgb` ili kuweka hoja ya pili ya rangi kuwa kijani kibichi.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya `background` iliyowekwa kuwa `linear-gradient(90deg, rgb(255, 0, 0), rgb(0, 255, 0))`.
+
+```js
+assert.include(['linear-gradient(90deg,rgb(255,0,0),rgb(0,255,0))', 'rgba(0,0,0,0)linear-gradient(90deg,rgb(255,0,0),rgb(0,255,0))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.red')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(90deg, rgb(255, 0, 0));
+}
+--fcc-editable-region--
+
+.green {
+ background-color: #007F00;
+}
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095c79e7fc020b43b1bbb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095c79e7fc020b43b1bbb.md
new file mode 100644
index 00000000000..428b14fb1d6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b095c79e7fc020b43b1bbb.md
@@ -0,0 +1,77 @@
+---
+id: 61b095c79e7fc020b43b1bbb
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Na kwa hoja ya pili ya rangi, tumia msimbo wa rangi wa hex yenye thamani `71` kwa nyekundu, `F5` kwa kijani, na `3E` kwa bluu.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya `background` yenye thamani `linear-gradient(180deg, #55680D, #71F53E)`.
+
+```js
+assert.include(['linear-gradient(rgb(85,104,13),rgb(113,245,62))', 'rgba(0,0,0,0)linear-gradient(rgb(85,104,13),rgb(113,245,62))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.green')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.red {
+ background: linear-gradient(180deg, rgb(122, 74, 14) 0%, rgb(245, 62, 113) 50%, rgb(162, 27, 27) 100%);
+}
+
+--fcc-editable-region--
+.green {
+ background: linear-gradient(180deg, #55680D);
+}
+--fcc-editable-region--
+
+.blue {
+ background-color: hsl(240, 100%, 50%);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b09f739aa6572d2064f9b8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b09f739aa6572d2064f9b8.md
new file mode 100644
index 00000000000..5f9a6136f82
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b09f739aa6572d2064f9b8.md
@@ -0,0 +1,97 @@
+---
+id: 61b09f739aa6572d2064f9b8
+title: Hatua ya 84
+challengeType: 0
+dashedName: step-84
+---
+
+# --description--
+
+Rangi nyeusi ya mpaka wako inaonekana kali sana dhidi ya sleeve. Unaweza kutumia kituo cha alfa kupunguza uwazi wa mpaka mweusi.
+
+Kwa sifa ya mkato ya `border-left`, tumia kitendakazi cha `rgba` ili kuweka thamani ya rangi kuwa nyeusi tupu yenye uwazi wa 75%.
+
+# --hints--
+
+Sheria yako ya CSS ya `.sleeve` inapaswa kuwa na sifa ya mkato ya `border-left` yenye thamani ya `10px double rgba(0, 0, 0, 0.75)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.sleeve')?.borderLeft === '10px double rgba(0, 0, 0, 0.75)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+--fcc-editable-region--
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double black;
+}
+--fcc-editable-region--
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a1b2af494934b7ec1a72.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a1b2af494934b7ec1a72.md
new file mode 100644
index 00000000000..8976d3cf005
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a1b2af494934b7ec1a72.md
@@ -0,0 +1,123 @@
+---
+id: 61b0a1b2af494934b7ec1a72
+title: Hatua ya 85
+challengeType: 0
+dashedName: step-85
+---
+
+# --description--
+
+Inafaa. Alama yako nyekundu inaonekana vizuri. Sasa unachohitaji kufanya ni kuongeza caps na sleeves kwenye vialamisho vyako vingine.
+
+Ongeza cap na sleeve kwa alama za kijani na bluu. Unaweza kunakili tu vipengee vya `div` kutoka kwa alama nyekundu na kuvibandika kwenye vialama vingine viwili.
+
+# --hints--
+
+Alama yako ya kijani `div` inapaswa kuwa na vipengele viwili vya `div`.
+
+```js
+const greenMarkerChildren = [...document.querySelector('.green')?.children];
+assert(greenMarkerChildren.every(child => child?.localName === 'div') && greenMarkerChildren.length === 2);
+```
+
+Kipengele cha alama ya cap ya kijani kibichi cha `div` kinapaswa kuwa kabla ya kipengee cha sleeve `div`.
+
+```js
+const greenMarkerChildren = [...document.querySelector('.green')?.children];
+const greenMarkerCap = document.querySelector('.green .cap');
+const greenMarkerSleeve = document.querySelector('.green .sleeve');
+assert(greenMarkerChildren.indexOf(greenMarkerCap) < greenMarkerChildren.indexOf(greenMarkerSleeve));
+```
+
+Alama yako ya bluu `div` inapaswa kuwa na vipengele viwili vya `div`.
+
+```js
+const blueMarkerChildren = [...document.querySelector('.blue')?.children];
+assert(blueMarkerChildren.every(child => child?.localName === 'div') && blueMarkerChildren.length === 2);
+```
+
+Kipengele cha alama ya bluu chako cha `div` kinapaswa kuwa kabla ya kipengee cha sleeve `div`.
+
+```js
+const blueMarkerChildren = [...document.querySelector('.blue')?.children];
+const blueMarkerCap = document.querySelector('.blue .cap');
+const blueMarkerSleeve = document.querySelector('.blue .sleeve');
+assert(blueMarkerChildren.indexOf(blueMarkerCap) < blueMarkerChildren.indexOf(blueMarkerSleeve));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+ --fcc-editable-region--
+
+
+
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a44a6b865738ba49b9fb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a44a6b865738ba49b9fb.md
new file mode 100644
index 00000000000..150b9f99e67
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b0a44a6b865738ba49b9fb.md
@@ -0,0 +1,118 @@
+---
+id: 61b0a44a6b865738ba49b9fb
+title: Hatua ya 86
+challengeType: 0
+dashedName: step-86
+---
+
+# --description--
+
+Jambo la mwisho utakalofanya ni kuongeza kivuli kidogo kwa kila alama ili kuzifanya zionekane kuwa za kweli zaidi.
+
+Sifa ya `box-shadow` hukuwezesha kuweka kivuli kimoja au zaidi kuzunguka kipengele. Hapa kuna sintaksia:
+
+```css
+box-shadow: offsetX offsetY color;
+```
+
+Hivi ndivyo thamani za `offsetX` na `offsetY` hufanya kazi:
+
+* `offsetX` na `offsetY` zinakubali thamani za nambari katika `px` na vitengo vingine vya CSS
+* thamani chanya ya `offsetX` husogeza kivuli kulia na thamani hasi kukisogeza kushoto
+* thamani chanya ya `offsetY` husogeza kivuli kulia na thamani hasi kukisogeza kushoto
+* ikiwa unataka thamani ya sifuri (`0`) kwa `offsetX` yoyote au zote mbili na `offsetY`, huhitaji kuongeza kitengo. Kila kivinjari kinaelewa kuwa sifuri inamaanisha hakuna mabadiliko.
+
+Urefu na upana wa kivuli huamuliwa na urefu na upana wa kipengele ambacho kinatumika. Unaweza pia kutumia thamani ya hiari ya `spreadRadius` ili kueneza ufikiaji wa kivuli. Zaidi juu ya hilo baadaye.
+
+Anza kwa kuongeza kivuli rahisi kwenye alama nyekundu.
+
+Katika sheria ya CSS ya `.red`, ongeza sifa ya `box-shadow` yenye thamani `5px` kwa `offsetX`, `5px` kwa `offsetY`, na `red` kwa `color`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `5px 5px red`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.red')?.boxShadow === 'red 5px 5px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+}
+--fcc-editable-region--
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b306305810f1c9040ce5a2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b306305810f1c9040ce5a2.md
new file mode 100644
index 00000000000..b49aee54feb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b306305810f1c9040ce5a2.md
@@ -0,0 +1,104 @@
+---
+id: 61b306305810f1c9040ce5a2
+title: Hatua ya 87
+challengeType: 0
+dashedName: step-87
+---
+
+# --description--
+
+Kama unavyoona, umeongeza kivuli chekundu karibu na kialama chako ambacho ni pikseli 5 kulia, na pikseli 5 chini.
+
+Lakini vipi ikiwa ungependa kuweka kivuli chako upande wa pili? Unaweza kufanya hivyo kwa kutumia thamani hasi za `offsetX` na `offsetY`.
+
+Sasisha thamani za sifa za `box-shadow`, na uweke `offsetX` hadi `-5px`, na `offsetY` hadi `-5px`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `-5px -5px red`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.red')?.boxShadow === 'red -5px -5px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: 5px 5px red;
+}
+--fcc-editable-region--
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b30995968123ceb6b76167.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b30995968123ceb6b76167.md
new file mode 100644
index 00000000000..d94bdf5aa08
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b30995968123ceb6b76167.md
@@ -0,0 +1,108 @@
+---
+id: 61b30995968123ceb6b76167
+title: Hatua ya 88
+challengeType: 0
+dashedName: step-88
+---
+
+# --description--
+
+Ona kwamba kingo za kivuli ni kali. Hii ni kwa sababu kuna thamani ya hiari ya `blurRadius` kwa sifa ya `box-shadow`:
+
+```css
+box-shadow: offsetX offsetY blurRadius color;
+```
+
+Ikiwa thamani ya `blurRadius` haijajumuishwa, itabadilika kuwa `0` na kutoa kingo kali. Kadiri thamani ya `blurRadius` inavyoongezeka, ndivyo athari ya blurring inavyoongezeka.
+
+Katika sheria ya CSS ya `.green`, ongeza sifa ya `box-shadow` yenye thamani `5px` kwa `offsetX`, `5px` kwa `offsetY`, na `5px` kwa `blurRadius` na `green` kwa `color`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `5px 5px 5px green`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.green')?.boxShadow === 'green 5px 5px 5px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: -5px -5px red;
+}
+
+--fcc-editable-region--
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+}
+--fcc-editable-region--
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b30a286c228bd0c493c09a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b30a286c228bd0c493c09a.md
new file mode 100644
index 00000000000..c8da4abb1d9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b30a286c228bd0c493c09a.md
@@ -0,0 +1,111 @@
+---
+id: 61b30a286c228bd0c493c09a
+title: Hatua ya 89
+challengeType: 0
+dashedName: step-89
+---
+
+# --description--
+
+Lakini ni nini ikiwa ungependa kuongeza uwazi wa kivuli zaidi? Unaweza kufanya hivyo kwa kutumia thamani ya `spreadRadius`:
+
+```css
+box-shadow: offsetX offsetY blurRadius spreadRadius color;
+```
+
+Kama vile `blurRadius`, `spreadRadius` hujipa chaguomsingi ya `0` ikiwa haijajumuishwa.
+
+Fanya mazoezi kwa kuongeza kivuli cha pikseli 5 moja kwa moja karibu na alama ya bluu.
+
+Katika sheria ya CSS ya `.blue`, ongeza sifa ya `box-shadow` yenye thamani `0` kwa `offsetX`, `0` kwa `offsetY`, na `0` kwa `blurRadius`, `5px` kwa `spreadRadius`, na `blue` kwa `color`.
+
+# --hints--
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `0 0 0 5px blue`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.blue')?.boxShadow === 'blue 0px 0px 0px 5px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: -5px -5px red;
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+ box-shadow: 5px 5px 5px green;
+}
+
+--fcc-editable-region--
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31287fb580ae75a486047.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31287fb580ae75a486047.md
new file mode 100644
index 00000000000..452fc949cea
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31287fb580ae75a486047.md
@@ -0,0 +1,104 @@
+---
+id: 61b31287fb580ae75a486047
+title: Hatua ya 90
+challengeType: 0
+dashedName: step-90
+---
+
+# --description--
+
+Sasa kwa kuwa una ufahamu wa sifa ya `box-shadow` unaweza kukamilisha vivuli, ukianza na kile cha alama nyekundu.
+
+Katika sheria ya CSS ya `.red`, sasisha thamani za `box-shadow` ili `offsetX` iwe `0`,`offsetY` iwe `0`, `blurRadius` iwe `20px`, `spreadRadius` iwe `0`, na `color` iwe `red`. Kumbuka kwamba huhitaji kuongeza vitengo kwa thamani ya sifuri.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `0 0 20px 0 red`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.red')?.boxShadow === 'red 0px 0px 20px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: -5px -5px red;
+}
+--fcc-editable-region--
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+ box-shadow: 5px 5px 5px green;
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+ box-shadow: 0 0 0 5px blue;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b315e76a63b3ecbbb11b75.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b315e76a63b3ecbbb11b75.md
new file mode 100644
index 00000000000..84e1cf06b17
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b315e76a63b3ecbbb11b75.md
@@ -0,0 +1,104 @@
+---
+id: 61b315e76a63b3ecbbb11b75
+title: Hatua ya 91
+challengeType: 0
+dashedName: step-91
+---
+
+# --description--
+
+Kisha, sasisha thamani ya `color` ya sifa ya `box-shadow` ya alama nyekundu.
+
+Badilisha rangi iliyotajwa na kitendakazi cha `rgba`. Tumia thamani za `83` kwa nyekundu, `14` kwa kijani, `14` kwa bluu, na `0.8` kwa kituo cha alpha.
+
+# --hints--
+
+Sheria yako ya CSS ya `.red` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `0 0 20px 0 rgba(83, 14, 14, 0.8)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.red')?.boxShadow === 'rgba(83, 14, 14, 0.8) 0px 0px 20px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+--fcc-editable-region--
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: 0 0 20px 0 red;
+}
+--fcc-editable-region--
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+ box-shadow: 5px 5px 5px green;
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+ box-shadow: 0 0 0 5px blue;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b3183655ec10efd8c0bb07.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b3183655ec10efd8c0bb07.md
new file mode 100644
index 00000000000..5dd0261deeb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b3183655ec10efd8c0bb07.md
@@ -0,0 +1,110 @@
+---
+id: 61b3183655ec10efd8c0bb07
+title: Hatua ya 92
+challengeType: 0
+dashedName: step-92
+---
+
+# --description--
+
+Vivuli vya vialamisho vyako vya kijani na bluu vitakuwa na position sawa, blur na spread. Tofauti pekee itakuwa rangi.
+
+Katika sheria ya CSS ya `.green` na `.blue`, sasisha thamani za `box-shadow` ili `offsetX` iwe `0`, `offsetY` iwe `0`, `blurRadius` iwe `20px`, na `spreadRadius` iwe `0`. Acha rangi ziwe `green` na `blue` kwa sasa.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `0 0 20px 0 green`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.green')?.boxShadow === 'green 0px 0px 20px 0px');
+```
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `0 0 20px 0 blue`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.blue')?.boxShadow === 'blue 0px 0px 20px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: 0 0 20px 0 rgba(83, 14, 14, 0.8);
+}
+
+--fcc-editable-region--
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+ box-shadow: 5px 5px 5px green;
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+ box-shadow: 0 0 0 5px blue;
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31a451057fff645ec09be.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31a451057fff645ec09be.md
new file mode 100644
index 00000000000..e9ecc0c9964
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31a451057fff645ec09be.md
@@ -0,0 +1,102 @@
+---
+id: 61b31a451057fff645ec09be
+title: Hatua ya 93
+challengeType: 0
+dashedName: step-93
+---
+
+# --description--
+
+Kwa sifa ya `box-shadow` ya alama ya kijani, badilisha rangi iliyotajwa na msimbo wa rangi ya hex. Tumia thamani za `3B` kwa nyekundu, `7E` kwa kijani, `20` kwa bluu, na `CC` kwa kituo cha alpha.
+
+# --hints--
+
+Sheria yako ya CSS ya `.green` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `0 0 20px 0 #3B7E20CC`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.green')?.boxShadow === 'rgba(59, 126, 32, 0.8) 0px 0px 20px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: 0 0 20px 0 rgba(83, 14, 14, 0.8);
+}
+
+--fcc-editable-region--
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+ box-shadow: 0 0 20px 0 green;
+}
+--fcc-editable-region--
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+ box-shadow: 0 0 20px 0 blue;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31cd7b0c76bfc076b4719.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31cd7b0c76bfc076b4719.md
new file mode 100644
index 00000000000..3ac418bbf27
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61b31cd7b0c76bfc076b4719.md
@@ -0,0 +1,184 @@
+---
+id: 61b31cd7b0c76bfc076b4719
+title: Hatua ya 94
+challengeType: 0
+dashedName: step-94
+---
+
+# --description--
+
+Hatimaye, kwa sifa ya `box-shadow` ya alama ya bluu, badilisha rangi iliyotajwa na kitendakazi cha `hsla`. Tumia thamani za `223` kwa hue, `59%` kwa saturation, `31%` kwa lightness, na `0.8` kwa kituo cha alpha.
+
+Na kwa hilo, seti yako ya alama za rangi imekamilika! Hongera.
+
+# --hints--
+
+Sheria yako ya CSS ya `.blue` inapaswa kuwa na sifa ya mkato ya `box-shadow` yenye thamani ya `0 0 20px 0 hsla(223, 59%, 31%, 0.8)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.blue')?.boxShadow === 'rgba(32, 59, 126, 0.8) 0px 0px 20px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: 0 0 20px 0 rgba(83, 14, 14, 0.8);
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+ box-shadow: 0 0 20px 0 #3B7E20CC;
+}
+
+--fcc-editable-region--
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+ box-shadow: 0 0 20px 0 blue;
+}
+--fcc-editable-region--
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
Colored Markers
+
+
+
+
CSS Color Markers
+
+
+
+```
+
+```css
+h1 {
+ text-align: center;
+}
+
+.container {
+ background-color: rgb(255, 255, 255);
+ padding: 10px 0;
+}
+
+.marker {
+ width: 200px;
+ height: 25px;
+ margin: 10px auto;
+}
+
+.cap {
+ width: 60px;
+ height: 25px;
+}
+
+.sleeve {
+ width: 110px;
+ height: 25px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-left: 10px double rgba(0, 0, 0, 0.75);
+}
+
+.cap, .sleeve {
+ display: inline-block;
+}
+
+.red {
+ background: linear-gradient(rgb(122, 74, 14), rgb(245, 62, 113), rgb(162, 27, 27));
+ box-shadow: 0 0 20px 0 rgba(83, 14, 14, 0.8);
+}
+
+.green {
+ background: linear-gradient(#55680D, #71F53E, #116C31);
+ box-shadow: 0 0 20px 0 #3B7E20CC;
+}
+
+.blue {
+ background: linear-gradient(hsl(186, 76%, 16%), hsl(223, 90%, 60%), hsl(240, 56%, 42%));
+ box-shadow: 0 0 20px 0 hsla(223, 59%, 31%, 0.8);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537485c4f2a624f18d7794.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537485c4f2a624f18d7794.md
new file mode 100644
index 00000000000..04422ce26c5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537485c4f2a624f18d7794.md
@@ -0,0 +1,118 @@
+---
+id: 61537485c4f2a624f18d7794
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Anza na boilerplate ya kawaida ya HTML. Ongeza tamko la `DOCTYPE`, kipengele cha `html`, kipengele cha `head` na kipengele cha `body`.
+
+Ongeza sifa ya `lang` kwenye lebo ya ufunguzi `` na `en` iliyowekwa kama thamani.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na rejeleo la `DOCTYPE`.
+
+```js
+assert(code.match(/` baada ya aina.
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufungua.
+
+```js
+assert(code.match(/|/gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufunga.
+
+```js
+assert(code.match(/<\/html\s*>/));
+```
+
+Tagi yako ya kufungua `` inapaswa kuwa na sifa ya `lang` na `en` kama thamani.
+
+```js
+assert(code.match(//));
+```
+
+Tamko lako la `DOCTYPE` linapaswa kuwa mwanzoni mwa HTML yako.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+Unapaswa kuwa na tagi ya `head` ya kufungua.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `head`.
+
+```js
+assert(code.match(/<\/head\s*>/i));
+```
+
+Unapaswa kuwa na tagi ya `body` ya kufungua.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `body`.
+
+```js
+assert(code.match(/<\/body\s*>/i));
+```
+
+Vipengele vya `head` na `body` vinapaswa kuwa ndugu.
+
+```js
+assert(document.querySelector('head')?.nextElementSibling?.localName === 'body');
+```
+
+Kipengele cha `head` kinafaa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'head'));
+```
+
+Kipengele cha `body` kinafaa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'body'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537a8054753e2f1f2a1574.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537a8054753e2f1f2a1574.md
new file mode 100644
index 00000000000..ee4ebf0c9c7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537a8054753e2f1f2a1574.md
@@ -0,0 +1,58 @@
+---
+id: 61537a8054753e2f1f2a1574
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `head`, ongeza tagi ya `meta` ambayo `name` imewekwa kuwa `viewport` na `content` imewekwa kuwa `width=device-width, initial-scale=1`.
+
+Pia, ongeza tagi ya `meta` ambayo `charset` imewekwa kuwa `UTF-8`.
+
+# --hints--
+
+Code yako inapaswa kuwa na vipengele viwili vya `meta`.
+
+```js
+const meta = document.querySelectorAll('meta');
+assert(meta?.length === 2);
+```
+
+Kipengele kimoja cha `meta` kinapaswa kuwa na `name` iliyowekwa kuwa `viewport`, na `content` iliyowekwa kuwa `width=device-width, initial-scale=1.0`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => m?.getAttribute('name') === 'viewport' && m?.getAttribute('content').match(/width=device-width,\s?initial-scale=1(.0)?/) && !m?.getAttribute('charset'));
+assert.exists(target);
+```
+
+Kipengele chako cha `meta` kinapaswa kuwa na sifa ya `charset` yenye thamani ya `UTF-8`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => !m?.getAttribute('name') && !m?.getAttribute('content') && m?.getAttribute('charset')?.toLowerCase() === 'utf-8');
+assert.exists(target);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537bb9b1a29430ac15ad38.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537bb9b1a29430ac15ad38.md
new file mode 100644
index 00000000000..0c319fd0334
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537bb9b1a29430ac15ad38.md
@@ -0,0 +1,62 @@
+---
+id: 61537bb9b1a29430ac15ad38
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `head`, ongeza kipengele cha `title` chenye maandishi yaliyowekwa kuwa `Photo Gallery` na kipengele cha `link` cha kuongeza faili yako ya `styles.css` kwenye ukurasa.
+
+# --hints--
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `href` yenye thamani `styles.css`.
+
+```js
+assert.match(code, /
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c5f81f0cf325b4a854c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c5f81f0cf325b4a854c.md
new file mode 100644
index 00000000000..6b5e7e8d049
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c5f81f0cf325b4a854c.md
@@ -0,0 +1,62 @@
+---
+id: 61537c5f81f0cf325b4a854c
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Ongeza kipengele cha `header` ndani ya kipengele cha `body` na ukipe class ya `header`.
+
+Ndani ya `header`, unda `h1` yenye `css flexbox photo gallery` kama maandishi.
+
+# --hints--
+
+Unapaswa kuwa na kipengele cha `header` ndani ya kipengele chako cha `body`.
+
+```js
+assert.exists(document.querySelector('body')?.querySelector('header'));
+```
+
+Kipengele chako cha `header` kinafaa kuwa na `class` yenye thamani ya `header`.
+
+```js
+assert(document?.querySelector('body')?.querySelector('header')?.classList?.contains('header'));
+```
+
+Kipengele chako cha `header` kinafaa kuwa na kipengele cha `h1` ndani yake.
+
+```js
+assert.exists(document.querySelector('.header')?.querySelector('h1'));
+```
+
+Kipengele chako cha `h1` kinapaswa kuwa na maandishi `css flexbox photo gallery`.
+
+```js
+assert(document?.querySelector('.header')?.querySelector('h1')?.innerText === 'css flexbox photo gallery');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c9eecea6a335db6da79.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c9eecea6a335db6da79.md
new file mode 100644
index 00000000000..5d1f7a9ce42
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537c9eecea6a335db6da79.md
@@ -0,0 +1,65 @@
+---
+id: 61537c9eecea6a335db6da79
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Chini ya kipengele chako cha `.header`, unda kipengele kipya cha `div` na ukikabidhi `class` ya `gallery`. `div` hii itafanya kazi kama container ya picha za gallery.
+
+Ndani ya kipengele hicho cha `.gallery`, unda vipengele tisa vya `img`.
+
+# --hints--
+
+Unapaswa kuunda kipengele cha `div` katika kipengele chako cha `body`.
+
+```js
+assert(document.querySelector('body')?.querySelectorAll('div')?.length >= 1);
+```
+
+Kipengele chako kipya cha `div` kinapaswa kuwa na `class` na `gallery` iliyowekwa kama thamani.
+
+```js
+assert(document.querySelector('body')?.querySelector('.gallery'));
+```
+
+Kipengele chako kipya cha `div` kinafaa kuja baada ya kipengele chako cha `.header`.
+
+```js
+assert(document.querySelector('header')?.nextElementSibling?.classList?.contains('gallery'));
+```
+
+Kipengele chako cha `.gallery` kinapaswa kuwa na vipengele tisa vya `img`.
+
+```js
+assert(document.querySelector('.gallery')?.querySelectorAll('img')?.length === 9);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537d86bdc3dd343688fceb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537d86bdc3dd343688fceb.md
new file mode 100644
index 00000000000..160dfc9e83e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61537d86bdc3dd343688fceb.md
@@ -0,0 +1,111 @@
+---
+id: 61537d86bdc3dd343688fceb
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Ifuatayo, ipe kila `img` sifa ya `src` kulingana na mpangilio wake katika hati. `img` ya kwanza inapaswa kuwa na `src` ya `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg`. Zilizosalia zinapaswa kuwa sawa, isipokuwa badilisha `1` na nambari ambayo `img` iko kwenye hati.
+
+# --hints--
+
+Vipengele vyako vyote tisa vya `img` vinapaswa kuwa na sifa ya `src`.
+
+```js
+const images = [...document.querySelectorAll('img')];
+assert(images.every(image => image.getAttribute('src')));
+```
+
+Kipengele chako cha kwanza cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[0]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg');
+```
+
+Kipengele chako cha pili cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/2.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[1]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/2.jpg');
+```
+
+Kipengele chako cha tatu cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/3.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[2]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/3.jpg');
+```
+
+Kipengele chako cha nne cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/4.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[3]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/4.jpg');
+```
+
+Kipengele chako cha tano cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/5.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[4]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/5.jpg');
+```
+
+Kipengele chako cha sita cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/6.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[5]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/6.jpg');
+```
+
+Kipengele chako cha saba cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/7.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[6]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/7.jpg');
+```
+
+Kipengele chako cha nane cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/8.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[7]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/8.jpg');
+```
+
+Kipengele chako cha tisa cha `img` kinapaswa kuwa na `https://cdn.freecodecamp.org/curriculum/css-photo-gallery/9.jpg` iliyowekwa kama thamani ya sifa ya `src`.
+
+```js
+assert(document.querySelectorAll('img')?.[8]?.getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-photo-gallery/9.jpg');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615380dff67172357fcf0425.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615380dff67172357fcf0425.md
new file mode 100644
index 00000000000..33568df74d6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615380dff67172357fcf0425.md
@@ -0,0 +1,62 @@
+---
+id: 615380dff67172357fcf0425
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Rekebisha muundo wa kisanduku chako kwa kuunda kichaguzi cha `*` na kuweka sifa ya `box-sizing` kuwa `border-box` kama thamani.
+
+# --hints--
+
+Unapaswa kuwa na kichaguz cha `*`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('*'));
+```
+
+Kichaguzi chako cha `*` kinafaa kuwa na sifa ya `box-sizing` yenye `border-box` kama thamani.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*')?.boxSizing === 'border-box');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153893900438b4643590367.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153893900438b4643590367.md
new file mode 100644
index 00000000000..ef120affeb2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153893900438b4643590367.md
@@ -0,0 +1,87 @@
+---
+id: 6153893900438b4643590367
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Ondoa ukingo kwenye kipengele chako cha `body`, weka `font-family` kuwa `sans-serif` na ukipe `background-color` ya `#f5f6f7` kama thamani.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `body`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+Kichaguzi chako cha `body` kinafaa kuwa na sifa ya `margin` yenye thamani ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.marginTop, '0px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.marginBottom, '0px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.marginLeft, '0px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.marginRight, '0px');
+```
+
+Kichaguzi chako cha `body` kinafaa kuwa na sifa ya `font-family` yenye thamani ya `sans-serif`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.fontFamily === 'sans-serif');
+```
+
+Kichaguzi chako cha `body` kinafaa kuwa na sifa ya `background-color` yenye `#f5f6f7` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.backgroundColor === 'rgb(245, 246, 247)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153897c27f6334716ee5abe.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153897c27f6334716ee5abe.md
new file mode 100644
index 00000000000..3457b08dbb9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153897c27f6334716ee5abe.md
@@ -0,0 +1,114 @@
+---
+id: 6153897c27f6334716ee5abe
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Pangilia maandishi yako ya `.header` katikati. Fanya maandishi kuwa herufi kubwa kwa kutumia kipengele cha `text-transform` chenye `uppercase` kama thamani.
+
+Ipe padding ya `32px` pande zote. Weka mandhari ya nyuma kuwa `#0a0a23` na maandishi kuwa `#fff` kama thamani za rangi.
+
+Ongeza `border-bottom` yenye thamani ya `4px solid #fdb347`.
+
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.header`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.header'));
+```
+
+Kichaguzi chako cha `.header` kinafaa kuwa na sifa ya `text-align` yenye `center` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.header')?.textAlign === 'center');
+```
+
+Kichaguzi chako cha `.header` kinafaa kuwa na sifa ya `text-transform` yenye `uppercase` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.header')?.textTransform === 'uppercase');
+```
+
+Kichaguzi chako cha `.header` kinafaa kuwa na sifa ya `padding` yenye thamani ya `32px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.header')?.padding === '32px');
+```
+
+Kichaguzi chako cha `.header` kinafaa kuwa na sifa ya `background-color` yenye `#0a0a23` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.header')?.backgroundColor === 'rgb(10, 10, 35)');
+```
+
+Kichaguzi chako cha `.header` kinafaa kuwa na sifa ya `color` yenye `#fff` thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.header')?.color === 'rgb(255, 255, 255)');
+```
+
+Kichaguzi chako cha `.header` kinafaa kuwa na sifa ya `border-bottom` yenye `4px solid #fdb347` kama thamani yake.
+
+```js
+console.log(new __helpers.CSSHelp(document).getStyle('.header'))
+assert(new __helpers.CSSHelp(document).getStyle('.header')?.borderBottom === '4px solid rgb(253, 179, 71)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615389bd81347947ea7ba896.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615389bd81347947ea7ba896.md
new file mode 100644
index 00000000000..ee2c4d191ab
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615389bd81347947ea7ba896.md
@@ -0,0 +1,91 @@
+---
+id: 615389bd81347947ea7ba896
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Flexbox ni mpangilio wa CSS wenye mwelekeo mmoja ambao unaweza kudhibiti jinsi vipengee vinavyotenganishwa na kupangiliwa ndani ya container.
+
+Ili kukitumia, kipe kipengele `display` sifa ya `flex`. Hii itafanya kipengele kuwa
flex-container . Watoto wowote wa moja kwa moja wa flex-container huitwa
flex items .
+
+Unda kichaguzi cha `.gallery` na ukifanye kuwa flex container.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.gallery`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery'));
+```
+
+Kichaguzi chako cha `.gallery` kinafaa kuwa na sifa ya `display` yenye `flex` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery')?.display === 'flex');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153908a366afb4d57185c8d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153908a366afb4d57185c8d.md
new file mode 100644
index 00000000000..c5032eb490e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153908a366afb4d57185c8d.md
@@ -0,0 +1,94 @@
+---
+id: 6153908a366afb4d57185c8d
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Flexbox ina main na cross axis. Main axis inafafanuliwa na kipengele cha `flex-direction`, ambacho kina thamani nne zinazowezekana:
+
+- `row` (default): horizontal axis yenye flex items kutoka kushoto kwenda kulia
+- `row-reverse`: horizontal axis yenye flex items kutoka kulia kwenda kushoto
+- `column`: vertical axis yenye flex items kutoka juu hadi chini
+- `column-reverse`: vertical axis yenye flex items kutoka chini hadi juu
+
+**Kumbuka**: Axes na direction itakuwa tofauti kulingana na mwelekeo wa maandishi. Thamani zilizoonyeshwa ni za mwelekeo wa maandishi kutoka kushoto kwenda kulia.
+
+Jaribu thamani tofauti ili kuona jinsi zinavyoathiri mpangilio.
+
+Ukimaliza, weka `flex-direction` ya `row` kwenye kipengele cha `.gallery`.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery` kinafaa kuwa na sifa ya `flex-direction` yenye `row` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery')?.flexDirection === 'row');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+--fcc-editable-region--
+.gallery {
+ display: flex;
+}
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615392916d83fa4f02f7e2cf.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615392916d83fa4f02f7e2cf.md
new file mode 100644
index 00000000000..26605ab58aa
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615392916d83fa4f02f7e2cf.md
@@ -0,0 +1,88 @@
+---
+id: 615392916d83fa4f02f7e2cf
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+
+Sifa ya `flex-wrap` huamua jinsi flex items vinavyofanya kazi wakati flex container ni kidogo sana. Kuiweka kwa `wrap` kutaruhusu vipengee kufungana hadi safu mlalo au safu wima inayofuata. `nowrap` (default) itazuia vipengee vyako kufungwa na kuvipunguza ikihitajika.
+
+
+Fanya hivyo ili flex items vifungane hadi safu mlalo inayofuata vinapoisha nafasi.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery` kinafaa kuwa na sifa ya `flex-wrap` yenye `wrap` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery')?.flexWrap === 'wrap');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+--fcc-editable-region--
+.gallery {
+ display: flex;
+ flex-direction: row;
+}
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153938dce8b294ff8f5a4e9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153938dce8b294ff8f5a4e9.md
new file mode 100644
index 00000000000..91e1c9a8f2f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153938dce8b294ff8f5a4e9.md
@@ -0,0 +1,87 @@
+---
+id: 6153938dce8b294ff8f5a4e9
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Sifa ya `justify-content` huamua jinsi vipengee vilivyo ndani ya flex container inavyowekwa kando ya main axis, na kuathiri nafasi yao na nafasi inayozizunguka.
+
+Kipe kichaguzi chako cha `.gallery` sifa ya `justify-content` yenye thamani ya `center`.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery` kinafaa kuwa na sifa ya `justify-content` yenye `center` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery')?.justifyContent === 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+--fcc-editable-region--
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153947986535e5117e60615.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153947986535e5117e60615.md
new file mode 100644
index 00000000000..145b44fbb2f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153947986535e5117e60615.md
@@ -0,0 +1,88 @@
+---
+id: 6153947986535e5117e60615
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Sifa ya `align-items` huweka flex content kwenye cross axis. Katika hali hii, na `flex-direction` yako imewekwa kuwa `row`, cross axis yako itakuwa wima.
+
+Ili kuweka picha zako katikati kiwima, kipe kichaguzi cha `.gallery` sifa ya `align-items` yenye thamani ya `center`.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery` kinafaa kuwa na sifa ya `align-items` yenye `center` kama thamani yake.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery')?.alignItems === 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+--fcc-editable-region--
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61539e07e7430b528fbffe21.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61539e07e7430b528fbffe21.md
new file mode 100644
index 00000000000..5c8b4c77907
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61539e07e7430b528fbffe21.md
@@ -0,0 +1,104 @@
+---
+id: 61539e07e7430b528fbffe21
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Kipe kichaguzi chako cha `.gallery` sifa ya `padding` iliyowekwa kuwa `20px 10px` ili kuunda nafasi kuzunguka container.
+
+Kisha, ipe `max-width` ya `1400px` na uongeze `margin` ya `0 auto` ili kuiweka katikati.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery` kinafaa kuwa na sifa ya `padding` iyenye thamani ya `20px 10px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.gallery')?.paddingTop, '20px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.gallery')?.paddingBottom, '20px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.gallery')?.paddingLeft, '10px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.gallery')?.paddingRight, '10px');
+```
+
+Kichaguzi chako cha `.gallery` kinafaa kuwa na sifa ya `max-width` yenye thamani ya `1400px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery')?.maxWidth === '1400px');
+```
+
+Kipengele chako cha `.gallery` kinafaa kuwa na `margin` yenye thamani ya `0 auto`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.gallery').cssText, 'margin: 0px auto');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+--fcc-editable-region--
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61539f32a206bd53ec116465.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61539f32a206bd53ec116465.md
new file mode 100644
index 00000000000..4d024fe4d9d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/61539f32a206bd53ec116465.md
@@ -0,0 +1,92 @@
+---
+id: 61539f32a206bd53ec116465
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Angalia jinsi baadhi ya picha zako zimepotoshwa. Hii ni kwa sababu picha zina uwiano tofauti wa vipengele. Badala ya kuweka kila uwiano mmoja mmoja, unaweza kutumia sifa ya `object-fit` ili kubainisha jinsi picha zinafaa kua.
+
+Kipe kichaguzi chako cha `.gallery img` sifa ya `object-fit` na ukiweke kiwe `cover`. Hii itaambia picha kujaza container ya `img` huku ikidumisha uwiano wa kipengele, na kusababisha upunguzaji ili kutoshea.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery img` kinafaa kuwa na sifa ya `object-fit` yenye thamani ya `cover`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery img')?.objectFit === 'cover');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 20px 10px;
+}
+
+--fcc-editable-region--
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a04847abee57a3a406ac.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a04847abee57a3a406ac.md
new file mode 100644
index 00000000000..4eed81cbd9f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a04847abee57a3a406ac.md
@@ -0,0 +1,95 @@
+---
+id: 6153a04847abee57a3a406ac
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Picha zako zinahitaji nafasi kati yao.
+
+Sifa ya mkato ya CSS ya `gap` huweka mapengo, ambayo pia hujulikana kama gutters, kati ya safu mlalo na safu wima. Sifa ya `gap` na sifa zake zake `row-gap` na `column-gap` hutoa utendakazi huu kwa mpangilio wa flex, grid na multi-column. Unatumia sifa hiyo kwenye kipengee cha container.
+
+Ipe flex-container ya `.gallery` yako sifa ya `gap` yenye thamani ya `16px`.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery` kinafaa kuwa na sifa ya `gap` yenye thamani ya `16px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery')?.gap === '16px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+--fcc-editable-region--
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 20px 10px;
+}
+--fcc-editable-region--
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+ object-fit: cover;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3485f0b20591d26d2a1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3485f0b20591d26d2a1.md
new file mode 100644
index 00000000000..dcd9fac9604
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3485f0b20591d26d2a1.md
@@ -0,0 +1,92 @@
+---
+id: 6153a3485f0b20591d26d2a1
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Lainisha picha zako kidogo kwa kukipa kichaguzi cha `.gallery img` sifa ya `border-radius` yenye thamani ya `10px`.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery img` kinafaa kuwa na sifa ya `border-radius` iliyowekwa kuwa `10px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery img')?.borderRadius === '10px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 20px 10px;
+}
+
+--fcc-editable-region--
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+ object-fit: cover;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3952facd25a83fe8083.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3952facd25a83fe8083.md
new file mode 100644
index 00000000000..c8c3ec456bc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3952facd25a83fe8083.md
@@ -0,0 +1,112 @@
+---
+id: 6153a3952facd25a83fe8083
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Kipengele cha pseudo cha `::after` huunda kipengele ambacho ni mtoto wa mwisho wa kipengele kilichochaguliwa. Unaweza kuitumia kuongeza kipengee tupu baada ya picha ya mwisho. Ukiipa `width` sawa na picha itasukuma picha ya mwisho kushoto wakati ghala iko katika mpangilio wa safu wima mbili. Kwa sasa, iko katikati kwa sababu umeweka `justify-content: center` kwenye flex container.
+
+Mfano:
+
+```CSS
+.container::after {
+ content: "";
+ width: 860px;
+}
+```
+
+Unda kichaguzi kipya kwa kutumia kipengele cha pseudo cha `::after` kwenye kipengele cha `.gallery`. Ongeza sifa ya `content` iliyowekwa kuwa na string tupu `""` na `350px` iliyowekwa kwa sifa ya `width`.
+
+# --hints--
+
+Kichaguzi chako cha `.gallery::after` kinapaswa kuwa na string tupu `""` ilioyowekwa kwa sifa ya `content`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery::after')?.content === "\"\"");
+```
+
+Kichaguzi chako cha `.gallery::after` kinapaswa kuwa na `350px` iliyowekwa kwa sifai ya `width`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery::after')?.width === "350px");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 20px 10px;
+}
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+ object-fit: cover;
+ border-radius: 10px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3ebb4f7f05b8401b716.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3ebb4f7f05b8401b716.md
new file mode 100644
index 00000000000..2cffc6eb570
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/6153a3ebb4f7f05b8401b716.md
@@ -0,0 +1,181 @@
+---
+id: 6153a3ebb4f7f05b8401b716
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+
+Sifa ya picha ya `alt` inapaswa kuelezea maudhui ya picha. Visoma skrini vinatangaza maandishi mbadala badala ya picha. Ikiwa picha haiwezi kuonekana, maandishi haya yanaonekana badala ya picha.
+
+Ili kukamilisha mradi, ongeza sifa ya `alt` kwa picha zote tisa za paka wako ili kuzifafanua. Tumia thamani ya angalau herufi tano kwa kila moja.
+
+
+# --hints--
+
+Vipengele vyako vyote tisa vya `img` vinapaswa kuwa na sifa ya `alt` yenye maandishi yanayoelezea kila picha, huku kila maelezo yakitumia angalau herufi `5`.
+
+```js
+const images = [...document.querySelectorAll('img')];
+assert(images.every(image => image.getAttribute('alt')));
+assert(images.every(image => image.getAttribute('alt').length >= 5));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+ --fcc-editable-region--
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 20px 10px;
+}
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+ object-fit: cover;
+ border-radius: 10px;
+}
+
+.gallery::after {
+ content: "";
+ width: 350px;
+}
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: sans-serif;
+ background: #f5f6f7;
+}
+
+.header {
+ text-align: center;
+ text-transform: uppercase;
+ padding: 32px;
+ background-color: #0a0a23;
+ color: #fff;
+ border-bottom: 4px solid #fdb347;
+}
+
+.gallery {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 20px 10px;
+}
+
+.gallery img {
+ width: 100%;
+ max-width: 350px;
+ height: 300px;
+ object-fit: cover;
+ border-radius: 10px;
+}
+
+.gallery::after {
+ content: "";
+ width: 350px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615f171d05def3218035dc85.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615f171d05def3218035dc85.md
new file mode 100644
index 00000000000..0009ae2290c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-flexbox-by-building-a-photo-gallery/615f171d05def3218035dc85.md
@@ -0,0 +1,80 @@
+---
+id: 615f171d05def3218035dc85
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Picha zako ni kubwa mno. Unda kichaguzi cha `.gallery img` ili kuzilenga. Zipe zote `width` ya `100%` na `max-width` ya `350px` ili zipungue inavyohitajika lakini zisiwe kubwa sana.
+
+Pia, weka sifa ya `height` kuwa `300px` ili kuweka picha zako ziwe na ukubwa sawa.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.gallery img`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.gallery img'));
+```
+
+Kichaguzi chako cha `.gallery img` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `100%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery img')?.width === '100%');
+```
+
+Kichaguzi chako cha `.gallery img` kinafaa kuwa na sifa ya `max-width` iliyowekwa kuwa `350px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery img')?.maxWidth === '350px');
+```
+
+Kichaguzi chako cha `.gallery img` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `300px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.gallery img')?.height === '300px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Photo Gallery
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61437d575fb98f57fa8f7f36.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61437d575fb98f57fa8f7f36.md
new file mode 100644
index 00000000000..1ab707b7213
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61437d575fb98f57fa8f7f36.md
@@ -0,0 +1,135 @@
+---
+id: 61437d575fb98f57fa8f7f36
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Anza na boilerplate ya kawaida ya HTML. Ongeza tamko la `DOCTYPE`, kipengele cha `html` kinachobainisha ukurasa huu uko kwa Kiingereza, kipengele cha `head` na kipengele cha `body`.
+
+Ongeza tagi ya `
` yenye `charset` inayofaa na `
` ya mwitikio wa simu ya mkononi ndani ya kipengele cha `head`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na rejeleo la `DOCTYPE`.
+
+```js
+assert(code.match(/` baada ya aina.
+
+```js
+assert(code.match(//gi));
+```
+
+Unapaswa kuwa na tagi ya ufunguzi ya `` yenye sifa ya `lang` ya `en`.
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufunga.
+
+```js
+assert(code.match(/<\/html\s*>/));
+```
+
+Tamko lako la `DOCTYPE` linapaswa kuwa mwanzoni mwa HTML yako.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+Unapaswa kuwa na tagi ya kufungua ya ``.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya ``.
+
+```js
+assert(code.match(/<\/head\s*>/i));
+```
+
+Unapaswa kuwa na tagi ya kufungua ya ``.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya ``.
+
+```js
+assert(code.match(/<\/body\s*>/i));
+```
+
+Vipengele vya `head` na `body` vinapaswa kuwa ndugu.
+
+```js
+assert(document.querySelector('head')?.nextElementSibling?.localName === 'body');
+```
+
+Kipengele cha `head` kinafaa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'head'));
+```
+
+Kipengele cha `body` kinafaa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'body'));
+```
+
+Unapaswa kuwa na vipengele viwili vya `meta`.
+
+```js
+const meta = document.querySelectorAll('meta');
+assert(meta?.length === 2);
+```
+
+Kipengele kimoja cha `meta` kinapaswa kuwa na `name` iliyowekwa kuwa `viewport`, na `content` iliyowekwa kuwa `width=device-width, initial-scale=1.0`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => m?.getAttribute('name') === 'viewport' && m?.getAttribute('content') === 'width=device-width, initial-scale=1.0' && !m?.getAttribute('charset'));
+assert.exists(target);
+```
+
+Kipengele chako cha `meta` kinapaswa kuwa na sifa ya `charset` yenye thamani ya `UTF-8`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => !m?.getAttribute('name') && !m?.getAttribute('content') && m?.getAttribute('charset')?.toLowerCase() === 'utf-8');
+assert.exists(target);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614385513d91ae5c251c2052.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614385513d91ae5c251c2052.md
new file mode 100644
index 00000000000..525dcec17c0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614385513d91ae5c251c2052.md
@@ -0,0 +1,96 @@
+---
+id: 614385513d91ae5c251c2052
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Ongeza kipengele cha `title` chenye maandishi `Magazine`, kipengele cha `link` cha `https://fonts.googleapis.com/css?family=Anton%7CBaskervville%7CRaleway&display=swap` laha ya fonti, `link` ya `https://use.fontawesome.com/releases/v5.8.2/css/all.css` Laha ya mtindo wa FontAwesome, na `link` ya laha yako ya `./styles.css`.
+
+Laha yako ya fonti itapakia fonti tatu tofauti: `Anton`, `Baskervville` na `Raleway`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha kujifunga cha `link`.
+
+```js
+assert(document.querySelectorAll('link').length === 3);
+```
+
+Kipengele chako cha `link` kinapaswa kuwa ndani ya kipengele chako cha `head`.
+
+```js
+assert(document.querySelectorAll('head > link').length === 3);
+```
+
+Kipengele chako cha tatu cha `link` kinapaswa kuwa na sifa ya `rel` yenye thamani ya `stylesheet`.
+
+```js
+const links = [...document.querySelectorAll('link')];
+assert(links.every(link => link.getAttribute('rel') === 'stylesheet'));
+```
+
+Moja ya vipengele vyako vya kiungo lazima kiwe na `href` iliyowekwa kuwa `https://fonts.googleapis.com/css?family=Anton%7CBaskervville%7CRaleway&display=swap`.
+
+```js
+const links = [...document.querySelectorAll('link')];
+assert(links.find(link => link.getAttribute('href') === 'https://fonts.googleapis.com/css?family=Anton%7CBaskervville%7CRaleway&display=swap'));
+```
+
+Moja ya vipengele vyako vya kiungo lazima kiwe na `href` iliyowekwa kuwa `https://use.fontawesome.com/releases/v5.8.2/css/all.css`.
+
+```js
+const links = [...document.querySelectorAll('link')];
+assert(links.find(link => link.getAttribute('href') === 'https://use.fontawesome.com/releases/v5.8.2/css/all.css'));
+```
+
+Moja ya vipengele vyako vya `link` lazima kiwe na sifa ya `href` yenye thamani `styles.css`.
+
+```js
+assert.match(code, /
+
+--fcc-editable-region--
+
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143862a5e54455d262c212e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143862a5e54455d262c212e.md
new file mode 100644
index 00000000000..ae50440c53f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143862a5e54455d262c212e.md
@@ -0,0 +1,75 @@
+---
+id: 6143862a5e54455d262c212e
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `body`, unda kipengele cha `main`. Kisha katika kipengele hicho, unda `section` yenye `class` iliyowekwa kuwa `heading`.
+
+# --hints--
+
+Unapaswa kuwa na kipengele cha `main`.
+
+```js
+assert.exists(document.querySelector('main'));
+```
+
+Kipengele chako cha `main` kinapaswa kuwa ndani ya kipengele chako cha `body`.
+
+```js
+assert(document.querySelector('main')?.parentElement?.localName === 'body');
+```
+
+Unapaswa kuwa na kipengele cha `section`.
+
+```js
+assert.exists(document.querySelector('section'));
+```
+
+Kipengele chako cha `section` kinapaswa kuwa ndani ya kipengele chako cha `main`.
+
+```js
+assert(document.querySelector('section')?.parentElement?.localName === 'main');
+```
+
+Kipengee chako kipya cha `section` kinapaswa kuwa na `class` iliyowekwa kuwa `heading`.
+
+```js
+assert(document.querySelector('section')?.classList?.contains('heading'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143869bb45bd85e3b1926aa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143869bb45bd85e3b1926aa.md
new file mode 100644
index 00000000000..d79689ba8d3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143869bb45bd85e3b1926aa.md
@@ -0,0 +1,109 @@
+---
+id: 6143869bb45bd85e3b1926aa
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `.heading`, unda kipengele cha `header` chenye `class` ya `hero`.
+
+Katika kipengele hicho, unda kipengele cha `img` chenye `src` iliyowekwa kuwa `https://cdn.freecodecamp.org/platform/universal/fcc_meta_1920X1080-indigo.png`, `alt` iliyowekwa kuwa `freecodecamp logo`, na `class` iliyowekwa kuwa `hero-img`.
+
+Sifa ya `loading` kwenye kipengele cha `img` inaweza kuwekwa kuwa `lazy` kuiaambia kivinjari kisilete rasilimali ya picha hadi itakapohitajika (kama ilivyo, wakati mtumiaji anasogeza picha kwenye mwonekano). Kama faida ya ziada, vipengee vilivyopakiwa kwa uvivu havitapakia hadi vipengee visivyo na uvivu vipakiwe - hii inamaanisha kuwa watumiaji walio na miunganisho ya polepole ya mtandao wanaweza kutazama maudhui ya ukurasa wako bila kusubiri hadi picha zipakie.
+
+Kipe kipengele chako kipya cha `img` sifa ya `loading` iliyowekwa kuwa `lazy`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `header`.
+
+```js
+assert.exists(document.querySelector('header'));
+```
+
+Kipengele chako cha `header` kinapaswa kuwa ndani ya kipengele chako cha `.heading`.
+
+```js
+assert(document.querySelector('header')?.parentElement?.className === 'heading');
+```
+
+Kipengee chako cha `header` kinapaswa kuwa na `class` ya `hero`.
+
+```js
+assert(document.querySelector('header')?.className === 'hero');
+```
+
+Unapaswa kuongeza kipengele cha `img`.
+
+```js
+assert.exists(document.querySelector('img'));
+```
+
+Kipengele chako cha `img` kinapaswa kuwa ndani ya kipengele chako cha `header`.
+
+```js
+assert(document.querySelector('img')?.parentElement?.localName === 'header');
+```
+
+Kipengee chako cha `img` kinapaswa kuwa na `src` iliyowekwa kuwa `https://cdn.freecodecamp.org/platform/universal/fcc_meta_1920X1080-indigo.png`.
+
+```js
+assert(document.querySelector('img')?.getAttribute('src') === 'https://cdn.freecodecamp.org/platform/universal/fcc_meta_1920X1080-indigo.png');
+```
+
+Kipengee chako cha `img` kinapaswa kuwa na `alt` iliyowekwa kuwa `freecodecamp logo`.
+
+```js
+assert(document.querySelector('img')?.getAttribute('alt') === 'freecodecamp logo');
+```
+
+Kipengele chako cha tatu cha `img` kinapaswa kuwa na sifa ya `loading` iliyowekwa kuwa `lazy`.
+
+```js
+assert(document.querySelector('img')?.getAttribute('loading') === 'lazy');
+```
+
+Kipengee chako kipya cha `img` kinapaswa kuwa na `class` ya `hero-img`.
+
+```js
+assert(document.querySelector('img')?.className === 'hero-img');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614387cbefeeba5f3654a291.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614387cbefeeba5f3654a291.md
new file mode 100644
index 00000000000..dc6f19991d7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614387cbefeeba5f3654a291.md
@@ -0,0 +1,152 @@
+---
+id: 614387cbefeeba5f3654a291
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Baada ya kipengele chako cha `header`, unda `div` iliyo na `class` iliyowekwa kuwa `author`.
+
+Ndani ya `div` hiyo, unda kipengele cha `p` chenye `class` ya `author-name` na uipe maandishi ya `By freeCodeCamp`. Funga sehemu ya `freeCodeCamp` katika kipengele cha `a` na `href` iliyowekwa kwa `https://freecodecamp.org`, na `target` iliyowekwa kuwa `_blank`.
+
+
+Hapa chini, ongeza kipengele cha pili cha `p` chenye class ya `publish-date` na maandishi `March 7, 2019`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+assert.exists(document.querySelector('div'));
+```
+
+Kipengele chako cha `div` kinafaa kuja baada ya kipengele chako cha `header`.
+
+```js
+assert(document.querySelector('div')?.previousElementSibling?.localName === 'header');
+```
+
+Kipengee chako cha `div` kinapaswa kuwa na `class` ya `author`.
+
+```js
+assert(document.querySelector('div')?.className === 'author');
+```
+
+Unapaswa kuwa na vipengele viwili vya `p`.
+
+```js
+assert(document.querySelectorAll('p')?.length === 3);
+```
+
+Vipengele vyako viwili vipya vya `p` vinapaswa kuwa ndani ya kipengele chako `div`.
+
+```js
+assert.exists(document.querySelector('div')?.querySelectorAll('p')?.length === 2);
+```
+
+Kipengee chako cha kwanza cha `p` kinapaswa kuwa na `class` iliyowekwa kuwa `author-name`.
+
+```js
+assert(document.querySelector('div')?.querySelector('p')?.className === 'author-name');
+```
+
+Kipengele chako kipya cha kwanza cha `p` kinapaswa kuwa na maandishi `By freeCodeCamp`.
+
+```js
+assert(document.querySelector('div')?.querySelector('p')?.innerText === 'By freeCodeCamp');
+```
+
+Kipengee chako cha pili cha `p` kinapaswa kuwa na `class` iliyowekwa kuwa `publish-date`.
+
+```js
+assert(document.querySelector('div')?.querySelectorAll('p')?.[1]?.className === 'publish-date');
+```
+
+Kipengele chako cha pili cha `p` kinapaswa kuwa na maandishi `March 7, 2019`.
+
+```js
+assert(document.querySelector('div')?.querySelectorAll('p')?.[1]?.innerText === 'March 7, 2019');
+```
+
+Unapaswa kuunda kipengele kipya cha `a`.
+
+```js
+assert.exists(document.querySelector('a'));
+```
+
+Kipengele chako cha `a` kinapaswa kuwa ndani ya kipengele chako cha kwanza cha `p`.
+
+```js
+assert(document.querySelector('div')?.querySelector('p')?.firstElementChild?.localName === 'a');
+```
+
+Kipengee chako cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://freecodecamp.org`.
+
+```js
+assert(document.querySelector('div')?.querySelector('p')?.firstElementChild?.getAttribute('href') === 'https://freecodecamp.org');
+```
+
+Kipengee chako cha `a` kinapaswa kuwa na `target` iliyowekwa kuwa `_blank`.
+
+```js
+assert(document.querySelector('div')?.querySelector('p')?.firstElementChild?.getAttribute('target') === '_blank');
+```
+
+Kipengele chako cha `a` kinapaswa kuzunguka maandishi ya `freeCodeCamp`.
+
+```js
+assert(document.querySelector('div')?.querySelector('p')?.firstElementChild?.textContent === 'freeCodeCamp');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614389f601bb4f611db98563.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614389f601bb4f611db98563.md
new file mode 100644
index 00000000000..754d5b317c3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614389f601bb4f611db98563.md
@@ -0,0 +1,134 @@
+---
+id: 614389f601bb4f611db98563
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Chini ya kipengele chako cha `.author`, unda kipengele kipya cha `div` chenye class ya `social-icons`.
+
+Ongeza vipengele vitano vya `a` ndani ya `div` hiyo mpya, na uvipe sifa za `href` sifa zifuatazo.
+
+- Kipengee chako cha kwanza cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://www.facebook.com/freecodecamp`.
+- Kipengee chako cha pili cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://twitter.com/freecodecamp`.
+- Kipengee chako cha tatu cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://instagram.com/freecodecamp`.
+- Kipengee chako cha nne cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://www.linkedin.com/school/free-code-camp`.
+- Kipengee chako cha tano cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://www.youtube.com/freecodecamp`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+assert(document.querySelectorAll('div')?.length === 2);
+```
+
+Kipengele chako kipya cha `div` kinafaa kuja baada ya kipengele chako cha `.author`.
+
+```js
+assert(document.querySelector('.author')?.nextElementSibling?.localName === 'div');
+```
+
+Kipengele chako kipya cha `div` kinapaswa kuwa na class ya `social-icons`.
+
+```js
+assert(document.querySelector('.author')?.nextElementSibling?.classList?.contains('social-icons'));
+```
+
+Kipengele chako cha `.social-icons` kinapaswa kuwa na vipengele vitano vya `a`.
+
+```js
+assert(document.querySelector('.social-icons')?.querySelectorAll('a')?.length === 5);
+```
+
+Kipengee chako cha kwanza cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://www.facebook.com/freecodecamp`.
+
+```js
+assert(document.querySelector('.social-icons')?.querySelectorAll('a')?.[0]?.getAttribute('href')?.includes('https://www.facebook.com/freecodecamp'));
+```
+
+Kipengee chako cha pili cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://twitter.com/freecodecamp`.
+
+```js
+assert.include(document.querySelector('.social-icons')?.querySelectorAll('a')?.[1]?.getAttribute('href'), 'https://twitter.com/freecodecamp');
+```
+
+Kipengee chako cha tatu cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://instagram.com/freecodecamp`.
+
+```js
+assert.include(document.querySelector('.social-icons')?.querySelectorAll('a')?.[2]?.getAttribute('href'), 'https://instagram.com/freecodecamp');
+```
+
+Kipengee chako cha nne cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://www.linkedin.com/school/free-code-camp`.
+
+```js
+assert.include(document.querySelector('.social-icons')?.querySelectorAll('a')?.[3]?.getAttribute('href'), 'https://www.linkedin.com/school/free-code-camp');
+```
+
+Kipengee chako cha nne cha `a` kinapaswa kuwa na `href` iliyowekwa kuwa `https://www.youtube.com/freecodecamp`.
+
+```js
+assert.include(document.querySelector('.social-icons')?.querySelectorAll('a')?.[4]?.getAttribute('href'), 'https://www.youtube.com/freecodecamp');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61438b5b66d76a6264430f2a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61438b5b66d76a6264430f2a.md
new file mode 100644
index 00000000000..43eb04ea341
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61438b5b66d76a6264430f2a.md
@@ -0,0 +1,139 @@
+---
+id: 61438b5b66d76a6264430f2a
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Ndani ya kila kipengele chako kipya cha `a`, ongeza kipengele cha `i` na ukipe class zifuatazo:
+
+- Kipengele chako cha kwanza cha `i` kinapaswa kuwa na class ya `fab fa-facebook-f`
+- Kipengele chako cha pili cha `i` kinapaswa kuwa na class ya `fab fa-twitter`
+- Kipengele chako cha tatu cha `i` kinapaswa kuwa na maandishi `fab fa-instagram`
+- Kipengele chako cha nne cha `i` kinapaswa kuwa na maandishi `fab fa-linkedin-in`
+- Kipengele chako cha tano cha `i` kinapaswa kuwa na class ya `fab fa-youtube`
+
+# --hints--
+
+Unapaswa kuwa na vipengele vitano vya `i`.
+
+```js
+assert(document.querySelectorAll('i')?.length === 5);
+```
+
+Kila kipengele cha `a` kinafaa kuwa na kipengele kimoja cha `i`.
+
+```js
+const aaaaa = [...document.querySelectorAll('.social-icons a')];
+assert(aaaaa?.every(a => a?.children?.length === 1 && a?.children?.[0]?.localName === 'i'));
+```
+
+Kila kipengele cha `i` kinapaswa kuwa na sifa ya `class` ambayo inajumuisha `fab`.
+
+```js
+const iiiii = [...document.querySelectorAll('i')];
+assert(iiiii?.every(i => i?.classList?.contains('fab')));
+```
+
+Kipengele chako cha kwanza cha `i` kinapaswa kuwa na sifa ya `class` ambayo inajumuisha `fa-facebook-f`.
+
+```js
+assert(document.querySelectorAll('i')?.[0]?.classList?.contains('fa-facebook-f'));
+```
+
+Kipengele chako cha pili cha `i` kinapaswa kuwa na sifa ya `class` ambayo inajumuisha `fa-twitter`.
+
+```js
+assert(document.querySelectorAll('i')?.[1]?.classList?.contains('fa-twitter'));
+```
+
+Kipengele chako cha tatu cha `i` kinapaswa kuwa na sifa ya `class` ambayo inajumuisha `fa-instagram`.
+
+```js
+assert(document.querySelectorAll('i')?.[2]?.classList?.contains('fa-instagram'));
+```
+
+Kipengele chako cha nne cha `i` kinapaswa kuwa na sifa ya `class` ambayo inajumuisha `fa-linkedin-in`.
+
+```js
+assert(document.querySelectorAll('i')?.[3]?.classList?.contains('fa-linkedin-in'));
+```
+
+Kipengele chako cha tano cha `i` kinapaswa kuwa na sifa ya `class` ambayo inajumuisha `fa-youtube`.
+
+```js
+assert(document.querySelectorAll('i')?.[4]?.classList?.contains('fa-youtube'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61438ec09438696391076d6a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61438ec09438696391076d6a.md
new file mode 100644
index 00000000000..9cfb019f71a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61438ec09438696391076d6a.md
@@ -0,0 +1,129 @@
+---
+id: 61438ec09438696391076d6a
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Chini ya kipengele chako cha `.heading`, unda kipengele kipya cha `section` na `class` iliyowekwa kuwa `text`. Ndani ya hayo, unda kipengele cha `p` chenye `class` iliyowekwa kuwa `first-paragraph` na maandishi yafuatayo:
+
+```markup
+Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+```
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `section`.
+
+```js
+assert(document.querySelectorAll('section')?.length === 2);
+```
+
+Kipengele chako kipya cha `section` kinafaa kuja baada ya kipengele chako cha `.heading`.
+
+```js
+assert(document.querySelectorAll('section')?.[1]?.previousElementSibling?.className === 'heading');
+```
+
+Kipengee chako kipya cha `section` kinapaswa kuwa na `class` iliyowekwa kuwa `text`.
+
+```js
+assert(document.querySelectorAll('section')?.[1]?.className === 'text');
+```
+
+Unapaswa kuunda kipengele kipya cha `p` ndani ya kipengele chako cha `.text`.
+
+```js
+assert(document.querySelector('.text')?.querySelectorAll('p')?.length === 1);
+```
+
+Kipengee chako kipya cha `p` kinapaswa kuwa na `class` iliyowekwa kuwa `first-paragraph`.
+
+```js
+assert(document.querySelector('.text p')?.className === 'first-paragraph');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi yaliyotolewa.
+
+```js
+assert(document.querySelector('.first-paragraph')?.innerText === 'Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you\'ll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439dc084fa5f659cf75d7c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439dc084fa5f659cf75d7c.md
new file mode 100644
index 00000000000..3b8d844788b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439dc084fa5f659cf75d7c.md
@@ -0,0 +1,109 @@
+---
+id: 61439dc084fa5f659cf75d7c
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Unda kipengele kingine cha `p` chini ya kipengele chako cha `.first-paragraph` na ukipe maandishi yafuatayo:
+
+```markup
+After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+```
+
+# --hints--
+
+Unapaswa kuunda kipengele cha pili cha `p` ndani ya kipengele chako cha `.text`.
+
+```js
+assert(document.querySelectorAll('.text p')?.length === 2)
+```
+
+Kipengele chako cha pili cha `p` kinapaswa kuwa na maandishi yaliyotolewa.
+
+```js
+assert(document.querySelectorAll('.text p')?.[1]?.innerText === 'After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!')
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439dfc811e12666b04be6f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439dfc811e12666b04be6f.md
new file mode 100644
index 00000000000..58fbfbb92b4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439dfc811e12666b04be6f.md
@@ -0,0 +1,113 @@
+---
+id: 61439dfc811e12666b04be6f
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Ongeza kipengele cha tatu cha `p` mwishoni mwa kipengele chako cha `.text`, na ukipe maandishi yafuatayo:
+
+```markup
+It wasn't as dramatic as Doc's revelation in Back to the Future. It just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+```
+
+# --hints--
+
+Unapaswa kuunda kipengele cha tatu cha `p` ndani ya kipengele chako cha `.text`.
+
+```js
+assert(document.querySelectorAll('.text p')?.length === 3);
+```
+
+Kipengele chako cha tatu cha `p` kinapaswa kuwa na maandishi yaliyotolewa.
+
+```js
+assert(document.querySelectorAll('.text p')?.[2]?.innerText === "It wasn't as dramatic as Doc's revelation in Back to the Future. It just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439e33e4fb7967609e0c83.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439e33e4fb7967609e0c83.md
new file mode 100644
index 00000000000..bd89d571c87
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/61439e33e4fb7967609e0c83.md
@@ -0,0 +1,148 @@
+---
+id: 61439e33e4fb7967609e0c83
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Baada ya vipengele vitatu vya `p` ndani ya kipengele chako cha `.text`, unda kipengele cha `blockquote`. Ndani ya hayo, ongeza kipengele cha `hr`, kipengele cha `p` chenye `class` iliyowekwa kuwa `quote` na kipengele cha pili cha `hr`.
+
+Kipe kipengele cha `.quote` maandishi `The entire curriculum should be a series of projects`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `blockquote` ndani ya kipengele chako cha `.text`.
+
+```js
+assert.exists(document.querySelector('.text blockquote'));
+```
+
+Kipengele chako cha `blockquote` kinapaswa kuja baada ya kipengele chako cha `p`.
+
+```js
+assert(document.querySelector('.text')?.children?.[3]?.localName === 'blockquote');
+```
+
+Kipengele chako cha `blockquote` kinapaswa kuwa na vipengele viwili vya `hr`.
+
+```js
+assert(document.querySelectorAll('.text blockquote hr')?.length === 2);
+```
+
+Kipengele chako cha `blockquote` kinapaswa kuwa na kipengele cha `p`.
+
+```js
+assert.exists(document.querySelector('.text blockquote p'));
+```
+
+Watoto wako `blockquote` wanapaswa kuwa katika mpangilio sahihi.
+
+```js
+const children = document.querySelector('.text blockquote')?.children;
+assert(children?.[0]?.localName === 'hr');
+assert(children?.[1]?.localName === 'p');
+assert(children?.[2]?.localName === 'hr');
+```
+
+Kipengee chako kipya cha `p` kinapaswa kuwa na `class` iliyowekwa kuwa `quote`.
+
+```js
+assert(document.querySelector('.text blockquote p')?.className === 'quote');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `The entire curriculum should be a series of projects`.
+
+```js
+assert(document.querySelector('.text blockquote p')?.innerText === 'The entire curriculum should be a series of projects');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a1a228f7d068ab16a130.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a1a228f7d068ab16a130.md
new file mode 100644
index 00000000000..39115a0bf82
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a1a228f7d068ab16a130.md
@@ -0,0 +1,130 @@
+---
+id: 6143a1a228f7d068ab16a130
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Chini ya kipengele chako cha `blockquote`, ongeza kipengele kingine cha `p` chenye maandishi yafuatayo:
+
+```markup
+No more walls of explanatory text. No more walls of tests. Just one test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+```
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha nne cha `p` kwenye kipengele chako `.text`.
+
+```js
+assert(document.querySelectorAll('.text p')?.length === 5);
+```
+
+Kipengele chako kipya cha `p` kinafaa kuja baada ya kipengele chako cha `blockquote`.
+
+```js
+assert(document.querySelectorAll('.text p')?.[4]?.previousElementSibling?.localName === 'blockquote');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi yaliyotolewa.
+
+```js
+assert(document.querySelectorAll('.text p')?.[4]?.innerText === 'No more walls of explanatory text. No more walls of tests. Just one test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there\'s plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a73279ce6369de4b9bcc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a73279ce6369de4b9bcc.md
new file mode 100644
index 00000000000..f043f528780
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a73279ce6369de4b9bcc.md
@@ -0,0 +1,128 @@
+---
+id: 6143a73279ce6369de4b9bcc
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Unda kipengele cha tano cha `p` mwishoni mwa kipengele chako cha `.text`, na ukipe maandishi yafuatayo:
+
+```markup
+The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+```
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha tano cha `p`.
+
+```js
+assert(document.querySelectorAll('.text p')?.length === 6);
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi yaliyotolewa.
+
+```js
+assert(document.querySelectorAll('.text p')?.[5]?.innerText === 'The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a778bffc206ac6b1dbe3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a778bffc206ac6b1dbe3.md
new file mode 100644
index 00000000000..cfc0c9cff5d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a778bffc206ac6b1dbe3.md
@@ -0,0 +1,135 @@
+---
+id: 6143a778bffc206ac6b1dbe3
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Unda kipengele kimoja cha mwisho cha `p` mwishoni mwa kipengele chako cha `.text` na ukipe maandishi yafuatayo:
+
+```markup
+Instead of a series of coding challenges, people will be in their code
+editor passing one test after another, quickly building up a project.
+People will get into a real flow state, similar to what they
+experience when they build the required projects at the end of each
+certification. They'll get that sense of forward progress right from
+the beginning. And freeCodeCamp will be a much smoother experience.
+```
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha sita cha `p` kwenye kipengele chako `.text`.
+
+```js
+assert(document.querySelectorAll('.text p')?.length === 7)
+```
+
+Kipengele chako cha sita cha `p` kinapaswa kuwa na maandishi yaliyotolewa.
+
+```js
+assert(document.querySelectorAll('.text p')?.[6]?.innerText === 'Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They\'ll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.')
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a83fcc32c26bcfae3efa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a83fcc32c26bcfae3efa.md
new file mode 100644
index 00000000000..12883c18464
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143a83fcc32c26bcfae3efa.md
@@ -0,0 +1,166 @@
+---
+id: 6143a83fcc32c26bcfae3efa
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Chini ya kipengele chako cha `.text`, unda kipengele kipya cha `section` na ukikabidhi `class` ya `text text-with-images`. Ndani ya hayo, unda kipengele cha `article` chenye `class` iliyowekwa kuwa `brief-history`, na kipengele cha `aside` kilicho na `class` iliyowekwa kuwa `image-wrapper`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `section`.
+
+```js
+assert(document.querySelectorAll('section')?.length === 3)
+```
+
+Kipengele chako kipya cha `section` kinafaa kuja baada ya kipengele chako cha `.text`.
+
+```js
+assert(document.querySelectorAll('section')?.[2]?.previousElementSibling?.className === 'text')
+```
+
+Kipengee chako kipya cha `section` kinapaswa kuwa na `class` iliyowekwa kuwa `text text-with-images`.
+
+```js
+assert(document.querySelectorAll('section')?.[2]?.className === 'text text-with-images')
+```
+
+Kipengele chako kipya cha `section` kinafaa kua na kipengele cha `article`.
+
+```js
+assert.exists(document.querySelector('.text-with-images article'));
+```
+
+Kipengele chako kipya cha `section` kinafaa kua na kipengele cha `aside`.
+
+```js
+assert.exists(document.querySelector('.text-with-images aside'));
+```
+
+Kipengele cha `article` kinafaa kuja kabla ya kipengele cha `aside`.
+
+```js
+assert(document.querySelector('.text-with-images article')?.nextElementSibling?.localName === 'aside');
+```
+
+Kipengee chako kipya cha `article` kinapaswa kuwa na `class` iliyowekwa kuwa `brief-history`.
+
+```js
+assert(document.querySelector('.text-with-images article')?.className === 'brief-history');
+```
+
+Kipengee chako kipya cha `aside` kinapaswa kuwa na `class` iliyowekwa kuwa `image-wrapper`.
+
+```js
+assert(document.querySelector('.text-with-images aside')?.className === 'image-wrapper');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143b97c06c3306d23d5da47.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143b97c06c3306d23d5da47.md
new file mode 100644
index 00000000000..ace4c0ce3d0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143b97c06c3306d23d5da47.md
@@ -0,0 +1,174 @@
+---
+id: 6143b97c06c3306d23d5da47
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `article`, unda kipengele cha `h3` yenye `class` iliyowekwa kuwa `list-title` na maandishi ya `A Brief History`. Chini ya hapo, unda kipengele cha `p` chenye maandishi `Of the Curriculum`. Kisha unda kipengele cha `ul` na chenye class `lists`.
+
+# --hints--
+
+Unapaswa kuunda kipengele cha `h3` ndani ya kipengele chako cha `article`.
+
+```js
+assert.exists(document.querySelector('article h3'));
+```
+
+Unapaswa kuunda kipengele cha `p` ndani ya kipengele chako cha `article`.
+
+```js
+assert.exists(document.querySelector('article p'));
+```
+
+Unapaswa kuunda kipengele cha `ul` ndani ya kipengele chako cha `article`.
+
+```js
+assert.exists(document.querySelector('article ul'));
+```
+
+Vipengele vyako ndani ya kipengele cha `article` vinapaswa kuwa katika mpangilio sahihi.
+
+```js
+const children = document.querySelector('article')?.children;
+assert(children?.[0]?.localName === 'h3');
+assert(children?.[1]?.localName === 'p');
+assert(children?.[2]?.localName === 'ul');
+```
+
+Kipengee chako kipya cha `h3` kinapaswa kuwa na `class` iliyowekwa kuwa `list-title`.
+
+```js
+assert(document.querySelector('article h3')?.className === 'list-title');
+```
+
+Kipengele chako kipya cha `h3` kinafaa kuwa na maandishi `A Brief History`.
+
+```js
+assert(document.querySelector('article h3')?.innerText === 'A Brief History');
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na maandishi `Of the Curriculum`.
+
+```js
+assert(document.querySelector('article p')?.innerText === 'Of the Curriculum');
+```
+
+Kipengee chako kipya cha `ul` kinapaswa kuwa na `class` iliyowekwa kuwa `lists`.
+
+```js
+assert(document.querySelector('article ul')?.className === 'lists');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143b9e1f5035c6e5f2a8231.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143b9e1f5035c6e5f2a8231.md
new file mode 100644
index 00000000000..d98e7b6d5bb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143b9e1f5035c6e5f2a8231.md
@@ -0,0 +1,228 @@
+---
+id: 6143b9e1f5035c6e5f2a8231
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Ndani ya kipengele hicho cha `ul`, unda vipengele sita vya `li`. Ongeza kipengele cha `h4` chenye `class` iliyowekwa kuwa `list-subtitle` na kipengele cha `p` kwa kila vipengele vya `li`.
+
+Kisha upe vipengele vya `h4` na `p` maudhui ya maandishi yafuatayo, kwa mpangilio, na kila `h4` ukitumia kile kilicho upande wa kushoto wa koloni, na kila `p` kwa kutumia kilicho upande wa kulia:
+
+- `V1 - 2014`: `We launched freeCodeCamp with a simple list of 15 resources, including Harvard's CS50 and Stanford's Database Class.`
+- `V2 - 2015`: `We added interactive algorithm challenges.`
+- `V3 - 2015`: `We added our own HTML+CSS challenges (before we'd been relying on General Assembly's Dash course for these).`
+- `V4 - 2016`: `We expanded the curriculum to 3 certifications, including Front End, Back End, and Data Visualization. They each had 10 required projects, but only the Front End section had its own challenges. For the other certs, we were still using external resources like Node School.`
+- `V5 - 2017`: `We added the back end and data visualization challenges.`
+- `V6 - 2018`: `We launched 6 new certifications to replace our old ones. This was the biggest curriculum improvement to date.`
+
+# --hints--
+
+Kipengele chako cha `ul` kinafaa kuwa na vipengele sita vya `li`.
+
+```js
+assert(document.querySelectorAll('.lists li')?.length === 6);
+```
+
+Kila moja ya vipengele vyako vipya vya `li` inapaswa kuwa na kipengele cha `h4` na `p`.
+
+```js
+const lis = [...document.querySelectorAll('.lists li')];
+assert(lis?.every(li => li?.children?.[0]?.localName === 'h4' && li?.children?.[1]?.localName === 'p'));
+```
+
+`h4` yako ya kwanza inapaswa kuwa na maandishi `V1 - 2014`.
+
+```js
+assert(document.querySelectorAll('.lists li h4')?.[0]?.innerText === 'V1 - 2014');
+```
+
+`p` yako ya kwanza inapaswa kuwa na maandishi `We launched freeCodeCamp with a simple list of 15 resources, including Harvard's CS50 and Stanford's Database Class.`
+
+```js
+assert(document.querySelectorAll('.lists li p')?.[0]?.innerText === 'We launched freeCodeCamp with a simple list of 15 resources, including Harvard\'s CS50 and Stanford\'s Database Class.');
+```
+
+`h4` yako ya pili inapaswa kuwa na maandishi `V2 - 2015`.
+
+```js
+assert(document.querySelectorAll('.lists li h4')?.[1]?.innerText === 'V2 - 2015');
+```
+
+`p` yako ya pili inapaswa kuwa na maandishi `We added interactive algorithm challenges.`
+
+```js
+assert(document.querySelectorAll('.lists li p')?.[1]?.innerText === 'We added interactive algorithm challenges.');
+```
+
+`h4` yako ya tatu inapaswa kuwa na maandishi `V3 - 2015`.
+
+```js
+assert(document.querySelectorAll('.lists li h4')?.[2]?.innerText === 'V3 - 2015');
+```
+
+`p` yako ya tatu inapaswa kuwa na maandishi `We added our own HTML+CSS challenges (before we'd been relying on General Assembly's Dash course for these).`
+
+```js
+assert(document.querySelectorAll('.lists li p')?.[2]?.innerText === 'We added our own HTML+CSS challenges (before we\'d been relying on General Assembly\'s Dash course for these).');
+```
+
+`h4` yako ya nne inapaswa kuwa na maandishi `V4 - 2016`.
+
+```js
+assert(document.querySelectorAll('.lists li h4')?.[3]?.innerText === 'V4 - 2016');
+```
+
+`p` yako ya nne inapaswa kuwa na maandishi `We expanded the curriculum to 3 certifications, including Front End, Back End, and Data Visualization. They each had 10 required projects, but only the Front End section had its own challenges. For the other certs, we were still using external resources like Node School`.
+
+```js
+assert(document.querySelectorAll('.lists li p')?.[3]?.innerText === 'We expanded the curriculum to 3 certifications, including Front End, Back End, and Data Visualization. They each had 10 required projects, but only the Front End section had its own challenges. For the other certs, we were still using external resources like Node School.');
+```
+
+`h4` yako ya tano inapaswa kuwa na maandishi `V5 - 2017`.
+
+```js
+assert(document.querySelectorAll('.lists li h4')?.[4]?.innerText === 'V5 - 2017');
+```
+
+`p` yako ya tano inapaswa kuwa na maandishi `We added the back end and data visualization challenges.`
+
+```js
+assert(document.querySelectorAll('.lists li p')?.[4]?.innerText === 'We added the back end and data visualization challenges.');
+```
+
+`h4` yako ya sita inapaswa kuwa na maandishi `V6 - 2018`.
+
+```js
+assert(document.querySelectorAll('.lists li h4')?.[5]?.innerText === 'V6 - 2018');
+```
+
+`p` yako ya sita inapaswa kuwa na maandishi `We launched 6 new certifications to replace our old ones. This was the biggest curriculum improvement to date.`
+
+```js
+assert(document.querySelectorAll('.lists li p')?.[5]?.innerText === 'We launched 6 new certifications to replace our old ones. This was the biggest curriculum improvement to date.');
+```
+
+Vipengele vyako sita vya `h4` kila kimoja kinapaswa kuwa na class yla `list-subtitle`.
+
+```js
+const h4s = [...document.querySelectorAll('.lists li h4')];
+assert(h4s?.every(h4 => h4?.classList?.contains('list-subtitle')));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+--fcc-editable-region--
+
+ A Brief History
+ Of the Curriculum
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143bb50e8e48c6f5ef9d8d5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143bb50e8e48c6f5ef9d8d5.md
new file mode 100644
index 00000000000..3a12e78aec6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143bb50e8e48c6f5ef9d8d5.md
@@ -0,0 +1,195 @@
+---
+id: 6143bb50e8e48c6f5ef9d8d5
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `aside`, unda vipengele viwili vya `img`, kipengele cha `blockquote` na kipengele cha tatu cha `img`. Kipe kipengele cha `blockquote` `class` iliyowekwa kuwa `image-quote`.
+
+# --hints--
+
+Unapaswa kuunda vipengele vitatu vya `img` ndani ya kipengele chako cha `aside`.
+
+```js
+assert(document.querySelectorAll('aside img')?.length === 3);
+```
+
+Unapaswa kuunda kipengele cha `blockquote` ndani ya kipengele chako cha `aside`.
+
+```js
+assert.exists(document.querySelector('aside blockquote'));
+```
+
+Kipengele chako cha `blockquote` kinapaswa kuwa na `class` iliyowekwa kuwa `image-quote`.
+
+```js
+assert(document.querySelector('aside blockquote')?.classList?.contains('image-quote'));
+```
+
+Vipengele vyako vipya vinapaswa kuwa katika mpangilio sahihi.
+
+```js
+const children = document.querySelector('aside')?.children;
+assert(children?.[0]?.localName === 'img');
+assert(children?.[1]?.localName === 'img');
+assert(children?.[2]?.localName === 'blockquote');
+assert(children?.[3]?.localName === 'img');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143c2a363865c715f1a3f72.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143c2a363865c715f1a3f72.md
new file mode 100644
index 00000000000..673ceff1a29
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143c2a363865c715f1a3f72.md
@@ -0,0 +1,206 @@
+---
+id: 6143c2a363865c715f1a3f72
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Ndani ya kipengele cha `.image-wrapper`, kipe kipengele chako cha kwanza cha `img` `src` ya `https://cdn.freecodecamp.org/testable-projects-fcc/images/random-quote-machine.png`, `alt` ya `image of the quote machine project`, `class` ya `image-1`, sifa ya `loading` iliyowekwa kuwa `lazy`, sifa ya `width` ya `600`, na sifa ya `height` ya `400`.
+
+# --hints--
+
+Kipengele chako cha kwanza cha `img` kinapaswa kuwa na sifa ya `src` iliyowekwa kuwa `https://cdn.freecodecamp.org/testable-projects-fcc/images/random-quote-machine.png`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[0]?.getAttribute('src') === 'https://cdn.freecodecamp.org/testable-projects-fcc/images/random-quote-machine.png');
+```
+
+Kipengele chako cha kwanza cha `img` kinapaswa kuwa na sifa ya `alt` iliyowekwa kwa `image of the quote machine project`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[0]?.getAttribute('alt') === 'image of the quote machine project');
+```
+
+Kipengele chako cha kwanza cha `img` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `image-1`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[0]?.classList?.contains('image-1'));
+```
+
+Kipengele chako cha kwanza cha `img` kinapaswa kuwa na sifa ya `loading` iliyowekwa kuwa `lazy`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[0]?.getAttribute('loading') === 'lazy');
+```
+
+Kipengele chako cha kwanza cha `img` kinapaswa kuwa na sifa ya `width` iliyowekwa kuwa `600`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[0]?.getAttribute('width') === '600');
+```
+
+Kipengele chako cha kwanza cha `img` kinapaswa kuwa na sifa ya `height` iliyowekwa kuwa `400`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[0]?.getAttribute('height') === '400');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143cd08fe927072ca3a371d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143cd08fe927072ca3a371d.md
new file mode 100644
index 00000000000..22fd7fc8753
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143cd08fe927072ca3a371d.md
@@ -0,0 +1,213 @@
+---
+id: 6143cd08fe927072ca3a371d
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Ndani ya kipengele cha `.image-wrapper`, kipe kipengele chako cha pili cha `img` `src` ya `https://cdn.freecodecamp.org/testable-projects-fcc/images/calc.png`, `alt` ya `image of a calculator project`, sifa ya `loading` iliyowekwa kuwa `lazy`, `class` ya `image-2`, sifa ya `width` ya `400`, na sifa ya `height` ya `400`.
+
+# --hints--
+
+Kipengele chako cha pili cha `img` kinapaswa kuwa na sifa ya `src` iliyowekwa kuwa `https://cdn.freecodecamp.org/testable-projects-fcc/images/calc.png`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[1]?.getAttribute('src') === 'https://cdn.freecodecamp.org/testable-projects-fcc/images/calc.png');
+```
+
+Kipengele chako cha pili cha `img` kinapaswa kuwa na sifa ya `alt` iliyowekwa kwa `image of a calculator project`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[1]?.getAttribute('alt') === 'image of a calculator project');
+```
+
+Kipengele chako cha pili cha `img` kinapaswa kuwa na sifa ya `loading` iliyowekwa kuwa `lazy`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[1]?.getAttribute('loading') === 'lazy');
+```
+
+Kipengele chako cha pili cha `img` kinapaswa kuwa na `class` iliyowekwa kuwa `image-2`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[1]?.classList?.contains('image-2'));
+```
+
+Kipengele chako cha pili cha `img` kinapaswa kuwa na sifa ya `width` iliyowekwa kuwa `400`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[1]?.getAttribute('width') === '400');
+```
+
+Kipengele chako cha pili cha `img` kinapaswa kuwa na sifa ya `height` iliyowekwa kuwa `400`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[1]?.getAttribute('height') === '400');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143cdf48b634a747de42104.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143cdf48b634a747de42104.md
new file mode 100644
index 00000000000..8f54cdd56c0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143cdf48b634a747de42104.md
@@ -0,0 +1,220 @@
+---
+id: 6143cdf48b634a747de42104
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Ndani ya kipengele cha `.image-wrapper`, kipe kipengele chako cha pili cha `img` `src` ya `https://cdn.freecodecamp.org/testable-projects-fcc/images/survey-form-background.jpeg`, `alt` ya `four people working on code`, sifa ya `loading` iliyowekwa kuwa `lazy`, `class` ya `image-3`, sifa ya `width` ya `600`, na sifa ya `height` ya `400`.
+
+# --hints--
+
+Kipengele chako cha tatu cha `img` kinapaswa kuwa na sifa ya `src` iliyowekwa kuwa `https://cdn.freecodecamp.org/testable-projects-fcc/images/survey-form-background.jpeg`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[2]?.getAttribute('src') === 'https://cdn.freecodecamp.org/testable-projects-fcc/images/survey-form-background.jpeg');
+```
+
+Kipengele chako cha tatu cha `img` kinapaswa kuwa na sifa ya `alt` iliyowekwa kwa `four people working on code`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[2]?.getAttribute('alt') === 'four people working on code');
+```
+
+Kipengele chako cha tatu cha `img` kinapaswa kuwa na sifa ya `loading` iliyowekwa kuwa `lazy`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[2]?.getAttribute('loading') === 'lazy');
+```
+
+Kipengele chako cha tatu cha `img` kinapaswa kuwa na `class` iliyowekwa kuwa `image-3`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[2]?.classList?.contains('image-3'));
+```
+
+Kipengele chako cha tatu cha `img` kinapaswa kuwa na sifa ya `width` iliyowekwa kuwa `600`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[2]?.getAttribute('width') === '600');
+```
+
+Kipengele chako cha tatu cha `img` kinapaswa kuwa na sifa ya `height` iliyowekwa kuwa `400`.
+
+```js
+assert(document.querySelectorAll('.image-wrapper img')?.[2]?.getAttribute('height') === '400');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143d003ad9e9d76766293ec.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143d003ad9e9d76766293ec.md
new file mode 100644
index 00000000000..d3248b18a26
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143d003ad9e9d76766293ec.md
@@ -0,0 +1,226 @@
+---
+id: 6143d003ad9e9d76766293ec
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `.image-quote`, weka kipengele cha `hr`, kipengele cha `p` na kipengele cha pili cha `hr`. Kipe kipengele cha `p` `class` iliyowekwa kuwa `quote` na maandishi `The millions of people who are learning to code through freeCodeCamp will have an even better resource to help them learn these fundamentals.`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `hr` kwenye kipengele chako `.image-quote`.
+
+```js
+assert(document.querySelectorAll('.image-quote hr')?.length === 2);
+```
+
+Unapaswa kuongeza kipengele cha `p` kwenye kipengele chako `.image-quote`.
+
+```js
+assert(document.querySelectorAll('.image-quote p')?.length === 1);
+```
+
+Watoto wako `.image-quote` wanapaswa kuwa katika mpangilio sahihi.
+
+```js
+const children = document.querySelector('.image-quote')?.children;
+assert(children?.[0]?.localName === 'hr');
+assert(children?.[1]?.localName === 'p');
+assert(children?.[2]?.localName === 'hr');
+```
+
+Kipengee chako cha `p` kinapaswa kuwa na `class` iliyowekwa kuwa `quote`.
+
+```js
+assert(document.querySelector('.image-quote p')?.classList.contains('quote'));
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `The millions of people who are learning to code through freeCodeCamp will have an even better resource to help them learn these fundamentals.`.
+
+```js
+assert(document.querySelector('.image-quote p')?.innerText === 'The millions of people who are learning to code through freeCodeCamp will have an even better resource to help them learn these fundamentals.');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143d2842b497779bad947de.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143d2842b497779bad947de.md
new file mode 100644
index 00000000000..386ae11a3d2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6143d2842b497779bad947de.md
@@ -0,0 +1,225 @@
+---
+id: 6143d2842b497779bad947de
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Ili kuanzisha CSS yako, rekebisha sheria za CSS kwa kulenga vipengele vyote kwa `*`, ikiwa ni pamoja na viteuzi bandia vya `::before` na `::after`.
+
+Weka sifa zote mbili za `padding` na `margin` kuwa `0` na uweke sifa ya `box-sizing` kuwa `border-box`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi vya `*, ::before, ::after`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*, ::before, ::after'));
+```
+
+Kichaguzi chako cha `*, ::before, ::after` kinapaswa kuwa na sifa ya `padding` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*, ::before, ::after')?.padding === '0px');
+```
+
+Kichaguzi chako cha `*, ::before, ::after` kinapaswa kuwa na sifa ya `margin` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*, ::before, ::after')?.margin === '0px');
+```
+
+Kichaguzi chako cha `*, ::before, ::after` kinapaswa kuwa na sifa ya `box-sizing` iliyowekwa kuwa `border-box`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*, ::before, ::after')?.boxSizing === 'border-box');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144d66a5358db0c80628757.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144d66a5358db0c80628757.md
new file mode 100644
index 00000000000..5c9cfd3c441
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144d66a5358db0c80628757.md
@@ -0,0 +1,219 @@
+---
+id: 6144d66a5358db0c80628757
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Unda kichaguzi cha `html` na ukipe `font-size` iliyowekwa kuwa `62.5%`. Hii itaweka saizi chaguo-msingi ya fonti kwa ukurasa wako wa wavuti kuwa 10px (chaguo-msingi ya kivinjari ni 16px).
+
+Hii itarahisisha kufanya kazi na vitengo vya `rem` baadaye, kwani `2rem` itakuwa 20px.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `html`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html'));
+```
+
+Kichaguzi chako cha `html` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `62.5%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html')?.fontSize === '62.5%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144d7dbdd3e580da730ff45.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144d7dbdd3e580da730ff45.md
new file mode 100644
index 00000000000..d18b0027f08
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144d7dbdd3e580da730ff45.md
@@ -0,0 +1,234 @@
+---
+id: 6144d7dbdd3e580da730ff45
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Unda kichaguzi cha `body`. Weka sifa ya `font-family` kuwa `Baskervville`, na njia mbadala ya `serif`. Weka sifa ya `color` kuwa `linen` na sifa ya `background-color` kuwa `rgb(20, 30, 40)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `body`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+Kichaguzi chako cha `body` kinafaa kuwa na sifa ya `font-family` iliyowekwa kuwa `Baskervville`, yenye mrengo mbadala wa `serif`.
+
+```js
+const fontFamily = new __helpers.CSSHelp(document).getStyle('body')?.fontFamily;
+assert(fontFamily === 'Baskervville, serif' || fontFamily === `"Baskervville", serif`);
+```
+
+Kichaguzi chako cha `body` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `linen`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.color === 'linen');
+```
+
+Kichaguzi chako cha `body` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(20, 30, 40)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.backgroundColor === 'rgb(20, 30, 40)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144de308591ec10e27d5383.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144de308591ec10e27d5383.md
new file mode 100644
index 00000000000..3ace81a1ef6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144de308591ec10e27d5383.md
@@ -0,0 +1,228 @@
+---
+id: 6144de308591ec10e27d5383
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Unda kichaguzi cha `h1`, na uweke sifa ya `font-family` kuwa `Anton` na njia mbadala ya `sans-serif`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `h1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1'));
+```
+
+Kichaguzi chako cha `h1` kinafaa kuwa na sifa ya `font-family` iliyowekwa kuwa `Anton`, yenye njia mbadala ya `sans-serif`.
+
+```js
+const fontFamily = new __helpers.CSSHelp(document).getStyle('h1')?.fontFamily;
+assert(fontFamily === 'Anton, sans-serif' || fontFamily === `"Anton", sans-serif`);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144e1ba93e435127a7f516d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144e1ba93e435127a7f516d.md
new file mode 100644
index 00000000000..1e738722f9e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144e1ba93e435127a7f516d.md
@@ -0,0 +1,232 @@
+---
+id: 6144e1ba93e435127a7f516d
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Unda kichaguzi cha `h2, h3, h4, h5, h6`. Ipe sifa ya `font-family` iliyowekwa kuwa `Raleway` yenye njia mbadala ya `sans-serif`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `h2, h3, h4, h5, h6`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h2, h3, h4, h5, h6'));
+```
+
+Kichaguzi chako cha `h2, h3, h4, h5, h6` kinafaa kuwa na sifa ya `font-family` iliyowekwa kuwa `Raleway`, yenye njia mbadala ya `sans-serif`.
+
+```js
+const fontFamily = new __helpers.CSSHelp(document).getStyle('h2, h3, h4, h5, h6')?.fontFamily;
+assert(fontFamily === 'Raleway, sans-serif' || fontFamily === `"Raleway", sans-serif`);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144ee46a9d6e614c598cc05.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144ee46a9d6e614c598cc05.md
new file mode 100644
index 00000000000..7b3301b1bee
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144ee46a9d6e614c598cc05.md
@@ -0,0 +1,241 @@
+---
+id: 6144ee46a9d6e614c598cc05
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Unda kichaguzi cha `a`, na uipe sifa ya `text-decoration` iliyowekwa kuwa `none` na sifa ya `color` iliyowekwa kuwa `linen`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `a`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('a'));
+```
+
+Kichaguzi chako cha `a` kinafaa kuwa na sifa ya `text-decoration` iliyowekwa kuwa `none`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('a')?.textDecoration === 'none');
+```
+
+Kichaguzi chako cha `a` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `linen`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('a')?.color === 'linen');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144ee790af79815ad15a832.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144ee790af79815ad15a832.md
new file mode 100644
index 00000000000..a62605d12fe
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144ee790af79815ad15a832.md
@@ -0,0 +1,242 @@
+---
+id: 6144ee790af79815ad15a832
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Sasa uko tayari kuanza kuweka pamoja mpangilio wa gridi. Gridi ya CSS inatoa mpangilio wa msingi wa gridi ya pande mbili, unaokuruhusu kuweka vipengee katikati kwa usawa na wima huku ukiendelea kubaki na udhibiti wa kufanya mambo kama vile vipengele vinavyoingiliana.
+
+Anza kwa kuunda kichaguzi cha `main` na ukipe sifa ya `display` iliyowekwa kuwa `grid`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `main`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('main'));
+```
+
+Kichaguzi chako cha `main` kinafaa kuwa na sifa ya `display` iliyowekwa kuwa `grid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('main')?.display === 'grid');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f1410990ea17187a722b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f1410990ea17187a722b.md
new file mode 100644
index 00000000000..842c007e035
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f1410990ea17187a722b.md
@@ -0,0 +1,238 @@
+---
+id: 6144f1410990ea17187a722b
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Sasa unaweza kuweka mtindo wa mpangilio wa gridi yako. Gridi ya CSS ni sawa na Flexbox kwa kuwa ina sifa maalum kwa vipengele vya mzazi na mtoto.
+
+Katika hali hii, kipengee mzazi ndicho `main`. Weka maudhui yawe na mpangilio wa safu wima tatu kwa kuongeza `grid-template-columns` yenye thamani ya `1fr 94rem 1fr`. Hii itaunda safu wima tatu ambapo safu wima ya kati ina upana wa `94rem`, na safu wima ya kwanza na ya mwisho zote ni sehemu 1 ya nafasi iliyobaki katika kontena la gridi.
+
+# --hints--
+
+Sehemu yako ya `main` inapaswa kuwa na sifa ya `grid-template-columns` iliyowekwa kuwa `1fr 94rem 1fr`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('main')?.gridTemplateColumns === '1fr 94rem 1fr');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+--fcc-editable-region--
+main {
+ display: grid;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f3818bfbc51844152e36.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f3818bfbc51844152e36.md
new file mode 100644
index 00000000000..a7e6113b718
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f3818bfbc51844152e36.md
@@ -0,0 +1,239 @@
+---
+id: 6144f3818bfbc51844152e36
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Tumia kitendakazi cha `minmax` ili kufanya safu wima zako ziingiane kwenye kifaa chochote. Kitendakazi cha `minmax` huchukua hoja mbili, ya kwanza ikiwa thamani ya chini na ya pili ikiwa ya juu zaidi. Thamani hizi zinaweza kuwa urefu, asilimia, `fr`, au hata neno kuu kama `max-content`.
+
+Funga kila thamani iliyobainishwa ya sifa ya `grid-template-columns` katika kitendakazi cha `minmax`, ukitumia kila thamani kama hoja ya pili. Hoja ya kwanza inapaswa kuwa `2rem`, `min-content`, na `2rem` mtawalia.
+
+# --hints--
+
+Kichaguzi chako cha `main` kinapaswa kuwa na sifa ya `grid-template-columns` iliyowekwa kuwa `minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('main')?.gridTemplateColumns === 'minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+--fcc-editable-region--
+main {
+ display: grid;
+ grid-template-columns: 1fr 94rem 1fr;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f42204c8c8195f1f3345.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f42204c8c8195f1f3345.md
new file mode 100644
index 00000000000..2a8f7e8e28c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f42204c8c8195f1f3345.md
@@ -0,0 +1,237 @@
+---
+id: 6144f42204c8c8195f1f3345
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Ili kuongeza nafasi kati ya safu mlalo katika mpangilio wa gridi, unaweza kutumia sifa ya `row-gap`. Kipe kichaguzi cha `main` sifa ya `row-gap` ya `3rem`.
+
+# --hints--
+
+Kichaguzi chako cha `main` kinafaa kuwa na sifa ya `row-gap` iliyowekwa kuwa `3rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('main')?.rowGap === '3rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+--fcc-editable-region--
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f47b7c631e1a6f304dd5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f47b7c631e1a6f304dd5.md
new file mode 100644
index 00000000000..5214d45ed75
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6144f47b7c631e1a6f304dd5.md
@@ -0,0 +1,250 @@
+---
+id: 6144f47b7c631e1a6f304dd5
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Jarida lako litakuwa na sehemu tatu za msingi. Tayari umeweka mpangilio wa jumla katika sheria ya `main`, lakini unaweza kurekebisha uwekaji katika sheria za mtoto.
+
+Chaguo mojawapo ni sifa ya `grid-column`, ambayo ni mkato wa `grid-column-start` na `grid-column-end`. Sifa ya `grid-column` huambia kipengee cha gridi na mstari wa gridi pa kuanzia na kumalizia.
+
+Unda sheria ya `.heading` na uweke sifa ya `grid-column` kuwa `2 / 3`. Hii itaambia kipengele cha `.heading` kianzie kwenye mstari wa gridi ya 2 na kuishia kwenye mstari wa gridi ya 3.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.heading`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.heading'));
+```
+
+Kichaguzi chako cha `.heading` kinafaa kuwa na sifa ya `grid-column` iliyowekwa kuwa `2 / 3`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.heading')?.gridColumn === '2 / 3');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b07081759c2c691166a9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b07081759c2c691166a9.md
new file mode 100644
index 00000000000..b0cdf577ddb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b07081759c2c691166a9.md
@@ -0,0 +1,250 @@
+---
+id: 6148b07081759c2c691166a9
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Unda kichaguzi cha `.text` na ukipe sifa ya `grid-column` iliyowekwa kuwa `2 / 3`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.text`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text'));
+```
+
+Kichaguzi chako cha `.text` kinafaa kuwa na sifa ya `grid-column` iliyowekwa kuwa `2 / 3`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text')?.gridColumn === '2 / 3');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+.heading {
+ grid-column: 2 / 3;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b0d764e4192e5712ed92.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b0d764e4192e5712ed92.md
new file mode 100644
index 00000000000..a24a4db6b21
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b0d764e4192e5712ed92.md
@@ -0,0 +1,248 @@
+---
+id: 6148b0d764e4192e5712ed92
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Kwa udhibiti wa ziada juu ya mpangilio wa maudhui yako, unaweza kuwa na Gridi ya CSS ndani ya Gridi ya CSS.
+
+Weka sifa ya `display` ya kichaguzi chako cha `.heading` kuwa `grid`.
+
+# --hints--
+
+Kichaguzi chako cha `.heading` kinafaa kuwa na sifa ya `display` iliyowekwa kuwa `grid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.heading')?.display === 'grid');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying
+ on General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This
+ was the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*, ::before, ::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+--fcc-editable-region--
+.heading {
+ grid-column: 2 / 3;
+}
+--fcc-editable-region--
+
+.text {
+ grid-column: 2 / 3;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b185ef37522f688316b0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b185ef37522f688316b0.md
new file mode 100644
index 00000000000..f12b14dd325
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b185ef37522f688316b0.md
@@ -0,0 +1,253 @@
+---
+id: 6148b185ef37522f688316b0
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Sasa unaweza kuweka mtindo wa maudhui ya kipengele cha `.heading` kwa kutumia Gridi ya CSS.
+
+Kitendakazi cha CSS cha `repeat()` hutumika kurudia thamani, badala ya kuiandika mwenyewe, na inasaidia kwa mipangilio ya gridi. Kwa mfano, kuweka sifa ya `grid-template-columns` kuwa `repeat(20, 200px)` kunaweza kuunda safu wima 20 kila moja ikiwa na upana wa `200px`.
+
+Kipe kipengele chako cha `.heading` sifa ya `grid-template-columns` iliyowekwa kuwa `repeat(2, 1fr)` ili kuunda safu wima mbili za upana sawa.
+
+# --hints--
+
+Kichaguzi chako cha `.heading` kinafaa kuwa na sifa ya `grid-template-columns` iliyowekwa kuwa `repeat(2, 1fr)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.heading')?.gridTemplateColumns === 'repeat(2, 1fr)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+--fcc-editable-region--
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+}
+--fcc-editable-region--
+
+.text {
+ grid-column: 2 / 3;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b30464daf630848c21d4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b30464daf630848c21d4.md
new file mode 100644
index 00000000000..9961c469b44
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b30464daf630848c21d4.md
@@ -0,0 +1,250 @@
+---
+id: 6148b30464daf630848c21d4
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Kipe kichaguzi cha `.heading` sifa ya `row-gap` ya `1.5rem`.
+
+# --hints--
+
+Kichaguzi chako cha `.heading` kinafaa kuwa na sifa ya `row-gap` iliyowekwa kuwa `1.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.heading')?.rowGap === '1.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+--fcc-editable-region--
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+}
+--fcc-editable-region--
+
+.text {
+ grid-column: 2 / 3;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b4b150434734143db6f2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b4b150434734143db6f2.md
new file mode 100644
index 00000000000..6090705daec
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b4b150434734143db6f2.md
@@ -0,0 +1,261 @@
+---
+id: 6148b4b150434734143db6f2
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Kumbuka kwamba sifa ya `grid-column` huamua ni safu wima gani kipengele kinaanza na kuishia. Kunaweza kuwa na wakati ambapo huna uhakika ni safu wima ngapi za gridi yako, lakini unataka kipengee kisimame kwenye safu wima ya mwisho. Ili kufanya hivyo, unaweza kutumia `-1` kwa safu wima ya mwisho.
+
+Unda kichaguzi cha `.hero` na ukipe sifa ya `grid-column` iliyowekwa kuwa `1 / -1`. Hii itaambia kipengee kueneza upana kamili wa gridi.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.hero`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero'));
+```
+
+Kichaguzi chako cha `.hero` kinafaa kuwa na sifa ya `grid-column` iliyowekwa kuwa `1 / -1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero')?.gridColumn === '1 / -1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b5623efa8f369f2c3643.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b5623efa8f369f2c3643.md
new file mode 100644
index 00000000000..6efd631a7a4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b5623efa8f369f2c3643.md
@@ -0,0 +1,255 @@
+---
+id: 6148b5623efa8f369f2c3643
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Kipe kichaguzi cha `.hero` sifa ya `position` iliyowekwa kuwa `relative`.
+
+# --hints--
+
+Kichaguzi chako cha `.hero` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `relative`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero')?.position === 'relative');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+--fcc-editable-region--
+.hero {
+ grid-column: 1 / -1;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b59ef318e03875f35c4a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b59ef318e03875f35c4a.md
new file mode 100644
index 00000000000..6a689088f11
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148b59ef318e03875f35c4a.md
@@ -0,0 +1,271 @@
+---
+id: 6148b59ef318e03875f35c4a
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Unda kichaguzi cha `img`, na uipe sifa ya `width` iliyowekwa kuwa `100%` na sifa ya `object-fit` iliyowekwa kuwa `cover`.
+
+Sifa ya `object-fit` huambia kivinjari jinsi ya kuweka kipengele ndani ya container. Katika hali hii, `cover` itaweka picha kujaza chombo, ikipunguza inavyohitajika ili kuepuka kubadilisha uwiano.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `img`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('img'));
+```
+
+Kichaguzi chako cha `img` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `100%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('img')?.width === '100%');
+```
+
+Kichaguzi chako cha `img` kinafaa kuwa na sifa ya `object-fit` iliyowekwa kuwa `cover`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('img')?.objectFit === 'cover');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bd62bbb8c83a5f1fc1b3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bd62bbb8c83a5f1fc1b3.md
new file mode 100644
index 00000000000..203a9dd521a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bd62bbb8c83a5f1fc1b3.md
@@ -0,0 +1,280 @@
+---
+id: 6148bd62bbb8c83a5f1fc1b3
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Unda kichaguzi cha `.hero-title` na ukipe sifa ya `text-align` iliyowekwa kuwa `center`, sifa ya `color` iliyowekwa kuwa `orangered` na sifa ya `font-size` iliyowekwa kuwa `8rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.hero-title`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero-title'));
+```
+
+Kichaguzi chako cha `.hero-title` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `center`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero-title')?.textAlign === 'center');
+```
+
+Kichaguzi chako cha `.hero-title` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `orangered`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero-title')?.color === 'orangered');
+```
+
+Kichaguzi chako cha `.hero-title` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `8rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero-title')?.fontSize === '8rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148be3d605d6b3ca9425d11.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148be3d605d6b3ca9425d11.md
new file mode 100644
index 00000000000..5f8ec576cc9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148be3d605d6b3ca9425d11.md
@@ -0,0 +1,286 @@
+---
+id: 6148be3d605d6b3ca9425d11
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Manukuu pia yanahitaji kutengenezwa kwa mtindo. Unda kichaguzi cha `.hero-subtitle` na ukipe sifa ya `font-size` iliyowekwa kuwa `2.4rem`, sifa ya `color` iliyowekwa kuwa `orangered` na sifa ya `text-align` iliyowekwa kuwa `center`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.hero-subtitle`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero-subtitle'));
+```
+
+Kichaguzi chako cha `.hero-subtitle` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `2.4rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero-subtitle')?.fontSize === '2.4rem');
+```
+
+Kichaguzi chako cha `.hero-subtitle` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `orangered`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero-subtitle')?.color === 'orangered');
+```
+
+Kichaguzi chako cha `.hero-subtitle` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `center`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.hero-subtitle')?.textAlign === 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148be82ca63c63daa8cca49.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148be82ca63c63daa8cca49.md
new file mode 100644
index 00000000000..a1c44e99d60
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148be82ca63c63daa8cca49.md
@@ -0,0 +1,287 @@
+---
+id: 6148be82ca63c63daa8cca49
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Unda kichaguzi cha `.author` na ukipe sifa ya `font-size` iliyowekwa kuwa `2rem` na sifa ya `font-family` iliyowekwa kuwa `Raleway` kwa njia mbadala ya `sans-serif`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.author`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.author'));
+```
+
+Kichaguzi chako cha `.author` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `2rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.author')?.fontSize === '2rem');
+```
+
+Kichaguzi chako cha `.author` kinafaa kuwa na sifa ya `font-family` iliyowekwa kuwa `Raleway`, yenye njia mbadala ya `sans-serif`.
+
+```js
+const fontFamily = new __helpers.CSSHelp(document).getStyle('.author')?.fontFamily;
+assert(fontFamily === 'Raleway, sans-serif' || fontFamily === `"Raleway", sans-serif`);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bf49fcc7913f05dbf9b7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bf49fcc7913f05dbf9b7.md
new file mode 100644
index 00000000000..dab8dd3f6a5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bf49fcc7913f05dbf9b7.md
@@ -0,0 +1,287 @@
+---
+id: 6148bf49fcc7913f05dbf9b7
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Unda kichaguzi cha `.author-name a:hover` na ukipe sifa ya `background-color` iliyowekwa kuwa `#306203`.
+
+Hii itaunda athari ya kuelea tu kwa kipengele cha `a` ndani ya `.author-name`, kuonyesha asili ya kijani ya freeCodeCamp katika usuli.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.author-name a:hover`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.author-name a:hover'));
+```
+
+Kichaguzi chako cha `.author-name a:hover` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#306203`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.author-name a:hover')?.backgroundColor === 'rgb(48, 98, 3)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bfc43df3bc40fe0e6405.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bfc43df3bc40fe0e6405.md
new file mode 100644
index 00000000000..e7df392c10f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148bfc43df3bc40fe0e6405.md
@@ -0,0 +1,289 @@
+---
+id: 6148bfc43df3bc40fe0e6405
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Unda kichaguzi cha `.publish-date` na ukipe sifa ya `color` ya `rgba(255, 255, 255, 0.5)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.publish-date`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.publish-date'));
+```
+
+Kichaguzi chako cha `.publish-date` kinapaswa kuwa na sifa ya `color` iliyowekwa kuwa `rgba(255, 255, 255, 0.5)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.publish-date')?.color === 'rgba(255, 255, 255, 0.5)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c004ffc8434252940dc3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c004ffc8434252940dc3.md
new file mode 100644
index 00000000000..d22c0cf9592
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c004ffc8434252940dc3.md
@@ -0,0 +1,299 @@
+---
+id: 6148c004ffc8434252940dc3
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Unda kichaguzi cha `.social-icons`. Ipe sifa ya `display` iliyowekwa kuwa `grid`, na sifa ya `font-size` iliyowekwa `3rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.social-icons`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.social-icons'));
+```
+
+Kichaguzi chako cha `.social-icons` kinafaa kuwa na sifa ya `display` iliyowekwa kuwa `grid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.social-icons')?.display === 'grid');
+```
+
+Kichaguzi chako cha `.social-icons` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `3rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.social-icons')?.fontSize === '3rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c224ecb157439bc5247c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c224ecb157439bc5247c.md
new file mode 100644
index 00000000000..a50a4890ccb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c224ecb157439bc5247c.md
@@ -0,0 +1,290 @@
+---
+id: 6148c224ecb157439bc5247c
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Mipangilio chaguomsingi ya Gridi ya CSS itaunda safu mlalo za ziada inavyohitajika, tofauti na Flexbox. Kipe kipengele chako cha `.social-icons` sifa ya `grid-template-columns` iliyowekwa kuwa `repeat(5, 1fr)` ili kupanga aikoni katika safu moja.
+
+# --hints--
+
+Kichaguzi chako cha `.social-icons` kinafaa kuwa na sifa ya `grid-template-columns` iliyowekwa kuwa `repeat(5, 1fr)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.social-icons')?.gridTemplateColumns === 'repeat(5, 1fr)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+--fcc-editable-region--
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c434bd731d45617a76c6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c434bd731d45617a76c6.md
new file mode 100644
index 00000000000..ef355952fe6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c434bd731d45617a76c6.md
@@ -0,0 +1,295 @@
+---
+id: 6148c434bd731d45617a76c6
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Ikiwa ungetaka kuongeza aikoni zaidi za kijamii, lakini uziweke kwenye safu mlalo sawa, ungehitaji kusasisha `grid-template-columns` ili kuunda safu wima za ziada. Kama mbadala, unaweza kutumia sifa ya `grid-auto-flow`.
+
+Sifa hii inachukua `row` au `column` kama thamani ya kwanza, na thamani ya pili ya hiari ya `dense`. `grid-auto-flow` hutumia algoriti ya uwekaji kiotomatiki kurekebisha mpangilio wa gridi. Kuiweka kuwa `column` kutaambia algoriti kuunda safu wima mpya kwa maudhui inapohitajika. Thamani ya `dense` huruhusu algoriti kurudisha nyuma na kujaza mashimo kwenye gridi kwa vitu vidogo, jambo ambalo linaweza kusababisha vipengee kuonekana bila mpangilio.
+
+Kwa kichaguzi cha `.social-icons`, weka ksifa ya `grid-auto-flow` kuwa `column`.
+
+# --hints--
+
+Kichaguzi chako cha `.social-icons` kinafaa kuwa na sifa ya `grid-auto-flow` iliyowekwa kuwa `column`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.social-icons')?.gridAutoFlow === 'column');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+--fcc-editable-region--
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c5036ddad94692a66230.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c5036ddad94692a66230.md
new file mode 100644
index 00000000000..19235707bc9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c5036ddad94692a66230.md
@@ -0,0 +1,294 @@
+---
+id: 6148c5036ddad94692a66230
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Sasa algoriti ya uwekaji kiotomatiki itaanza unapoongeza kipengee kipya cha ikoni. Hata hivyo, algoriti hubadilisha upana wa safu wima mpya kuwa `auto`, ambayo haitalingana na safu wima zako za sasa.
+
+Unaweza kubatilisha hili kwa sifa ya `grid-auto-columns`. Kipe kichaguzi cha `.social-icons` sifa ya `grid-auto-columns` iliyowekwa kuwa `1fr`.
+
+# --hints--
+
+Kichaguzi chako cha `.social-icons` kinafaa kuwa na sifa ya `grid-auto-columns` iliyowekwa kuwa `1fr`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.social-icons')?.gridAutoColumns === '1fr');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+--fcc-editable-region--
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c58bace368497fb11bcf.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c58bace368497fb11bcf.md
new file mode 100644
index 00000000000..82c29ca4732
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c58bace368497fb11bcf.md
@@ -0,0 +1,295 @@
+---
+id: 6148c58bace368497fb11bcf
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Kama vile Flexbox, kwa kutumia Gridi ya CSS, unaweza kusawazisha maudhui ya vipengee vya gridi na `align-items` na `justify-items`. `align-items` itapanga vipengele vya watoto kwenye mhimili wa safu wima, na `justify-items` itapanga vipengele vya watoto kwenye mhimili wa safu mlalo.
+
+Kipe kichaguzi cha `.social-icons` sifa ya `align-items` iliyowekwa kuwa `center`.
+
+# --hints--
+
+Kichaguzi chako cha `.social-icons` kinafaa kuwa na sifa ya `align-items` iliyowekwa kuwa `center`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.social-icons')?.alignItems === 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+--fcc-editable-region--
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c6aa9981d74af202125e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c6aa9981d74af202125e.md
new file mode 100644
index 00000000000..6b90cbb0d0d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c6aa9981d74af202125e.md
@@ -0,0 +1,300 @@
+---
+id: 6148c6aa9981d74af202125e
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Kipe kichaguzi cha `.text` sifa ya `font-size` iliyowekwa kuwa `1.8rem` na sifa ya `letter-spacing` iliyowekwa kuwa `0.6px`.
+
+# --hints--
+
+Kichaguzi chako cha `.text` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `1.8rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text')?.fontSize === '1.8rem');
+```
+
+Kichaguzi chako cha `.text` kinafaa kuwa na sifa ya `letter-spacing` iliyowekwa kuwa `0.6px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text')?.letterSpacing === '0.6px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+--fcc-editable-region--
+.text {
+ grid-column: 2 / 3;
+}
+--fcc-editable-region--
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c721e74ecd4c619ae51c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c721e74ecd4c619ae51c.md
new file mode 100644
index 00000000000..275f5c58b7a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148c721e74ecd4c619ae51c.md
@@ -0,0 +1,298 @@
+---
+id: 6148c721e74ecd4c619ae51c
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Kipengele chako cha `.text` si Gridi ya CSS, lakini unaweza kuunda safu wima ndani ya kipengele bila kutumia Gridi kwa kutumia sifa ya `column-width`.
+
+Kipe kichaguzi cha `.text` sifa ya `column-width` iliyowekwa kuwa `25rem`.
+
+# --hints--
+
+Kichaguzi chako cha `.text` kinafaa kuwa na sifa ya `column-width` iliyowekwa kuwa `25rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text')?.columnWidth === '25rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+--fcc-editable-region--
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+}
+--fcc-editable-region--
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148ceaf5d897d4d8b3554b3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148ceaf5d897d4d8b3554b3.md
new file mode 100644
index 00000000000..41e413914d0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148ceaf5d897d4d8b3554b3.md
@@ -0,0 +1,299 @@
+---
+id: 6148ceaf5d897d4d8b3554b3
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Majarida mara nyingi hutumia maandishi yaliyothibitishwa katika machapisho ili kuunda mpangilio wao na kudhibiti mtiririko wa yaliyomo. Ingawa hii inafanya kazi kwa njia machapisho, maandishi yanayohalalishwa kwenye tovuti yanaweza kuwa suala la ufikivu, kwa mfano kuwasilisha changamoto kwa watu wenye dyslexia.
+
+Ili kufanya mradi wako uonekane kama jarida lililochapishwa, kipe kichaguzi cha `.text` sifa ya `text-align` iliyowekwa kuwa `justify`.
+
+# --hints--
+
+Kichaguzi chako cha `.text` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `justify`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text')?.textAlign === 'justify');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+--fcc-editable-region--
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+}
+--fcc-editable-region--
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148cf094b3f2b4e8a032c63.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148cf094b3f2b4e8a032c63.md
new file mode 100644
index 00000000000..5f56e6121f8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148cf094b3f2b4e8a032c63.md
@@ -0,0 +1,314 @@
+---
+id: 6148cf094b3f2b4e8a032c63
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Pseudo-selector ya `::first-letter` hukuruhusu kulenga herufi ya kwanza katika maudhui ya maandishi ya kipengele.
+
+Unda kichaguzi cha `.first-paragraph::first-letter` na uweke sifa ya `font-size` kuwa `6rem`. Pia ipe sifa ya `color` iliyowekwa kuwa `orangered` ili kuifanya ionekane bora.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.first-paragraph::first-letter`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.first-paragraph::first-letter'));
+```
+
+Kichaguzi chako cha `.first-paragraph::first-letter` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `6rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.first-paragraph::first-letter')?.fontSize === '6rem');
+```
+
+Kichaguzi chako cha `.first-paragraph::first-letter` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `orangered`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.first-paragraph::first-letter')?.color === 'orangered');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d0b863d10d50544ace0e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d0b863d10d50544ace0e.md
new file mode 100644
index 00000000000..6828f698ad9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d0b863d10d50544ace0e.md
@@ -0,0 +1,309 @@
+---
+id: 6148d0b863d10d50544ace0e
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Maandishi mengine yamehamishwa kutoka mahali pake. Isogeze katika nafasi kwa kuweka kichaguzi cha `.first-paragraph::first-letter` kua na sifa ya `float` iliyowekwa kuwa `left` na sifa ya `margin-right` iliyowekwa kuwa `1rem`.
+
+# --hints--
+
+Kichaguzi chako cha `.first-paragraph::first-letter` kinafaa kuwa na sifa ya `float` iliyowekwa kuwa `left`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.first-paragraph::first-letter')?.float === 'left');
+```
+
+Kichaguzi chako cha `.first-paragraph::first-letter` kinafaa kuwa na sifa ya `margin-right` iliyowekwa kuwa `1rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.first-paragraph::first-letter')?.marginRight === '1rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+--fcc-editable-region--
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d1bdf39c5b5186f5974b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d1bdf39c5b5186f5974b.md
new file mode 100644
index 00000000000..edd621f6100
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d1bdf39c5b5186f5974b.md
@@ -0,0 +1,313 @@
+---
+id: 6148d1bdf39c5b5186f5974b
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Unda kichaguzi cha `hr` na ukipe `margin` iliyowekwa kuwa `1.5rem 0`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `hr`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('hr'));
+```
+
+Kichaguzi chako cha `hr` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `1.5rem 0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('hr')?.margin === '1.5rem 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d1f9eb63c252e1f8acc4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d1f9eb63c252e1f8acc4.md
new file mode 100644
index 00000000000..43eb810f8ab
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d1f9eb63c252e1f8acc4.md
@@ -0,0 +1,311 @@
+---
+id: 6148d1f9eb63c252e1f8acc4
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Ili kuipa `hr` rangi, unahitaji kurekebisha sifa ya `border`. Kipe kichaguzi cha `hr` sifa ya `border` iliyowekwa kuwa `1px solid rgba(120, 120, 120, 0.6)`.
+
+# --hints--
+
+`hr` yako inapaswa kuwa na sifa ya `border` iliyowekwa kuwa `1px solid rgba(120, 120, 120, 0.6)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('hr')?.borderWidth, '1px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('hr')?.borderStyle, 'solid');
+assert.equal(new __helpers.CSSHelp(document).getStyle('hr')?.borderColor, 'rgba(120, 120, 120, 0.6)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+--fcc-editable-region--
+hr {
+ margin: 1.5rem 0;
+}
+--fcc-editable-region--
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d2444d01ab541e64a1e4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d2444d01ab541e64a1e4.md
new file mode 100644
index 00000000000..a73d63d7217
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d2444d01ab541e64a1e4.md
@@ -0,0 +1,330 @@
+---
+id: 6148d2444d01ab541e64a1e4
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Unda kichaguzi cha `.quote`. Ipe sifa ya `color` iliyowekwa kuwa `#00beef`, sifa ya `font-size` iliyowekwa kuwa `2.4rem`, na sifa ya `text-align` iliyowekwa kuwa `center`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.quote`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.quote'));
+```
+
+Kichaguzi chako cha `.quote` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `#00beef`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.quote')?.color === 'rgb(0, 190, 239)');
+```
+
+Kichaguzi chako cha `.quote` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `2.4rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.quote')?.fontSize === '2.4rem');
+```
+
+Kichaguzi chako cha `.quote` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `center`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.quote')?.textAlign === 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d33e31fccf558696c745.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d33e31fccf558696c745.md
new file mode 100644
index 00000000000..e9c9c12b342
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d33e31fccf558696c745.md
@@ -0,0 +1,317 @@
+---
+id: 6148d33e31fccf558696c745
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Ili kufanya maandishi ya nukuu yaonekane zaidi, kipe kichaguzi cha `.quote` sifa ya `font-family` iliyowekwa kuwa `Raleway` na mbadala kuwa `sans-serif`.
+
+# --hints--
+
+Kichaguzi chako cha `.quote` kinafaa kuwa na sifa ya `font-family` iliyowekwa kuwa `Raleway`, yenye njia mbadala ya `sans-serif`.
+
+```js
+const fontFamily = new __helpers.CSSHelp(document).getStyle('.quote')?.fontFamily;
+assert(fontFamily === 'Raleway, sans-serif' || fontFamily === `"Raleway", sans-serif`);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+--fcc-editable-region--
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d3fff5186b57123d97e2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d3fff5186b57123d97e2.md
new file mode 100644
index 00000000000..9cba88dee52
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d3fff5186b57123d97e2.md
@@ -0,0 +1,341 @@
+---
+id: 6148d3fff5186b57123d97e2
+title: Hatua ya 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+Dondoo sio dondoo bila alama sahihi za nukuu. Unaweza kuongeza hizi kwa kutumia pseudo selector za CSS.
+
+Unda kichaguzi cha `.quote::before` na uweke sifa ya `content` kuwa `"` na nafasi ikiifuata.
+
+Pia, unda kichaguzi cha `.quote::after` na uweke sifa ya `content` kuwa `"` na nafasi itatangulia.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.quote::before`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.quote::before'));
+```
+
+Kichaguzi chako cha `.quote::before` kinafaa kuwa na sifa ya `content` iliyowekwa kuwa `'" '`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.quote::before')?.content?.match(/\"\\"\s\"/));
+```
+
+Unapaswa kuwa na kichaguzi cha `.quote::after`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.quote::after'));
+```
+
+Kichaguzi chako cha `.quote::after` kinafaa kuwa na sifa ya `content` iliyowekwa kuwa `' "'`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.quote::after')?.content?.match(/\"\s\\""/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d4d57b965358c9fa38bf.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d4d57b965358c9fa38bf.md
new file mode 100644
index 00000000000..4316fcbbb2b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d4d57b965358c9fa38bf.md
@@ -0,0 +1,335 @@
+---
+id: 6148d4d57b965358c9fa38bf
+title: Hatua ya 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Sasa ni wakati wa kuwekwa mtindo kwa `section` yako ya tatu. Kumbuka kuwa ina thamani za `text` na `text-with-images` kwa sifa ya `class`, kumaanisha kwamba tayari inarithi mitindo kutoka sheria yako ya `.text`.
+
+Unda kichaguzi cha `.text-with-images` na uweke sifa ya `display` kuwa `grid`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.text-with-images`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text-with-images'));
+```
+
+Kichaguzi chako cha `.text-with-images` kinafaa kuwa na sifa ya `display` iliyowekwa kuwa `grid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text-with-images')?.display === 'grid');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d7720f0db36775db868a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d7720f0db36775db868a.md
new file mode 100644
index 00000000000..03a944e4333
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d7720f0db36775db868a.md
@@ -0,0 +1,335 @@
+---
+id: 6148d7720f0db36775db868a
+title: Hatua ya 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Utahitaji kuwa na safu wima kwa maandishi na safu wima ya picha. Kipe kichaguzi cha `.text-with-images` sifa ya `grid-template-columns` iliyowekwa kuwa `1fr 2fr`. Pia, weka sifa ya `column-gap` kuwa `3rem` ili kutoa nafasi zaidi kati ya safu wima.
+
+# --hints--
+
+Kichaguzi chako cha `.text-with-images` kinafaa kuwa na sifa ya `grid-template-columns` iliyowekwa kuwa `1fr 2fr`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text-with-images')?.gridTemplateColumns === '1fr 2fr');
+```
+
+Kichaguzi chako cha `.text-with-images` kinafaa kuwa na sifa ya `column-gap` iliyowekwa kuwa `3rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text-with-images')?.columnGap === '3rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+--fcc-editable-region--
+.text-with-images {
+ display: grid;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d94fdf6a5d6899f8ff15.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d94fdf6a5d6899f8ff15.md
new file mode 100644
index 00000000000..a500a6ce74b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d94fdf6a5d6899f8ff15.md
@@ -0,0 +1,331 @@
+---
+id: 6148d94fdf6a5d6899f8ff15
+title: Hatua ya 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Kipe kichaguzi cha `.text-with-images` sifa ya `margin-bottom` iliyowekwa kuwa `3rem`.
+
+# --hints--
+
+Kichaguzi chako cha `.text-with-images` kinafaa kuwa na sifa ya `margin-bottom` iliyowekwa kuwa `3rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.text-with-images')?.marginBottom === '3rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+--fcc-editable-region--
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d9825b50a3698aeee644.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d9825b50a3698aeee644.md
new file mode 100644
index 00000000000..78a72baf5e3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d9825b50a3698aeee644.md
@@ -0,0 +1,340 @@
+---
+id: 6148d9825b50a3698aeee644
+title: Hatua ya 68
+challengeType: 0
+dashedName: step-68
+---
+
+# --description--
+
+Unda kichaguzi cha `.lists` na uweke sifa ya `list-style-type` kuwa `none`. Hii itaondoa alama za vitone kwenye vipengee vya orodha.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.lists`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.lists'));
+```
+
+Kichaguzi chako cha `.lists` kinafaa kuwa na sifa ya `list-style-type` iliyowekwa kuwa `none`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.lists')?.listStyleType === 'none');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e162e255676ae0da6a76.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e162e255676ae0da6a76.md
new file mode 100644
index 00000000000..af224dfbbb0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e162e255676ae0da6a76.md
@@ -0,0 +1,336 @@
+---
+id: 6148e162e255676ae0da6a76
+title: Hatua ya 69
+challengeType: 0
+dashedName: step-69
+---
+
+# --description--
+
+Kipe kichaguzi cha `.lists` sifa ya `margin-top` iliyowekwa kuwa `2rem`.
+
+# --hints--
+
+Kichaguzi chako cha `.lists` kinafaa kuwa na sifa ya `margin-top` iliyowekwa kuwa `2rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.lists')?.marginTop === '2rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+--fcc-editable-region--
+.lists {
+ list-style-type: none;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e19c3e26436be0155690.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e19c3e26436be0155690.md
new file mode 100644
index 00000000000..dc51e34f1e8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e19c3e26436be0155690.md
@@ -0,0 +1,345 @@
+---
+id: 6148e19c3e26436be0155690
+title: Hatua ya 70
+challengeType: 0
+dashedName: step-70
+---
+
+# --description--
+
+Unda sheria ya `.lists li` ili kulenga vipengee vya orodha ndani ya kipengele chako cha `.lists`. Ipe sifa ya `margin-bottom` iliyowekwa kuwa `1.5rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.lists li`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.lists li'));
+```
+
+Kichaguzi chako cha `.lists li` kinafaa kuwa na sifa ya `margin-bottom` iliyowekwa kuwa `1.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.lists li')?.marginBottom === '1.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e246146b646cf4255f0c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e246146b646cf4255f0c.md
new file mode 100644
index 00000000000..64d6259e312
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e246146b646cf4255f0c.md
@@ -0,0 +1,349 @@
+---
+id: 6148e246146b646cf4255f0c
+title: Hatua ya 71
+challengeType: 0
+dashedName: step-71
+---
+
+# --description--
+
+Unda kichaguzi cha `.list-title, .list-subtitle` na uweke sifa ya `color` kuwa `#00beef`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.list-title, .list-subtitle`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.list-title, .list-subtitle'))
+```
+
+Kichaguzi chako cha `.list-title, .list-subtitle` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `#00beef`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.list-title, .list-subtitle')?.color === 'rgb(0, 190, 239)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e2dcdd60306dd77d41cc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e2dcdd60306dd77d41cc.md
new file mode 100644
index 00000000000..b519c4c1fcd
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e2dcdd60306dd77d41cc.md
@@ -0,0 +1,355 @@
+---
+id: 6148e2dcdd60306dd77d41cc
+title: Hatua ya 72
+challengeType: 0
+dashedName: step-72
+---
+
+# --description--
+
+Wakati wa kuweka mtindo kwa sehemu ya mwisho ya gazeti - picha.
+
+Picha zimefungwa kwa kipengele cha `aside` kwa kutumia class ya `image-wrapper`, kwa hivyo unda kichaguzi cha `.image-wrapper`. Weka sifa ya `display` kuwa `grid`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.image-wrapper`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.image-wrapper'));
+```
+
+Kichaguzi chako cha `.image-wrapper` kinafaa kuwa na sifa ya `display` iliyowekwa kuwa `grid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.image-wrapper')?.display === 'grid');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e4d6861a486f60681f36.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e4d6861a486f60681f36.md
new file mode 100644
index 00000000000..bd565c714b6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e4d6861a486f60681f36.md
@@ -0,0 +1,357 @@
+---
+id: 6148e4d6861a486f60681f36
+title: Hatua ya 73
+challengeType: 0
+dashedName: step-73
+---
+
+# --description--
+
+Picha zinapaswa kuwa ndani ya safu wima mbili, mpangilio wa safu mlalo tatu.
+
+Kipe kichaguzi cha `.image-wrapper` sifa ya `grid-template-columns` iliyowekwa kuwa `2fr 1fr` na sifa ya `grid-template-rows` iliyowekwa kuwa `repeat(3, min-content)`. Hii itatoa safu mlalo zetu za gridi ambazo hurekebisha urefu kulingana na maudhui, lakini safu wima ambazo zinasalia kuwa upana usiobadilika kulingana na kontena.
+
+# --hints--
+
+Kichaguzi chako cha `.image-wrapper` kinafaa kuwa na sifa ya `grid-template-columns` iliyowekwa kuwa `2fr 1fr`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.image-wrapper')?.gridTemplateColumns === '2fr 1fr');
+```
+
+Kichaguzi chako cha `.image-wrapper` kinafaa kuwa na sifa ya `grid-template-rows` iliyowekwa kuwa `repeat(3, min-content)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.image-wrapper')?.gridTemplateRows === 'repeat(3, min-content)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+--fcc-editable-region--
+.image-wrapper {
+ display: grid;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e5a204d99e70343a63e4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e5a204d99e70343a63e4.md
new file mode 100644
index 00000000000..784ed7f35d6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e5a204d99e70343a63e4.md
@@ -0,0 +1,353 @@
+---
+id: 6148e5a204d99e70343a63e4
+title: Hatua ya 74
+challengeType: 0
+dashedName: step-74
+---
+
+# --description--
+
+Sifa a `gap` ni njia fupi ya kuweka thamani ya `column-gap` na `row-gap` kwa wakati mmoja. Ikipewa thamani moja, itaweka `column-gap` na `row-gap` zote kwa thamani hiyo. Ikipewa thamani mbili, itaweka `row-gap` kwa thamani ya kwanza na `column-gap` kwa ya pili.
+
+Kipe kichaguzi cha `.image-wrapper` sifa ya `gap` ya `2rem`.
+
+# --hints--
+
+Kichaguzi chako cha `.image-wrapper` kinafaa kuwa na sifa ya `gap` iliyowekwa kuwa `2rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.image-wrapper')?.gap === '2rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+--fcc-editable-region--
+.image-wrapper {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ grid-template-rows: repeat(3, min-content);
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e62a6f768f71c4f04828.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e62a6f768f71c4f04828.md
new file mode 100644
index 00000000000..7e694a29091
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e62a6f768f71c4f04828.md
@@ -0,0 +1,354 @@
+---
+id: 6148e62a6f768f71c4f04828
+title: Hatua ya 75
+challengeType: 0
+dashedName: step-75
+---
+
+# --description--
+
+Sifa ya `place-items` inaweza kutumika kuweka thamani za `align-items` na `justify-items` kwa wakati mmoja. `place-items` huchukua thamani moja au mbili. Thamani moja ikitolewa, inatumika kwa sifa za `align-items` na `justify-items`. Ikiwa thamani mbili zimetolewa, thamani ya kwanza inatumika kwa sifa ya `align-items` na thamani ya pili inatumika kwa sifa ya `justify-items`.
+
+Kipe kichaguzi cha `.image-wrapper` sifa ya `place-items` iliyowekwa kuwa `center`.
+
+# --hints--
+
+Kichaguzi chako cha `.image-wrapper` kinafaa kuwa na sifa ya `place-items` iliyowekwa kuwa `center`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.image-wrapper')?.placeItems === 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+--fcc-editable-region--
+.image-wrapper {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ grid-template-rows: repeat(3, min-content);
+ gap: 2rem;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e789329dc9736ce59b85.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e789329dc9736ce59b85.md
new file mode 100644
index 00000000000..d622c5b258b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148e789329dc9736ce59b85.md
@@ -0,0 +1,361 @@
+---
+id: 6148e789329dc9736ce59b85
+title: Hatua ya 76
+challengeType: 0
+dashedName: step-76
+---
+
+# --description--
+
+Unda kichaguzi cha `.image-1, .image-3` na ukipe sifa ya `grid-column` iliyowekwa kuwa `1 / -1`. Hii itaruhusu picha ya kwanza na ya tatu kuenea upana kamili wa gridi.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.image-1, .image-3`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.image-1, .image-3'));
+```
+
+Kichaguzi chako cha `.image-1, .image-3` kinafaa kuwa na sifa ya `grid-column` iliyowekwa kuwa `1 / -1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.image-1, .image-3')?.gridColumn === '1 / -1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+.image-wrapper {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ grid-template-rows: repeat(3, min-content);
+ gap: 2rem;
+ place-items: center;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f34ebedc2274bceeb99c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f34ebedc2274bceeb99c.md
new file mode 100644
index 00000000000..bee3cec794f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f34ebedc2274bceeb99c.md
@@ -0,0 +1,375 @@
+---
+id: 6148f34ebedc2274bceeb99c
+title: Hatua ya 77
+challengeType: 0
+dashedName: step-77
+---
+
+# --description--
+
+Sasa kwa kuwa mpangilio wa gazeti umekamilika, unahitaji kuifanya iwe ya kuitikia.
+
+Anza na hoja ya `@media` ya `only screen` yenye `max-width` ya `720px`. Ndani, unda kichaguzi cha `.image-wrapper` na ukipe sifa ya `grid-template-columns` ya `1fr`.
+
+Hii itapunguza picha zote tatu ziwe katika safu moja kwenye skrini ndogo.
+
+# --hints--
+
+Unapaswa kuwa na hoja mpya ya `@media` ya `only screen and (max-width: 720px)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[0]?.media?.mediaText === 'only screen and (max-width: 720px)');
+```
+
+Hoja yako mpya ya `@media` inapaswa kuwa na kichaguzi cha `.image-wrapper`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[0]?.cssRules?.[0]?.selectorText === '.image-wrapper');
+```
+
+Kichaguzi chako cha `.image-wrapper` kinafaa kuwa na sifa ya `grid-template-columns` iliyowekwa kuwa `1fr`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[0]?.cssRules?.[0]?.style?.gridTemplateColumns === '1fr');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+.image-wrapper {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ grid-template-rows: repeat(3, min-content);
+ gap: 2rem;
+ place-items: center;
+}
+
+.image-1, .image-3 {
+ grid-column: 1 / -1;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f600cde42b7670c2611f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f600cde42b7670c2611f.md
new file mode 100644
index 00000000000..753a739e42d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f600cde42b7670c2611f.md
@@ -0,0 +1,379 @@
+---
+id: 6148f600cde42b7670c2611f
+title: Hatua ya 78
+challengeType: 0
+dashedName: step-78
+---
+
+# --description--
+
+Unda hoja nyingine ya `@media` ya `only screen` yenye `max-width` ya `600px`. Ndani, unda kichaguzi cha `.text-with-images` na ukipe sifa ya `grid-template-columns` ya `1fr`.
+
+Hii itapunguza eneo lako la chini la maandishi hadi safu wima moja kwenye skrini ndogo.
+
+# --hints--
+
+Unapaswa kuwa na hoja mpya ya `@media` ya `only screen and (max-width: 600px)`. Hii inapaswa kuwa chini ya hoja yako ya awali ya `@media`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[1]?.media?.mediaText === 'only screen and (max-width: 600px)');
+```
+
+Hoja yako mpya ya `@media` inapaswa kuwa na kichaguzi cha `.text-with-images`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[1]?.cssRules?.[0]?.selectorText === '.text-with-images');
+```
+
+Kichaguzi chako cha kipya cha `.text-with-images` kinafaa kuwa na sifa ya `grid-template-columns` iliyowekwa kuwa `1fr`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[1]?.cssRules?.[0]?.style?.gridTemplateColumns === '1fr');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+.image-wrapper {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ grid-template-rows: repeat(3, min-content);
+ gap: 2rem;
+ place-items: center;
+}
+
+.image-1, .image-3 {
+ grid-column: 1 / -1;
+}
+
+@media only screen and (max-width: 720px) {
+ .image-wrapper {
+ grid-template-columns: 1fr;
+ }
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f693e0728f77c87f3020.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f693e0728f77c87f3020.md
new file mode 100644
index 00000000000..402e6290f9d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f693e0728f77c87f3020.md
@@ -0,0 +1,404 @@
+---
+id: 6148f693e0728f77c87f3020
+title: Hatua ya 79
+challengeType: 0
+dashedName: step-79
+---
+
+# --description--
+
+Unda hoja ya tatu ya `@media` ya `only screen` yenye `max-width` ya `550px`. Ndani, unda kichaguzi cha `.hero-title` kilicho na `font-size` iliyowekwa kuwa `6rem`, kichaguzi cha `.hero-subtitle, .author, .quote, .list-title` chenye `font-size` iliyowekwa kuwa `1.8rem`, kichaguzi cha `.social-icons` chenye `font-size` iliyowekwa kuwa `2rem`, na kichaguzi cha `.text` chenye `font-size` iliyowekwa kuwa `1.6rem`.
+
+# --hints--
+
+Unapaswa kuwa na hoja mpya ya `@media` ya `only screen` yenye `max-width` ya `550px`. Hii inapaswa kuja baada ya mbili zako zilizopita.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.media?.mediaText === 'only screen and (max-width: 550px)');
+```
+
+Sheria yako mpya ya `@media` inapaswa kuwa na kichaguzi cha `.hero-title`, kichaguzi cha `.hero-subtitle, .author, .quote, .list-title` kichaguzi cha `.social-icons`, na kichaguzi cha `.text`. Vichaguzi hivi vinapaswa kuwa katika mpangilio huu.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.cssRules?.[0]?.selectorText === '.hero-title');
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.cssRules?.[1]?.selectorText === '.hero-subtitle, .author, .quote, .list-title');
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.cssRules?.[2]?.selectorText === '.social-icons');
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.cssRules?.[3]?.selectorText === '.text');
+```
+
+Kichaguzi chako cha `.hero-title` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `6rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.cssRules?.[0]?.style?.fontSize === '6rem');
+```
+
+Kichaguzi chako cha `.hero-subtitle, .author, .quote, .list-title` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `1.8rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.cssRules?.[1]?.style?.fontSize === '1.8rem');
+```
+
+Kichaguzi chako cha `.social-icons` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `2rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.cssRules?.[2]?.style?.fontSize === '2rem');
+```
+
+Kichaguzi chako cha `.text` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `1.6rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[2]?.cssRules?.[3]?.style?.fontSize === '1.6rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+.image-wrapper {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ grid-template-rows: repeat(3, min-content);
+ gap: 2rem;
+ place-items: center;
+}
+
+.image-1, .image-3 {
+ grid-column: 1 / -1;
+}
+
+@media only screen and (max-width: 720px) {
+ .image-wrapper {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media only screen and (max-width: 600px) {
+ .text-with-images {
+ grid-template-columns: 1fr;
+ }
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f6f7d8914c78e93136ca.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f6f7d8914c78e93136ca.md
new file mode 100644
index 00000000000..b97f17ff23e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148f6f7d8914c78e93136ca.md
@@ -0,0 +1,780 @@
+---
+id: 6148f6f7d8914c78e93136ca
+title: Hatua ya 80
+challengeType: 0
+dashedName: step-80
+---
+
+# --description--
+
+Unda hoja moja ya mwisho ya `@media` ya `only screen` yenye `max-width` ya `420px`. Ndani, unda kichaguzi cha `.hero-title` kilicho na `font-size` ya `4.5rem`.
+
+Hongera! Jarida lako sasa limekamilika.
+
+# --hints--
+
+Unapaswa kuwa na hoja mpya ya `@media` ya `only screen and (max-width: 420px)`. Hii inapaswa kuwa hoja ya mwisho katika orodha ya hoja za `@media`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getCSSRules('media')?.[3]?.media?.mediaText, 'only screen and (max-width: 420px)');
+```
+
+Hoja yako mpya ya `@media` inapaswa kuwa na kichaguzi cha `.hero-title`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[3]?.cssRules?.[0]?.selectorText === '.hero-title');
+```
+
+Kichaguzi chako cha `.hero-title` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `4.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.[3]?.cssRules?.[0]?.style?.fontSize === '4.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+.image-wrapper {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ grid-template-rows: repeat(3, min-content);
+ gap: 2rem;
+ place-items: center;
+}
+
+.image-1, .image-3 {
+ grid-column: 1 / -1;
+}
+
+@media only screen and (max-width: 720px) {
+ .image-wrapper {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media only screen and (max-width: 600px) {
+ .text-with-images {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media only screen and (max-width: 550px) {
+ .hero-title {
+ font-size: 6rem;
+ }
+
+ .hero-subtitle,
+ .author,
+ .quote,
+ .list-title {
+ font-size: 1.8rem;
+ }
+
+ .social-icons {
+ font-size: 2rem;
+ }
+
+ .text {
+ font-size: 1.6rem;
+ }
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+}
+
+html {
+ font-size: 62.5%;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+img {
+ width: 100%;
+ object-fit: cover;
+}
+
+hr {
+ margin: 1.5rem 0;
+ border: 1px solid rgba(120, 120, 120, 0.6);
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+ font-size: 1.8rem;
+ letter-spacing: 0.6px;
+ column-width: 25rem;
+ text-align: justify;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+
+.hero-title {
+ text-align: center;
+ color: orangered;
+ font-size: 8rem;
+}
+
+.hero-subtitle {
+ font-size: 2.4rem;
+ color: orangered;
+ text-align: center;
+}
+
+.author {
+ font-size: 2rem;
+ font-family: "Raleway", sans-serif;
+}
+
+.author-name a:hover {
+ background-color: #306203;
+}
+
+.publish-date {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.social-icons {
+ display: grid;
+ font-size: 3rem;
+ grid-template-columns: repeat(5, 1fr);
+ grid-auto-flow: column;
+ grid-auto-columns: 1fr;
+ align-items: center;
+}
+
+.first-paragraph::first-letter {
+ font-size: 6rem;
+ color: orangered;
+ float: left;
+ margin-right: 1rem;
+}
+
+.quote {
+ color: #00beef;
+ font-size: 2.4rem;
+ text-align: center;
+ font-family: "Raleway", sans-serif;
+}
+
+.quote::before {
+ content: '" ';
+}
+
+.quote::after {
+ content: ' "';
+}
+
+.text-with-images {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ column-gap: 3rem;
+ margin-bottom: 3rem;
+}
+
+.lists {
+ list-style-type: none;
+ margin-top: 2rem;
+}
+
+.lists li {
+ margin-bottom: 1.5rem;
+}
+
+.list-title, .list-subtitle {
+ color: #00beef;
+}
+
+.image-wrapper {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ grid-template-rows: repeat(3, min-content);
+ gap: 2rem;
+ place-items: center;
+}
+
+.image-1, .image-3 {
+ grid-column: 1 / -1;
+}
+
+@media only screen and (max-width: 720px) {
+ .image-wrapper {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media only screen and (max-width: 600px) {
+ .text-with-images {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media only screen and (max-width: 550px) {
+ .hero-title {
+ font-size: 6rem;
+ }
+
+ .hero-subtitle,
+ .author,
+ .quote,
+ .list-title {
+ font-size: 1.8rem;
+ }
+
+ .social-icons {
+ font-size: 2rem;
+ }
+
+ .text {
+ font-size: 1.6rem;
+ }
+}
+
+@media only screen and (max-width: 420px) {
+ .hero-title {
+ font-size: 4.5rem;
+ }
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e503b110f76d3ac2ff6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e503b110f76d3ac2ff6.md
new file mode 100644
index 00000000000..b33396c299a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e503b110f76d3ac2ff6.md
@@ -0,0 +1,256 @@
+---
+id: 614e0e503b110f76d3ac2ff6
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Unapaswa kuondoa sifa ya muda ya `width` kabla ya kuandika CSS ya `.hero-img` yako.
+
+# --hints--
+
+`.hero-img` yako inapaswa kuwa na sifa ya `width`.
+
+```js
+assert.isNull(document.querySelector('.hero-img')?.getAttribute('width'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+
+ Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges.
+
+
+ After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor!
+
+
+ It wasn't as dramatic as Doc's revelation in Back to the Future. It
+ just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.)
+
+
+
+
+ The entire curriculum should be a series of projects
+
+
+
+
+ No more walls of explanatory text. No more walls of tests. Just one
+ test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition.
+
+
+ The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode".
+
+
+ Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience.
+
+
+
+
+ A Brief History
+ Of the Curriculum
+
+
+ V1 - 2014
+
+ We launched freeCodeCamp with a simple list of 15 resources,
+ including Harvard's CS50 and Stanford's Database Class.
+
+
+
+ V2 - 2015
+ We added interactive algorithm challenges.
+
+
+ V3 - 2015
+
+ We added our own HTML+CSS challenges (before we'd been relying on
+ General Assembly's Dash course for these).
+
+
+
+ V4 - 2016
+
+ We expanded the curriculum to 3 certifications, including Front
+ End, Back End, and Data Visualization. They each had 10 required
+ projects, but only the Front End section had its own challenges.
+ For the other certs, we were still using external resources like
+ Node School.
+
+
+
+ V5 - 2017
+ We added the back end and data visualization challenges.
+
+
+ V6 - 2018
+
+ We launched 6 new certifications to replace our old ones. This was
+ the biggest curriculum improvement to date.
+
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 62.5%;
+}
+
+body {
+ font-family: 'Baskervville', serif;
+ color: linen;
+ background-color: rgb(20, 30, 40);
+}
+
+h1 {
+ font-family: 'Anton', sans-serif;
+}
+
+h2, h3, h4, h5, h6 {
+ font-family: 'Raleway', sans-serif;
+}
+
+a {
+ text-decoration: none;
+ color: linen;
+}
+
+main {
+ display: grid;
+ grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr);
+ row-gap: 3rem;
+}
+
+.heading {
+ grid-column: 2 / 3;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ row-gap: 1.5rem;
+}
+
+.text {
+ grid-column: 2 / 3;
+}
+
+.hero {
+ grid-column: 1 / -1;
+ position: relative;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e588f0e8a772a8a81a6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e588f0e8a772a8a81a6.md
new file mode 100644
index 00000000000..6c4a9ee44f3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e588f0e8a772a8a81a6.md
@@ -0,0 +1,69 @@
+---
+id: 614e0e588f0e8a772a8a81a6
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Picha yako kwa sasa inachukua nafasi nyingi. Ili kuona vizuri zaidi unachofanyia kazi, ongeza sifa ya `width` kwenye kipengele cha `img`, chenye thamani ya `400`.
+
+Utaondoa hii baadaye utakapokuwa umefanya kazi kwenye CSS.
+
+# --hints--
+
+Kipengele chako cha `img` kinapaswa kuwa na sifa ya `width` iliyowekwa kuwa `400`.
+
+```js
+assert(document.querySelector('img')?.getAttribute('width') === '400');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6165d3b702a5d92ad970b30c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6165d3b702a5d92ad970b30c.md
new file mode 100644
index 00000000000..72c26de49db
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6165d3b702a5d92ad970b30c.md
@@ -0,0 +1,104 @@
+---
+id: 6165d3b702a5d92ad970b30c
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Baada ya kipengele chako cha `img`, ongeza kipengele cha `h1` chenye `class` iliyowekwa kuwa `hero-title` na maandishi yamewekwa kuwa. `OUR NEW CURRICULUM`, ikifuatiwa na kipengele cha `p` chenye `class` iliyowekwa kuwa `hero-subtitle` na maandishi yamewekwa kuwa `Our efforts to restructure our curriculum with a more project-based focus`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `h1`.
+
+```js
+assert.exists(document.querySelector('h1'));
+```
+
+Kipengele chako cha `h1` kinapaswa kuja baada ya kipengele chako cha `img`.
+
+```js
+assert(document.querySelector('h1')?.previousElementSibling?.localName === 'img');
+```
+
+Kipengee chako kipya cha `h1` kinapaswa kuwa na `class` ya `hero-title`.
+
+```js
+assert(document.querySelector('h1')?.className === 'hero-title');
+```
+
+Kipengele chako cha `h1` kinapaswa kuwa na maandishi `OUR NEW CURRICULUM`.
+
+```js
+assert(document.querySelector('h1')?.textContent === 'OUR NEW CURRICULUM');
+```
+
+Unapaswa kuunda kipengele kipya cha `p`.
+
+```js
+assert.exists(document.querySelector('p'));
+```
+
+Kipengele chako cha `p` kinapaswa kuja baada ya kipengele chako cha `h1`.
+
+```js
+assert(document.querySelector('p')?.previousElementSibling?.localName === 'h1');
+```
+
+Kipengee chako kipya cha `p` kinapaswa kuwa na `class` ya `hero-subtitle`.
+
+```js
+assert(document.querySelector('p')?.className === 'hero-subtitle');
+```
+
+Kipengele chako cha `p` kinapaswa kuwa na maandishi yaliyowekwa kuwa `Our efforts to restructure our curriculum with a more project-based focus`.
+
+```js
+assert.equal(document.querySelector('p')?.textContent?.trim()?.replace(/\s{2,}/, ' '), 'Our efforts to restructure our curriculum with a more project-based focus');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6169cd8a558aa8434e0ad7f6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6169cd8a558aa8434e0ad7f6.md
new file mode 100644
index 00000000000..39f43742305
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6169cd8a558aa8434e0ad7f6.md
@@ -0,0 +1,77 @@
+---
+id: 6169cd8a558aa8434e0ad7f6
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+`Referer` ya kichwa cha HTTP kina maelezo kuhusu anwani au URL ya ukurasa ambao huenda mtumiaji anatembelea. Maelezo haya yanaweza kutumika katika uchanganuzi ili kufuatilia ni watumiaji wangapi kutoka kwa ukurasa wako wanaotembelea freecodecamp.org, kwa mfano. Kuweka sifa ya `rel` kuwa `noreferrer` huacha maelezo haya kutoka kwa ombi la HTTP. Kipe kipengele chako cha `a` sifa ya `rel` iliyowekwa kuwa `noreferrer`.
+
+# --hints--
+
+Kipengee chako kipya cha `a` kinapaswa kuwa na `rel` iliyowekwa kuwa `noreferrer`.
+
+```js
+assert(document.querySelector('div')?.querySelector('p')?.firstElementChild?.getAttribute('rel') === 'noreferrer');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Magazine
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619665c9abd72906f3ad30f9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619665c9abd72906f3ad30f9.md
new file mode 100644
index 00000000000..86bd192489d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619665c9abd72906f3ad30f9.md
@@ -0,0 +1,134 @@
+---
+id: 619665c9abd72906f3ad30f9
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Utakuwa unaunda Pengwini mwenye furaha wa Flappy, na ukichunguza zaidi mabadiliko na uhuishaji wa CSS katika mchakato.
+
+Anza na boilerplate ya kawaida ya HTML. Jumuisha tamko la `DOCTYPE`, kipengele cha `html` chenye lugha iliyowekwa kwa Kiingereza, tagi zinazofaa za `meta`, `head`, `body`, na kipengele cha `title`. Pia, unganisha laha yako ya mtindo kwenye ukurasa.
+
+# --hints--
+
+Code yako unapaswa kuwa na tamko la ``.
+
+```js
+assert(code.match(//i));
+```
+
+Code yako inapaswa kuwa na kipengele cha `html`.
+
+```js
+assert.equal(document.querySelectorAll('html')?.length, 1);
+```
+
+Kipengele chako cha `html` kinafaa kuwa na tagi ya ufunguzi yenye sifa ya `lang` ya `en`.
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufunga.
+
+```js
+assert(code.match(/<\/html\s*>/gi));
+```
+
+Unapaswa kuwa na kipengele cha `head` ndani ya kipengele chako cha `html`.
+
+```js
+assert.equal(document.querySelectorAll('head')?.length, 1);
+```
+
+Unapaswa kuwa na kipengele cha `body` ndani ya kipengele chako cha `html`.
+
+```js
+assert.equal(document.querySelectorAll('body')?.length, 1);
+```
+
+Kipengele chako cha `head` kinapaswa kuja kabla ya kipengele chako cha `body`.
+
+```js
+assert.equal(document.querySelector('body')?.previousElementSibling?.tagName, 'HEAD');
+```
+
+Unapaswa kuwa na vipengele viwili vya `meta`.
+
+```js
+const meta = document.querySelectorAll('meta');
+assert.equal(meta?.length, 2);
+```
+
+Kipengele kimoja cha `meta` kinapaswa kuwa na `name` iliyowekwa kuwa `viewport`, na `content` iliyowekwa kuwa `width=device-width, initial-scale=1.0`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => m?.getAttribute('name') === 'viewport' && m?.getAttribute('content') === 'width=device-width, initial-scale=1.0' && !m?.getAttribute('charset'));
+assert.exists(target);
+```
+
+Kipengele kingine cha `meta` kinafaa kuwa na sifa ya `charset` iliyowekwa kuwa `UTF-8`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => !m?.getAttribute('name') && !m?.getAttribute('content') && m?.getAttribute('charset')?.toLowerCase() === 'utf-8');
+assert.exists(target);
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `title`.
+
+```js
+const title = document.querySelector('title');
+assert.exists(title);
+```
+
+`title` yako inapaswa kuwa na maandishi.
+
+```js
+const title = document.querySelector('title');
+assert.isAtLeast(title?.textContent?.length, 1);
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `link`.
+
+```js
+assert.exists(document.querySelector('link'));
+```
+
+Kipengele chako cha `link` kinapaswa kuwa ndani ya kipengele chako cha `head`.
+
+```js
+assert(code.match(/[\w\W\s]*
[\w\W\s]*<\/head>/i));
+```
+
+Kipengele chako cha `link` kinapaswa kuwa na sifa ya `rel` yenye thamani ya `stylesheet`.
+
+```js
+const link_element = document.querySelector('link');
+const rel = link_element.getAttribute("rel");
+assert.equal(rel, "stylesheet");
+```
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `href` yenye thamani `styles.css`.
+
+```js
+const link = document.querySelector('link');
+assert.equal(link.dataset.href, "styles.css");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61967e74a8e3690ab6292daa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61967e74a8e3690ab6292daa.md
new file mode 100644
index 00000000000..fbb8949c436
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61967e74a8e3690ab6292daa.md
@@ -0,0 +1,56 @@
+---
+id: 61967e74a8e3690ab6292daa
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Lenga kipengele cha `body` ili kuweka `background` kuwa linear gradient yenye pembe ya digrii 45, kuanzia `rgb(118, 201, 255)` na kuishia katika `rgb(247, 255, 222)`.
+
+# --hints--
+
+Unapaswa kutumia kipengele kichaguzi cha `body`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+Unapaswa kutumia sifa ya `background` katika kichaguzi cha `body`.
+
+```js
+assert.isTrue(new __helpers.CSSHelp(document).isPropertyUsed('background'));
+```
+
+Unapaswa kuweka `background` kuwa `linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222))`.
+
+```js
+assert.include(['linear-gradient(45deg,rgb(118,201,255),rgb(247,255,222))', 'rgba(0,0,0,0)linear-gradient(45deg,rgb(118,201,255),rgb(247,255,222))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('body')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968df2acd5550bf1616c34.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968df2acd5550bf1616c34.md
new file mode 100644
index 00000000000..60b6e396374
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968df2acd5550bf1616c34.md
@@ -0,0 +1,53 @@
+---
+id: 61968df2acd5550bf1616c34
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Rekebisha ukubwa wa ukurasa wako, kwa kuondoa `margin` na `padding` ya kipengele `body`.
+
+# --hints--
+
+Unapaswa kuipa `body` `margin` ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.margin, '0px');
+```
+
+Unapaswa kuipa `body` `padding` ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.padding, '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968e9243a4090cc805531c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968e9243a4090cc805531c.md
new file mode 100644
index 00000000000..d300133992a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968e9243a4090cc805531c.md
@@ -0,0 +1,51 @@
+---
+id: 61968e9243a4090cc805531c
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Ondoa pau za kusogeza zilizo mlalo na wima, ukitumia sifa moja pekee.
+
+# --hints--
+
+Unapaswa kuipa `body` `overflow` ya `--fcc-expected--`. Lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.overflow, 'hidden');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968f8877c6720d6d61aaf5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968f8877c6720d6d61aaf5.md
new file mode 100644
index 00000000000..04add912d82
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61968f8877c6720d6d61aaf5.md
@@ -0,0 +1,64 @@
+---
+id: 61968f8877c6720d6d61aaf5
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Ndani ya `body`, ongeza `div` yenye `class` ya `ground`.
+
+# --hints--
+
+Unapaswa kuongeza `div` mpya.
+
+```js
+assert.exists(document.querySelector('div'));
+```
+
+Unapaswa kuipa `div` `class` ya `ground`.
+
+```js
+assert.include(document.querySelector('div')?.className, 'ground');
+```
+
+Unapaswa kuweka `div` ndani ya `body`.
+
+```js
+assert.exists(document.querySelector('body > div.ground'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619691693bc14b0e528f5a20.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619691693bc14b0e528f5a20.md
new file mode 100644
index 00000000000..1470aa5bad1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619691693bc14b0e528f5a20.md
@@ -0,0 +1,66 @@
+---
+id: 619691693bc14b0e528f5a20
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Lenga kipengele cha `.ground`, na uweke `width` ili kuchukua upana kamili wa viewport. Kisha, weka `height` kuwa `400px`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.ground`.
+
+```js
+assert.match(code, /\.ground\s*\{/);
+```
+
+Unapaswa kukipa kipengele cha `.ground` `width` ya `100vw`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.ground')?.width, '100vw');
+```
+
+Unapaswa kukipa kipengele cha `.ground` `height` ya `400px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.ground')?.height, '400px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196928658b6010f28c39484.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196928658b6010f28c39484.md
new file mode 100644
index 00000000000..d9bb47cbd07
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196928658b6010f28c39484.md
@@ -0,0 +1,58 @@
+---
+id: 6196928658b6010f28c39484
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Kipe kipengele cha `.ground` `background` chenye linear gradient yenye pembe ya digrii 90, kuanzia `rgb(88, 175, 236)` na kuishia `rgb(182, 255, 255)`.
+
+# --hints--
+
+Unapaswa kuipa `.ground` `background` ya `linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255))`.
+
+```js
+assert.include(['linear-gradient(90deg,rgb(88,175,236),rgb(182,255,255))', 'rgba(0,0,0,0)linear-gradient(90deg,rgb(88,175,236),rgb(182,255,255))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.ground')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+.ground {
+ width: 100vw;
+ height: 400px;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619692ff79f5770fc6d8c0b4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619692ff79f5770fc6d8c0b4.md
new file mode 100644
index 00000000000..8206eeb1a29
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619692ff79f5770fc6d8c0b4.md
@@ -0,0 +1,73 @@
+---
+id: 619692ff79f5770fc6d8c0b4
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Juu ya kipengele cha `.ground`, ongeza `div` yenye `class` ya `penguin`. `div` hii itakuwa na Flappy Penguin.
+
+# --hints--
+
+Unapaswa kuongeza `div` mpya ndani ya `body`.
+
+```js
+assert.equal(document.querySelectorAll('body > div')?.length, 2);
+```
+
+Unapaswa kuipa `div` `class` ya `penguin`.
+
+```js
+assert.include(document.querySelector('body > div:not(.ground)')?.className, 'penguin');
+```
+
+Unapaswa kuweka `div.penguin` kabla ya `div.ground`.
+
+```js
+assert.strictEqual(document.querySelector('.ground')?.previousElementSibling, document.querySelector('.penguin'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+--fcc-editable-region--
+
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196990f966e8f10a40094f6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196990f966e8f10a40094f6.md
new file mode 100644
index 00000000000..9b3c9722caa
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196990f966e8f10a40094f6.md
@@ -0,0 +1,75 @@
+---
+id: 6196990f966e8f10a40094f6
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Lenga kipengele cha `.penguin`, na uweke `width` na `height` kuwa `300px`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.penguin`.
+
+```js
+assert.match(code, /\.penguin\s*\{/);
+```
+
+Unapaswa kuipa `.penguin` `width` ya `300px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.width, '300px');
+```
+
+Unapaswa kuipa `.penguin` `height` ya `300px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.height, '300px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619699c10a0f6e11591d73c4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619699c10a0f6e11591d73c4.md
new file mode 100644
index 00000000000..4dad83ae8c8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619699c10a0f6e11591d73c4.md
@@ -0,0 +1,74 @@
+---
+id: 619699c10a0f6e11591d73c4
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Tumia sifa ya `margin` ili kuweka kipengee cha `.penguin` kwa usawa, na uweke `margin-top` kuwa `75px`.
+
+# --hints--
+
+Unapaswa kuipa `.penguin` `margin` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.marginRight, 'auto');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.marginLeft, 'auto');
+```
+
+Unapaswa kuipa `.penguin` `margin-top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.marginTop, '75px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+.penguin {
+ width: 300px;
+ height: 300px;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969aa6acef5b12200f672e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969aa6acef5b12200f672e.md
new file mode 100644
index 00000000000..65018df1de6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969aa6acef5b12200f672e.md
@@ -0,0 +1,83 @@
+---
+id: 61969aa6acef5b12200f672e
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Ili kuunda mandhari fulani katika usuli, utaongeza milima miwili.
+
+Juu ya kipengele cha `.penguin`, ongeza `div` yenye `class` ya `left-mountain`.
+
+# --hints--
+
+Unapaswa kuongeza `div` mpya ndani ya `body`. `--fcc-expected--` inatarajiwa kwa vipengele vya `div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('body > div')?.length, 3);
+```
+
+Unapaswa kuipa `div` `class` ya `left-mountain`.
+
+```js
+assert.include(document.querySelector('body > div:not(.ground, .penguin)')?.className, 'left-mountain');
+```
+
+Unapaswa kuweka `.left-mountain` baada ya `.penguin`.
+
+```js
+assert.strictEqual(document.querySelector('.penguin')?.previousElementSibling, document.querySelector('.left-mountain'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969c487ced6f12db8fef94.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969c487ced6f12db8fef94.md
new file mode 100644
index 00000000000..5b50e271a86
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969c487ced6f12db8fef94.md
@@ -0,0 +1,89 @@
+---
+id: 61969c487ced6f12db8fef94
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Lenga kipengele cha `.left-mountain`, na uweke `width` na `height` kuwa `300px`. Kisha, weka `background` kuwa linear gradient kuanzia `rgb(203, 241, 228)` na kuishia `rgb(80, 183, 255)`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.left-mountain`.
+
+```js
+assert.match(code, /\.left-mountain\s*\{/);
+```
+
+Unapaswa kuipa `.left-mountain` `width` ya `300px`. `--fcc-actual--` inatarajiwa kuwa `--fcc-expected--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.width, '300px');
+```
+
+Unapaswa kuipa `.left-mountain` `height` ya `300px`. `--fcc-actual--` inatarajiwa kuwa `--fcc-expected--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.height, '300px');
+```
+
+Unapaswa kuipa `.left-mountain` `background` ya `linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255))`.
+
+```js
+assert.include(['linear-gradient(rgb(203,241,228),rgb(80,183,255))', 'rgba(0,0,0,0)linear-gradient(rgb(203,241,228),rgb(80,183,255))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.left-mountain')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969d66cfcdba137d021558.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969d66cfcdba137d021558.md
new file mode 100644
index 00000000000..1f42be750f1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969d66cfcdba137d021558.md
@@ -0,0 +1,76 @@
+---
+id: 61969d66cfcdba137d021558
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Ili kuzuia mlima kusukuma kipengele cha `.ground`, rekebisha `position` ili kuuzuia kuchukua nafasi katika mpangilio wa ukurasa.
+
+# --hints--
+
+Unapaswa kuipa `.left-mountain` `position` ya `absolute`. Inayopatikana ni `--fcc-actual--` badala ya `--fcc-expected--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.position, 'absolute');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969e7451455614217e901b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969e7451455614217e901b.md
new file mode 100644
index 00000000000..7ac153c324a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61969e7451455614217e901b.md
@@ -0,0 +1,91 @@
+---
+id: 61969e7451455614217e901b
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Ili kufanya mlima uonekane zaidi kama mlima, unaweza kutumia kitendakazi cha `skew` transform, ambacho kinachukua hoja mbili. Ya kwanza ikiwa ni pembe ya kukata x-axis, na ya pili ikiwa pembe ya kukata y-axis.
+
+Tumia sifa ya `transform` kugeuza mlima kwa `0deg` katika x-axis na `44deg` katika y-axis.
+
+# --hints--
+
+Unapaswa kuipa `.left-mountain` sifa ya `transform`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.transform);
+```
+
+Unapaswa kutumia kitendakazi cha `skew` katika `transform`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.transform, 'skew');
+```
+
+Unapaswa kuipa `.left-mountain` `transform` ya `skew(0deg, 44deg)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.getPropVal('transform', true), 'skew(0deg,44deg)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196adc17f77a714d51485f2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196adc17f77a714d51485f2.md
new file mode 100644
index 00000000000..a997a03e256
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196adc17f77a714d51485f2.md
@@ -0,0 +1,90 @@
+---
+id: 6196adc17f77a714d51485f2
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Weka kiwango cha mrundikano wa kipengele cha mlima ili kibaki moja kwa moja nyuma ya kipengele cha `.ground`.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `z-index` kubadilisha kiwango cha msururu.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.zIndex);
+```
+
+Unapaswa kuweka sifa ya `z-index` kuwa `2`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.zIndex, '2');
+```
+
+Hupaswi kubadilisha `z-index` ya kipengele cha `.ground`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.ground')?.zIndex, '3');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196aead7ac7bf1584b17a7f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196aead7ac7bf1584b17a7f.md
new file mode 100644
index 00000000000..b6e786488b5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196aead7ac7bf1584b17a7f.md
@@ -0,0 +1,86 @@
+---
+id: 6196aead7ac7bf1584b17a7f
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Ili kuingiliana mlima na vipengele vya `.ground` vyema zaidi, upe mlima `margin-top` ya `100px` na kipengele cha `.ground` `margin-top` ya `-58px`.
+
+# --hints--
+
+Unapaswa kuipa `.left-mountain` `margin-top` ya `100px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.marginTop, '100px');
+```
+
+Unapaswa kuipa `.ground` `margin-top` ya `-58px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.ground')?.marginTop, '-58px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196ce0415498d2463989e84.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196ce0415498d2463989e84.md
new file mode 100644
index 00000000000..497586ae182
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196ce0415498d2463989e84.md
@@ -0,0 +1,92 @@
+---
+id: 6196ce0415498d2463989e84
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Ili kutoa athari ya safu ya milima, ongeza mlima mwingine, kwa kuunda `div` mpya baada ya `.left-mountain`, na upe `div` mpya `class` ya `back-mountain`.
+
+# --hints--
+
+Unapaswa kuunda `div` mpya ndani ya `body`.
+
+```js
+assert.equal(document.querySelectorAll('body > div')?.length, 4);
+```
+
+Unapaswa kuipa `div` `class` ya `back-mountain`.
+
+```js
+assert.include(document.querySelector('div:not(.left-mountain, .ground, .penguin)')?.className, 'back-mountain');
+```
+
+Unapaswa kuweka `.back-mountain` baada ya `.left-mountain`.
+
+```js
+assert.strictEqual(document.querySelector('.left-mountain')?.nextElementSibling, document.querySelector('.back-mountain'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196cee94c6da1253809dff9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196cee94c6da1253809dff9.md
new file mode 100644
index 00000000000..acb3b9206af
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196cee94c6da1253809dff9.md
@@ -0,0 +1,100 @@
+---
+id: 6196cee94c6da1253809dff9
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Lenga kipengele cha `.back-mountain`, na uweke `width` na `height` kuwa `300px`. Kisha, weka `background` kuwa gradient ya mstari kuanzia `rgb(203, 241, 228)` na kuishia `rgb(47, 170, 255)`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.back-mountain`.
+
+```js
+assert.match(code, /\.back-mountain\s*\{/);
+```
+
+Unapaswa kuipa `.back-mountain` `width` ya `300px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.width, '300px');
+```
+
+Unapaswa kuipa `.back-mountain` `height` ya `300px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.height, '300px');
+```
+
+Unapaswa kuipa `.back-mountain` `background` ya `linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255))`.
+
+```js
+assert.include(['linear-gradient(rgb(203,241,228),rgb(47,170,255))', 'rgba(0,0,0,0)linear-gradient(rgb(203,241,228),rgb(47,170,255))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.back-mountain')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d00a5d7292262bc02f4c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d00a5d7292262bc02f4c.md
new file mode 100644
index 00000000000..b0787cfa8bd
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d00a5d7292262bc02f4c.md
@@ -0,0 +1,87 @@
+---
+id: 6196d00a5d7292262bc02f4c
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Weka sifa ya `position` ya `.back-mountain` ili kuizuia kuchukua nafasi katika mpangilio wa ukurasa.
+
+# --hints--
+
+Unapaswa kuipa `.back-mountain` `position` ya `absolute`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.position, 'absolute');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+--fcc-editable-region--
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d0cda039d026f7f78d1e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d0cda039d026f7f78d1e.md
new file mode 100644
index 00000000000..6200f18cfb2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d0cda039d026f7f78d1e.md
@@ -0,0 +1,100 @@
+---
+id: 6196d0cda039d026f7f78d1e
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Badilisha kiwango cha rafu cha kipengele cha `.back-mountain` ili kwamba kiwe moja kwa moja nyuma ya kipengele cha `.left-mountain`.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `z-index` kubadilisha kiwango cha msururu.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.zIndex);
+```
+
+Unapaswa kuweka sifa ya `z-index` kuwa `1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.zIndex, '1');
+```
+
+Hupaswi kubadilisha `z-index` ya kipengele cha `.left-mountain`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-mountain')?.zIndex, '2');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+--fcc-editable-region--
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d1ac33c68d27dcda5796.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d1ac33c68d27dcda5796.md
new file mode 100644
index 00000000000..c9ac01c9705
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d1ac33c68d27dcda5796.md
@@ -0,0 +1,131 @@
+---
+id: 6196d1ac33c68d27dcda5796
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Zungusha kipengele cha `.back-mountain` kwa `45deg`. Kisha, uipe sifa ya `left` ya `110px`, na sifa ya `top` ya `225px`.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `transform` kuzungusha kipengele.
+
+```js
+const backMountain = new __helpers.CSSHelp(document).getStyle('.back-mountain');
+
+if (backMountain?.transform) {
+ assert.notEmpty(backMountain?.transform);
+} else {
+ assert.notEmpty(backMountain?.rotate);
+}
+```
+
+Unapaswa kuipa `.back-mountain` `transform` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+const backMountain = new __helpers.CSSHelp(document).getStyle('.back-mountain');
+
+if (backMountain?.transform) {
+ assert.equal(backMountain?.transform, 'rotate(45deg)');
+} else {
+ assert.equal(backMountain?.rotate, '45deg');
+}
+```
+
+Unapaswa kuipa `.back-mountain` sifa ya `left`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.left);
+```
+
+Unapaswa kuipa `.back-mountain` sifa ya `left` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.left, '110px');
+```
+
+Unapaswa kuipa `.back-mountain` sifa ya `top`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.top);
+```
+
+Unapaswa kuipa `.back-mountain` sifa ya `top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.back-mountain')?.top, '225px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+--fcc-editable-region--
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d213d99f16287bff22ae.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d213d99f16287bff22ae.md
new file mode 100644
index 00000000000..f8222d01b66
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d213d99f16287bff22ae.md
@@ -0,0 +1,104 @@
+---
+id: 6196d213d99f16287bff22ae
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Ili kumalizia usuli, ongeza jua, kwa kuunda kipengele kipya cha `div` mara tu baada ya kipengele cha `.back-mountain`, na ukipe class ya `sun`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele kipya cha `div` kwenye `body`. `--fcc-expected--` inatarajiwa kwa vipengele vya `div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('body > div')?.length, 5);
+```
+
+Unapaswa kuipa `div` mpya `class` ya `sun`.
+
+```js
+assert.include(document.querySelector('div:not(.back-mountain, .left-mountain, .penguin, .ground)')?.className, 'sun');
+```
+
+Unapaswa kuweka kipengele kipya cha `div` mara tu baada ya kipengele cha `.back-mountain`.
+
+```js
+assert.strictEqual(document.querySelector('div.back-mountain')?.nextElementSibling, document.querySelector('div.sun'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d2c0f22ca0293107c048.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d2c0f22ca0293107c048.md
new file mode 100644
index 00000000000..92a9f6cf557
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d2c0f22ca0293107c048.md
@@ -0,0 +1,112 @@
+---
+id: 6196d2c0f22ca0293107c048
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Kipe kipengele cha `.sun` `width` na `height` ya `200px` na `background-color` ya `yellow`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.sun`.
+
+```js
+assert.match(code, /\.sun\s*\{/);
+```
+
+Unapaswa kuipa `.sun` `width` ya `200px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.sun')?.width, '200px');
+```
+
+Unapaswa kuipa `.sun` `height` ya `200px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.sun')?.height, '200px');
+```
+
+Unapaswa kuipa `.sun` `background-color` ya `yellow`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.sun')?.backgroundColor, 'yellow');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d32d1340d829f0f6f57d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d32d1340d829f0f6f57d.md
new file mode 100644
index 00000000000..98520c46585
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d32d1340d829f0f6f57d.md
@@ -0,0 +1,105 @@
+---
+id: 6196d32d1340d829f0f6f57d
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Weka sifa ya `position` ya jua ili kulizuia kuchukua nafasi katika mpangilio wa ukurasa, na weka `border-radius` hivi kwamba umbo la jua ni duara.
+
+# --hints--
+
+Unapaswa kuipa `.sun` `position` ya `absolute`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.sun')?.position, 'absolute');
+```
+
+Unapaswa kuipa `.sun` `border-radius` ya `50%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.sun')?.borderRadius, '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+--fcc-editable-region--
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d41d40bf9b2aaea5d520.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d41d40bf9b2aaea5d520.md
new file mode 100644
index 00000000000..2d18335e3e6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6196d41d40bf9b2aaea5d520.md
@@ -0,0 +1,107 @@
+---
+id: 6196d41d40bf9b2aaea5d520
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Weka jua kwenye kona ya juu kulia ya skrini ili `75px` ya kingo zake za juu na kulia ziwe nje ya skrini.
+
+# --hints--
+
+Unapaswa kuipa `.sun` `top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.sun')?.top, '-75px');
+```
+
+Unapaswa kuipa `.sun` `right` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.sun')?.right, '-75px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+--fcc-editable-region--
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+
+}
+--fcc-editable-region--
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197cff995d03905b0cca8ad.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197cff995d03905b0cca8ad.md
new file mode 100644
index 00000000000..b47ae7d4edb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197cff995d03905b0cca8ad.md
@@ -0,0 +1,118 @@
+---
+id: 6197cff995d03905b0cca8ad
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Pengwini yako itajumuisha sehemu kuu mbili: kichwa, na mwili.
+
+Ndani ya `.penguin`, ongeza vipengele viwili vipya vya `div`. Ya kwanza ikiwa na `class` ya `penguin-head`, na ya pili na `class` ya `penguin-body`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vipya vya `div` ndani ya `.penguin`. `--fcc-expected--` inatarajiwa kwa vipengele vya `.penguin > div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin > div')?.length, 2);
+```
+
+Unapaswa kuipa `div` ya kwanza `class` ya `penguin-head`.
+
+```js
+assert.include(document.querySelector('.penguin > div:nth-of-type(1)')?.className, 'penguin-head');
+```
+
+Unapaswa kuipa `div` ya pili `class` ya `penguin-body`.
+
+```js
+assert.include(document.querySelector('.penguin > div:nth-of-type(2)')?.className, 'penguin-body');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197f40a16afea068c7e60c8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197f40a16afea068c7e60c8.md
new file mode 100644
index 00000000000..261011f1999
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197f40a16afea068c7e60c8.md
@@ -0,0 +1,125 @@
+---
+id: 6197f40a16afea068c7e60c8
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Badilisha kiwango cha rafu cha kipengele cha `.penguin` kiasi kwamba kionekane mbele ya kipengele cha `.ground`, na ukipe `position` ya `relative`.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `z-index` kubadilisha kiwango cha msururu.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.penguin')?.zIndex);
+```
+
+Unapaswa kukipa kipengele cha `.penguin` `z-index` ya `4`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.zIndex, '4');
+```
+
+Unapaswa kuipa `.penguin` sifa ya `position`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.penguin')?.position);
+```
+
+Unapaswa kuipa `.penguin` `position` ya `relative`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.position, 'relative');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+--fcc-editable-region--
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197f667297bb30a552ce017.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197f667297bb30a552ce017.md
new file mode 100644
index 00000000000..35ae4e41f23
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6197f667297bb30a552ce017.md
@@ -0,0 +1,65 @@
+---
+id: 6197f667297bb30a552ce017
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Kwa vile kipengele cha `.ground` kitakuwa cha tatu katika muktadha wa kupangwa kwa mpangilio wa ukurasa, weka `z-index` yake kuwa `3`, na `position` kuwa `absolute`.
+
+# --hints--
+
+Unapaswa kuipa `.ground` `z-index` ya `3`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.ground')?.zIndex, '3');
+```
+
+Unapaswa kuipa `.ground` `position` ya `absolute`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.ground')?.position, 'absolute');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+--fcc-editable-region--
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993b72e874e709b8dfd666.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993b72e874e709b8dfd666.md
new file mode 100644
index 00000000000..d50c62873b2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993b72e874e709b8dfd666.md
@@ -0,0 +1,128 @@
+---
+id: 61993b72e874e709b8dfd666
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Lenga kipengele cha `.penguin-head`, na ukipe `width` nusu ya mzazi wake, na `height` ya `45%`. Kisha, weka `background` kuwa linear gradient ya `45deg` kuanzia `gray` na kuishia `rgb(239, 240, 228)`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.penguin-head`.
+
+```js
+assert.match(code, /\.penguin-head\s*\{/);
+```
+
+Unapaswa kuipa `.penguin-head` `width` ya `50%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.width, '50%');
+```
+
+Unapaswa kuipa `.penguin-head` `height` ya `45%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.height, '45%');
+```
+
+Unapaswa kuipa `.penguin-head` `background` ya `linear-gradient(45deg, gray, rgb(239, 240, 228))`.
+
+```js
+assert.include(['linear-gradient(45deg,gray,rgb(239,240,228))', 'rgba(0,0,0,0)linear-gradient(45deg,gray,rgb(239,240,228))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.penguin-head')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993cf26a8e0f0a553db223.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993cf26a8e0f0a553db223.md
new file mode 100644
index 00000000000..65bfad0185f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993cf26a8e0f0a553db223.md
@@ -0,0 +1,122 @@
+---
+id: 61993cf26a8e0f0a553db223
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+_Pengwini wengi_ hawana kichwa cha mraba.
+
+Mpe pengwini kichwa cha mviringo kidogo kwa kuweka radius ya pembe za juu hadi `70%` na radius ya pembe za chini hadi `65%`.
+
+# --hints--
+
+Unapaswa kuipa `.penguin-head` `border-radius` ya `70% 70% 65% 65%`.
+
+```js
+// Maybe check for individual border-radius properties?
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.borderRadius, '70% 70% 65% 65%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+--fcc-editable-region--
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993dbb35adf30b10d49e38.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993dbb35adf30b10d49e38.md
new file mode 100644
index 00000000000..57d64045979
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993dbb35adf30b10d49e38.md
@@ -0,0 +1,139 @@
+---
+id: 61993dbb35adf30b10d49e38
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Lenga kipengele cha `.penguin-body`, na ukipe `width` ya `53%`, na `height` ya `45%`. Kisha, weka `background` kuwa linear gradient katika `45deg`, `rgb(134, 133, 133)` kutoka `0%`, `rgb(234, 231, 231)` kutoka `25%`, na `white` kutoka `67%`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.penguin-body`.
+
+```js
+assert.match(code, /\.penguin-body\s*\{/);
+```
+
+Unapaswa kuipa `.penguin-body` `width` ya `--fcc-expected--`, lakini imepatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.width, '53%');
+```
+
+Unapaswa kuipa `.penguin-body` `height` ya `--fcc-expected--`, lakini imepatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.height, '45%');
+```
+
+Unapaswa kuipa `.penguin-body` `background` ya `linear-gradient(45deg, rgb(134, 133, 133) 0%, rgb(234, 231, 231) 25%, white 67%)`.
+
+```js
+assert.include(['linear-gradient(45deg,rgb(134,133,133)0%,rgb(234,231,231)25%,white67%)', 'rgba(0,0,0,0)linear-gradient(45deg,rgb(134,133,133)0%,rgb(234,231,231)25%,white67%)repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.penguin-body')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993e9adc9e9a0bb4d28fff.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993e9adc9e9a0bb4d28fff.md
new file mode 100644
index 00000000000..4dfcb4f25cc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61993e9adc9e9a0bb4d28fff.md
@@ -0,0 +1,133 @@
+---
+id: 61993e9adc9e9a0bb4d28fff
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Ukweli mwingine wa kuvutia kuhusu pengwini ni kwamba hawana miili ya mraba.
+
+Tumia sifa ya `border-radius` yenye thamani ya `80% 80% 100% 100%`, ili kumpa pengwini mwili wa mviringo kidogo.
+
+# --hints--
+
+Unapaswa kuipa `.penguin-body` `border-radius` ya `80% 80% 100% 100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.borderRadius, '80% 80% 100% 100%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+}
+
+--fcc-editable-region--
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199409834ccaf0d10736596.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199409834ccaf0d10736596.md
new file mode 100644
index 00000000000..b2e75fe7a8d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199409834ccaf0d10736596.md
@@ -0,0 +1,139 @@
+---
+id: 6199409834ccaf0d10736596
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Lenga vipengee vyote vya kizazi cha kipengele `.penguin`, na uwape `position` ya `absolute`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.penguin *`.
+
+```js
+assert.match(code, /\.penguin\s*\*\s*\{/);
+```
+
+Unapaswa kuipa `.penguin *` `position` ya `absolute`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin *')?.position, 'absolute');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199429802b7c10dc79ff871.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199429802b7c10dc79ff871.md
new file mode 100644
index 00000000000..556cc01efb9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199429802b7c10dc79ff871.md
@@ -0,0 +1,154 @@
+---
+id: 6199429802b7c10dc79ff871
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Weka kipengele cha `.penguin-head` `10%` kutoka juu, na `25%` kutoka upande wa kushoto wa mzazi wake.
+
+# --hints--
+
+Unapaswa kuipa `.penguin-head` sifa ya `top`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.top);
+```
+
+Unapaswa kuipa `.penguin-head` sifa ya `top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.top, '10%');
+```
+
+Unapaswa kuipa `.penguin-head` sifa ya `left`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.left);
+```
+
+Unapaswa kuipa `.penguin-head` sifa ya `left` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.left, '25%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+--fcc-editable-region--
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619943285a41720e6370d985.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619943285a41720e6370d985.md
new file mode 100644
index 00000000000..9e7c8691fa6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619943285a41720e6370d985.md
@@ -0,0 +1,156 @@
+---
+id: 619943285a41720e6370d985
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Weka kipengele cha `.penguin-body` `40%` kutoka juu, na `23.5%` kutoka upande wa kushoto wa mzazi wake.
+
+# --hints--
+
+Unapaswa kuipa `.penguin-body` sifa ya `top`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.top);
+```
+
+Unapaswa kuipa `.penguin-body` sifa ya `top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.top, '40%');
+```
+
+Unapaswa kuipa `.penguin-body` sifa ya `left`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.left);
+```
+
+Unapaswa kuipa `.penguin-body` sifa ya `left` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.left, '23.5%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+}
+
+--fcc-editable-region--
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619943876b706d0f35c01dbc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619943876b706d0f35c01dbc.md
new file mode 100644
index 00000000000..55f4d282add
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619943876b706d0f35c01dbc.md
@@ -0,0 +1,146 @@
+---
+id: 619943876b706d0f35c01dbc
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Badilisha mpangilio wa mrundikano wa vipengele vya `.penguin-head` ili vionekane mbele ya kipengele cha `.penguin-body`.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `z-index` kubadilisha kiwango cha mrundikano.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.zIndex);
+```
+
+Unapaswa kukipa kipengele cha `.penguin-head` `z-index` ya `1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.zIndex, '1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+--fcc-editable-region--
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199442866286d0ff421a4fc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199442866286d0ff421a4fc.md
new file mode 100644
index 00000000000..bc439a54ddf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/6199442866286d0ff421a4fc.md
@@ -0,0 +1,148 @@
+---
+id: 6199442866286d0ff421a4fc
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Ili kuupa mwili wa pengwini kishungi, tengeneza kipengele cha pseudo ambacho ni mtoto wa kwanza wa kipengele cha `.penguin-body`. Weka sifa ya `content` ya kipengele cha pseudo kuwa string tupu.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.penguin-body::before`.
+
+```js
+assert.match(code, /\.penguin-body::before\s*\{/);
+```
+
+Unapaswa kuipa `.penguin-body::before` `content` ya `""`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.content, '""');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619bcf239fc15905ecd66fce.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619bcf239fc15905ecd66fce.md
new file mode 100644
index 00000000000..5cfb504cafc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619bcf239fc15905ecd66fce.md
@@ -0,0 +1,145 @@
+---
+id: 619bcf239fc15905ecd66fce
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Weka kipengele cha pseudo relative na kipengele kikuu chake cha karibu zaidi.
+
+# --hints--
+
+Unapaswa kuipa `.penguin-body::before` `position` ya `absolute`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.position, 'absolute');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+--fcc-editable-region--
+.penguin-body::before {
+ content: "";
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be73b3c806006ccc00bb0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be73b3c806006ccc00bb0.md
new file mode 100644
index 00000000000..3feda2c3d47
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be73b3c806006ccc00bb0.md
@@ -0,0 +1,158 @@
+---
+id: 619be73b3c806006ccc00bb0
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Kipe kipengele pseudo `width` nusu ya mzazi wake, `height` ya `45%` na `background-color` ya `gray`.
+
+# --hints--
+
+Unapaswa kuipa `.penguin-body::before` `width` ya `50%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.width, '50%');
+```
+
+Unapaswa kuipa `.penguin-body::before` `height` ya `45%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.height, '45%');
+```
+
+Unapaswa kuipa `.penguin-body::before` `background-color` ya `--fcc-expected--`, lakini imepatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.backgroundColor, 'gray');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+--fcc-editable-region--
+.penguin-body::before {
+ content: "";
+ position: absolute;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be7af7b0bf60770f5d2a4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be7af7b0bf60770f5d2a4.md
new file mode 100644
index 00000000000..1a2448a0689
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be7af7b0bf60770f5d2a4.md
@@ -0,0 +1,155 @@
+---
+id: 619be7af7b0bf60770f5d2a4
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Weka kipengele cha pseudo `10%` kutoka juu na `25%` kutoka upande wa kushoto wa mzazi wake.
+
+# --hints--
+
+Unapaswa kuipa `.penguin-body::before` `top` ya `--fcc-expected--`, lakini imepatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.top, '10%');
+```
+
+Unapaswa kuipa `.penguin-body::before` `left` ya `--fcc-expected--`, lakini imepatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.left, '25%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+--fcc-editable-region--
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be80062551a080e32c821.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be80062551a080e32c821.md
new file mode 100644
index 00000000000..2a0444b7812
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be80062551a080e32c821.md
@@ -0,0 +1,160 @@
+---
+id: 619be80062551a080e32c821
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Leta kwa ukaribu crest, kwa kupeana sehemu za chini za kipengele cha pseudo eneo la `100%`, na kuacha sehemu za juu zikiwa `0%`.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `border-radius` ili kuleta kwa ukaribu crest.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.borderRadius);
+```
+
+Unapaswa kuipa `.penguin-body::before` `border-radius` ya `0% 0% 100% 100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.borderBottomLeftRadius, '100%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.borderBottomRightRadius, '100%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.borderTopLeftRadius, '0%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.borderTopRightRadius, '0%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+--fcc-editable-region--
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be8ce4ea49008c5bfbc30.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be8ce4ea49008c5bfbc30.md
new file mode 100644
index 00000000000..cbd0434b792
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be8ce4ea49008c5bfbc30.md
@@ -0,0 +1,152 @@
+---
+id: 619be8ce4ea49008c5bfbc30
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Ongeza uwazi wa kipengele-cha pseudo kwa `30%`.
+
+# --hints--
+
+Unapaswa kuipa `.penguin-body::before` `opacity` ya `70%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.opacity, '0.7');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+--fcc-editable-region--
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be946958c6009844f1dee.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be946958c6009844f1dee.md
new file mode 100644
index 00000000000..2850b44cb9b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619be946958c6009844f1dee.md
@@ -0,0 +1,166 @@
+---
+id: 619be946958c6009844f1dee
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Anzisha uso wa pengwini, kwa kuongeza vipengele viwili vya `div` ndani ya `.penguin-head`, na kuwapa `class` ya `face`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vya `--fcc-expected--` `div` kwenye `.penguin-head`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-head > div')?.length, 2);
+```
+
+Unapaswa kuipa `div` ya kwanza `class` ya `face`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.include(document.querySelector('.penguin-head > div:nth-of-type(1)')?.className, 'face');
+```
+
+Unapaswa kuipa `div` ya pili `class` ya `face`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.include(document.querySelector('.penguin-head > div:nth-of-type(2)')?.className, 'face');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619c155df0063a0a3fec0e32.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619c155df0063a0a3fec0e32.md
new file mode 100644
index 00000000000..aec0e721f9a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619c155df0063a0a3fec0e32.md
@@ -0,0 +1,193 @@
+---
+id: 619c155df0063a0a3fec0e32
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Vipe vipengele vya `.face` `width` ya `60%`, `height` ya `70%`, na `background-color` ya `white`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.face`.
+
+```js
+assert.match(code, /\.face\s*\{/);
+```
+
+Unapaswa kuipa `.face` sifa ya `width`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.face')?.width);
+```
+
+Unapaswa kuipa `.face` `width` ya `--fcc-expected--`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.width, '60%');
+```
+
+Unapaswa kuipa `.face` sifa ya `height`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.face')?.height);
+```
+
+Unapaswa kuipa `.face` `height` ya `--fcc-expected--`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.height, '70%');
+```
+
+Unapaswa kuipa `.face` sifa ya `background-color`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.face')?.backgroundColor);
+```
+
+Unapaswa kuipa `.face` `background-color` ya `--fcc-expected--`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.backgroundColor, 'white');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619c16debd0c270b01c5ce38.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619c16debd0c270b01c5ce38.md
new file mode 100644
index 00000000000..0a4fa92c841
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619c16debd0c270b01c5ce38.md
@@ -0,0 +1,165 @@
+---
+id: 619c16debd0c270b01c5ce38
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Fanya pembe za juu za vipengele vya `.face` ziwe na radius ya `70%`, na pembe za chini ziwe na radius ya `60%`.
+
+# --hints--
+
+Unapaswa kuipa `.face` `border-radius` ya `70% 70% 60% 60%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.borderTopLeftRadius, '70%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.borderTopRightRadius, '70%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.borderBottomLeftRadius, '60%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.borderBottomRightRadius, '60%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+--fcc-editable-region--
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619cfdf2e63ddf05feab86ad.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619cfdf2e63ddf05feab86ad.md
new file mode 100644
index 00000000000..3646b50aed8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619cfdf2e63ddf05feab86ad.md
@@ -0,0 +1,169 @@
+---
+id: 619cfdf2e63ddf05feab86ad
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Weka vipengele vya `.face` ili viwe `15%` kutoka juu.
+
+# --hints--
+
+Unapaswa kuipa `.face` sifa ya `top`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.face')?.top);
+```
+
+Unapaswa kuipa `.face` `top` ya `--fcc-expected--`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.top, '15%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+--fcc-editable-region--
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d019488f98c06acbbb71a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d019488f98c06acbbb71a.md
new file mode 100644
index 00000000000..450c61f1d3a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d019488f98c06acbbb71a.md
@@ -0,0 +1,171 @@
+---
+id: 619d019488f98c06acbbb71a
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Kwa sasa, vipengele viwili vya `.face` viko juu ya kila kimoja.
+
+Rekebisha hili, kwa kuongeza `class` ya `left` kwenye kipengele cha kwanza cha `.face` na `class` ya `right` kwenye kipengele cha pili cha `.face`.
+
+# --hints--
+
+Unapaswa kuweka `class` ya `left` kwa kipengele cha kwanza cha `.face`.
+
+```js
+assert.include(document.querySelector('.face:nth-of-type(1)').className, 'left');
+```
+
+Unapaswa kuweka `class` ya `right` kwa kipengele cha pili cha `.face`.
+
+```js
+assert.include(document.querySelector('.face:nth-of-type(2)').className, 'right');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d022dc8400c0763829a17.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d022dc8400c0763829a17.md
new file mode 100644
index 00000000000..fadedfb2274
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d022dc8400c0763829a17.md
@@ -0,0 +1,177 @@
+---
+id: 619d022dc8400c0763829a17
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Lenga kipengele cha `.face` kilicho na class ya `left` na uiweke `5%` kutoka upande wa kushoto wa mzazi wake.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.face.left`.
+
+```js
+assert.match(code, /\.face\.left\s*\{/);
+```
+
+Unapaswa kuipa `.face.left` sifa ya `left`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.face.left')?.left);
+```
+
+Unapaswa kuipa `.face.left` `left` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face.left')?.left, '5%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d02c7bc95bf0827a5d296.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d02c7bc95bf0827a5d296.md
new file mode 100644
index 00000000000..5b711b3a093
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d02c7bc95bf0827a5d296.md
@@ -0,0 +1,181 @@
+---
+id: 619d02c7bc95bf0827a5d296
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Lenga kipengele cha `.face` kilicho na class ya `right` na uiweke `5%` kutoka upande wa kulia wa mzazi wake.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.face.right`.
+
+```js
+assert.match(code, /\.face\.right\s*\{/);
+```
+
+Unapaswa kuipa `.face.right` sifa ya `right`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.face.right')?.right);
+```
+
+Unapaswa kuipa `.face.right` `right` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face.right')?.right, '5%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+--fcc-editable-region--
+.face.left {
+ left: 5%;
+}
+
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d033915012509031f309a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d033915012509031f309a.md
new file mode 100644
index 00000000000..cc47219cdc9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d033915012509031f309a.md
@@ -0,0 +1,184 @@
+---
+id: 619d033915012509031f309a
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Chini ya kipengele cha `.face.right`, ongeza vipengele viwili vya `div` kila kimoja kikiwa na `class` ya `chin`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele kimoja cha `div` ndani ya `.penguin-head`. `--fcc-expected--` inatarajiwa kwa vipengele vya `div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-head > div')?.length, 3);
+```
+
+Unapaswa kuipa `div` `class` ya `chin`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.chin'));
+```
+
+Unapaswa kuweka kipengele cha `div` chini ya kipengele cha `.face.right`.
+
+```js
+assert.exists(document.querySelector('.face.right + .chin'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d03dadadb6509a16f4f5f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d03dadadb6509a16f4f5f.md
new file mode 100644
index 00000000000..a853a15fbaf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d03dadadb6509a16f4f5f.md
@@ -0,0 +1,210 @@
+---
+id: 619d03dadadb6509a16f4f5f
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Lenga kipengele cha `.chin`, na ukipe `width` ya `90%`, `height` ya `70%`, na `background-color` ya `white`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.chin`.
+
+```js
+assert.match(code, /\.chin\s*\{/);
+```
+
+Unapaswa kuipa `.chin` sifa ya `width`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.chin')?.width);
+```
+
+Unapaswa kuipa `.chin` `width` ya `--fcc-expected--`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.width, '90%');
+```
+
+Unapaswa kuipa `.chin` sifa ya `height`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.chin')?.height);
+```
+
+Unapaswa kuipa `.chin` `height` ya `--fcc-expected--`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.height, '70%');
+```
+
+Unapaswa kuipa `.chin` sifa ya `background-color`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.chin')?.backgroundColor);
+```
+
+Unapaswa kuipa `.chin` `background-color` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.backgroundColor, 'white');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0503e03a790a4179d463.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0503e03a790a4179d463.md
new file mode 100644
index 00000000000..d971af9168f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0503e03a790a4179d463.md
@@ -0,0 +1,206 @@
+---
+id: 619d0503e03a790a4179d463
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Weka kipengele cha `.chin` kiasi kwamba kiwe `25%` kutoka juu, na `5%` kutoka upande wa kushoto wa mzazi wake. Kisha, zipe pembe za juu radius ya `70%`, na pembe za chini tadius ya `100%`.
+
+# --hints--
+
+Unapaswa kuipa `.chin` sifa ya `top`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.chin')?.top);
+```
+
+Unapaswa kuipa `.chin` `top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.top, '25%');
+```
+
+Unapaswa kuipa `.chin` sifa ya `left`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.chin')?.left);
+```
+
+Unapaswa kuipa `.chin` `left` ya `--fcc-expected--`, lakini iliyopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.left, '5%');
+```
+
+Unapaswa kuipa `.chin` `border-radius` ya `70% 70% 100% 100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.borderTopLeftRadius, '70%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.borderTopRightRadius, '70%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.borderBottomRightRadius, '100%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.borderBottomLeftRadius, '100%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+--fcc-editable-region--
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: white;
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d05c54dabca0b10058235.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d05c54dabca0b10058235.md
new file mode 100644
index 00000000000..328f14db621
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d05c54dabca0b10058235.md
@@ -0,0 +1,197 @@
+---
+id: 619d05c54dabca0b10058235
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Kufikia sasa, vipengele vya `.face` na `.chin` vina `background-color` sawa.
+
+Unda sifa maalum ya CSS inayoitwa `--penguin-face`, na kuiweka `white`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `:root`.
+
+```js
+assert.match(code, /:root\s*\{/);
+```
+
+Unapaswa kuipa `:root` sifa ya `--penguin-face`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle(':root')?.getPropertyValue('--penguin-face'));
+```
+
+Unapaswa kuipa `:root` `--penguin-face` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root')?.getPropVal('--penguin-face', true), 'white');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: white;
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0882f54bf40bdc4671ed.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0882f54bf40bdc4671ed.md
new file mode 100644
index 00000000000..1d93cd46cf0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0882f54bf40bdc4671ed.md
@@ -0,0 +1,197 @@
+---
+id: 619d0882f54bf40bdc4671ed
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Inapofaa, badilisha thamani za sifa na kigezo chako cha `--penguin-face`.
+
+# --hints--
+
+Unapaswa kuipa `.face` `background-color` ya `var(--penguin-face)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.face')?.getPropVal('background-color', true), 'var(--penguin-face)');
+```
+
+Unapaswa kuipa `.chin` `background-color` ya `var(--penguin-face)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.chin')?.getPropVal('background-color', true), 'var(--penguin-face)');
+```
+
+Hupaswi kutumia `var(--penguin-face)` katika kichaguzi cha `.penguin-body`.
+
+```js
+assert.notInclude(new __helpers.CSSHelp(document).getStyle('.penguin-body')?.getPropVal('background-color', true), 'var(--penguin-face)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: white;
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: white;
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d090cd8d6db0c93dc5087.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d090cd8d6db0c93dc5087.md
new file mode 100644
index 00000000000..9c8b738c2d1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d090cd8d6db0c93dc5087.md
@@ -0,0 +1,222 @@
+---
+id: 619d090cd8d6db0c93dc5087
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Chini ya kipengele cha `.chin`, ongeza vipengele viwili vya `div` kila kimoja kikiwa na `class` ya `eye`. Pia, kipe kipengele cha kwanza cha `.eye` `class` ya `left` na kipengele cha pili cha `.eye` `class` ya `right`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` ndani ya `.penguin-head`. `--fcc-expected--` inatarajiwa kwa vipengele vya `div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-head > div')?.length, 5);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `eye`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.eye'));
+```
+
+Unapaswa kuipa `div` mpya ya pili `class` ya `eye`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-head > div.eye')?.length, 2);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `left`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.eye.left'));
+```
+
+Unapaswa kuipa `div` mpya ya pili `class` ya `right`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.eye.right'));
+```
+
+Unapaswa kuweka `div.eye.left` baada ya `div.chin`.
+
+```js
+assert.exists(document.querySelector('.chin + .eye.left'));
+```
+
+Unapaswa kuweka `div.eye.right` baada ya `div.eye.left`.
+
+```js
+assert.exists(document.querySelector('.eye.left + .eye.right'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0b51ca42ed0d74582186.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0b51ca42ed0d74582186.md
new file mode 100644
index 00000000000..d5692a0a9b5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0b51ca42ed0d74582186.md
@@ -0,0 +1,207 @@
+---
+id: 619d0b51ca42ed0d74582186
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Lenga vipengele vya `.eye`, na uzipe `width` ya `15%`, `height` ya `17%`, na `background-color` ya `black`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.eye`.
+
+```js
+assert.match(code, /\.eye\s*\{/);
+```
+
+Unapaswa kuipa `.eye` `width` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye')?.width, '15%');
+```
+
+Unapaswa kuipa `.eye` `height` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye')?.height, '17%');
+```
+
+Unapaswa kuipa `.eye` `background-color` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye')?.backgroundColor, 'black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0bc9cb05360e1bf549c3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0bc9cb05360e1bf549c3.md
new file mode 100644
index 00000000000..d49167459ab
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0bc9cb05360e1bf549c3.md
@@ -0,0 +1,200 @@
+---
+id: 619d0bc9cb05360e1bf549c3
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Weka vipengele vya `.eye`, `45%` kutoka juu ya mzazi wao, na upe pembe zote radius ya `50%`.
+
+# --hints--
+
+Unapaswa kuipa `.eye` `top` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye')?.top, '45%');
+```
+
+Unapaswa kuipa `.eye` `border-radius` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye')?.borderRadius, '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+--fcc-editable-region--
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0c1594c38c0ebae75878.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0c1594c38c0ebae75878.md
new file mode 100644
index 00000000000..13ce1b8f79c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0c1594c38c0ebae75878.md
@@ -0,0 +1,215 @@
+---
+id: 619d0c1594c38c0ebae75878
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Lenga kipengele cha `.eye` kilicho na class ya `left` na uiweke `25%` kutoka upande wa kushoto wa mzazi wake. Kisha, lenga kipengele cha `.eye` chenye class ya `right`, na uiweke `25%` kutoka upande wa kulia wa mzazi wake.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.eye.left`.
+
+```js
+assert.match(code, /\.eye\.left\s*\{/);
+```
+
+Unapaswa kuipa `.eye.left` `left` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye.left')?.left, '25%');
+```
+
+Unapaswa kutumia kichaguzi cha `.eye.right`.
+
+```js
+assert.match(code, /\.eye\.right\s*\{/);
+```
+
+Unapaswa kuipa `.eye.right` `right` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye.right')?.right, '25%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0d18ca99870f884a7bff.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0d18ca99870f884a7bff.md
new file mode 100644
index 00000000000..9584032553a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0d18ca99870f884a7bff.md
@@ -0,0 +1,225 @@
+---
+id: 619d0d18ca99870f884a7bff
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Ndani ya kila kipengele cha `.eye`, ongeza `div` yenye `class` ya `eye-lid`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele kimoja cha `div` ndani ya `.eye.left`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.eye.left > div')?.length ?? 0, 1);
+```
+
+Unapaswa kuongeza kipengele kimoja cha `div` ndani ya `.eye.right`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.eye.right > div')?.length ?? 0, 1);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `eye-lid`.
+
+```js
+assert.exists(document.querySelector('.eye.left > div.eye-lid'));
+```
+
+Unapaswa kuipa `div` mpya ya pili `class` ya `eye-lid`.
+
+```js
+assert.exists(document.querySelector('.eye.right > div.eye-lid'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0daf214542102739b0da.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0daf214542102739b0da.md
new file mode 100644
index 00000000000..c0669bd0f25
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0daf214542102739b0da.md
@@ -0,0 +1,227 @@
+---
+id: 619d0daf214542102739b0da
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Lenga vipengele vya `.eye-lid`, na uvipe `width` ya `150%`, `height` ya `100%`, na `background-color` ya `--penguin-face`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.eye-lid`.
+
+```js
+assert.match(code, /\.eye-lid\s*\{/);
+```
+
+Unapaswa kuipa `.eye-lid` `width` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye-lid')?.width, '150%');
+```
+
+Unapaswa kuipa `.eye-lid` `height` ya `--fcc-expected--`, inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye-lid')?.height, '100%');
+```
+
+Unapaswa kuipa `.eye-lid` `background-color` ya `var(--penguin-face)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye-lid')?.getPropVal('background-color', true), 'var(--penguin-face)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0e56f9ca9710fcb974e3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0e56f9ca9710fcb974e3.md
new file mode 100644
index 00000000000..8510b2ca767
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0e56f9ca9710fcb974e3.md
@@ -0,0 +1,226 @@
+---
+id: 619d0e56f9ca9710fcb974e3
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Weka vipengele vya `.eye-lid` `25%` kutoka juu, na `-23%` kutoka upande wa kushoto wa wazazi wao. Kisha, zipe pembe zote radius ya `50%`.
+
+# --hints--
+
+Unapaswa kuipa `.eye-lid` `top` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye-lid')?.top, '25%');
+```
+
+Unapaswa kuipa `.eye-lid` `left` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye-lid')?.left, '-23%');
+```
+
+Unapaswa kuipa `.eye-lid` `border-radius` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.eye-lid')?.borderRadius, '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+--fcc-editable-region--
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0eec0ac40611b41e2ccc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0eec0ac40611b41e2ccc.md
new file mode 100644
index 00000000000..bc9085b4cd7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0eec0ac40611b41e2ccc.md
@@ -0,0 +1,247 @@
+---
+id: 619d0eec0ac40611b41e2ccc
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Chini ya kipengele chako cha `.eye.right`, ongeza vipengele viwili vya `div` kila kimoja kikiwa na `class` ya `blush`. Pia, kipe kipengele cha kwanza cha `.blush` `class` ya `left` na cha pili `.blush` `class` ya `right`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` ndani ya `.penguin-head`. Vipengele vya `--fcc-expected--` `div` vilivyotarajiwa, vimepatikana `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-head > div')?.length, 7);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `blush`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.blush'));
+```
+
+Unapaswa kuipa `div` ya pili `class` ya `blush`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-head > div.blush')?.length, 2);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `left`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.blush.left'));
+```
+
+Unapaswa kuipa `div` ya pili `class` ya `right`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.blush.right'));
+```
+
+Unapaswa kuweka `.blush.right` baada ya `.blush.left`.
+
+```js
+assert.exists(document.querySelector('.blush.left + .blush.right'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0fc9825c271253df28d4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0fc9825c271253df28d4.md
new file mode 100644
index 00000000000..186915695b0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d0fc9825c271253df28d4.md
@@ -0,0 +1,238 @@
+---
+id: 619d0fc9825c271253df28d4
+title: Hatua ya 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+Lenga vipengele vya `.blush`, na uzipe `width` ya `15%`, `height` ya `10%`, na `background-color` ya `pink`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.blush`.
+
+```js
+assert.match(code, /\.blush\s*\{/);
+```
+
+Unapaswa kuipa `.blush` `width` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.blush')?.width, '15%');
+```
+
+Unapaswa kuipa `.blush` `height` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.blush')?.height, '10%');
+```
+
+Unapaswa kuipa `.blush` `background-color` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.blush')?.backgroundColor, 'pink');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d102d786c3d13124c37c6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d102d786c3d13124c37c6.md
new file mode 100644
index 00000000000..a2ae9ae91f7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d102d786c3d13124c37c6.md
@@ -0,0 +1,231 @@
+---
+id: 619d102d786c3d13124c37c6
+title: Hatua ya 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Weka vipengele vya `.blush`, `65%` kutoka juu ya mzazi wao, na upe pembe zote radius ya `50%`.
+
+# --hints--
+
+Unapaswa kuipa `.blush` `top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.blush')?.top, '65%');
+```
+
+Unapaswa kuipa `.blush` `border-radius` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.blush')?.borderRadius, '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+--fcc-editable-region--
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d107edf7ddf13cc77106a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d107edf7ddf13cc77106a.md
new file mode 100644
index 00000000000..6749131c0c1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d107edf7ddf13cc77106a.md
@@ -0,0 +1,246 @@
+---
+id: 619d107edf7ddf13cc77106a
+title: Hatua ya 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Lenga kipengele cha `.blush` kilicho na `class` ya `left` na uiweke `15%` kutoka upande wa kushoto wa mzazi wake. Kisha, lenga kipengele cha `.blush` chenye `class` ya `right` na ukiweke `15%` kulia kwa mzazi wake.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.blush.left`.
+
+```js
+assert.match(code, /\.blush\.left\s*\{/);
+```
+
+Unapaswa kuipa `.blush.left` `left` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.blush.left')?.left, '15%');
+```
+
+Unapaswa kutumia kichaguzi cha `.blush.right`.
+
+```js
+assert.match(code, /\.blush\.right\s*\{/);
+```
+
+Unapaswa kuipa `.blush.right` `right` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.blush.right')?.right, '15%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d10cc98145f14820399c5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d10cc98145f14820399c5.md
new file mode 100644
index 00000000000..3319524e515
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d10cc98145f14820399c5.md
@@ -0,0 +1,271 @@
+---
+id: 619d10cc98145f14820399c5
+title: Hatua ya 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Chini ya kipengele cha `.blush.right`, ongeza vipengele viwili vya `div` kila kimoja kikiwa na `class` ya `beak`. Pia, kipe kipengele cha kwanza cha `.beak` `class` ya `top` na kipengele cha pili `.beak`, `class` ya `bottom`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` ndani ya `.penguin-head`. `--fcc-expected--` inatarajiwa kwa vipengele vya `div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-head > div')?.length, 9);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `beak`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.beak'));
+```
+
+Unapaswa kuipa `div` ya pili `class` ya `beak`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-head > div.beak')?.length, 2);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `top`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.beak.top'));
+```
+
+Unapaswa kuipa `div` mpya ya pili `class` ya `bottom`.
+
+```js
+assert.exists(document.querySelector('.penguin-head > div.beak.bottom'));
+```
+
+Unapaswa kuweka `div.beak.top` baada ya `div.blush.right`.
+
+```js
+assert.exists(document.querySelector('.blush.right + .beak.top'));
+```
+
+Unapaswa kuweka `div.beak.bottom` baada ya `div.beak.top`.
+
+```js
+assert.exists(document.querySelector('.beak.top + .beak.bottom'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d115e2adcd71538e82ebb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d115e2adcd71538e82ebb.md
new file mode 100644
index 00000000000..75fc6bf14de
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d115e2adcd71538e82ebb.md
@@ -0,0 +1,256 @@
+---
+id: 619d115e2adcd71538e82ebb
+title: Hatua ya 68
+challengeType: 0
+dashedName: step-68
+---
+
+# --description--
+
+Lenga vipengele vya `.beak`, na uzipe `height` ya `10%`, `background-color` ya `orange`, nana kuzipa pembe zote radius ya `50%`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.beak`.
+
+```js
+assert.match(code, /\.beak\s*\{/);
+```
+
+Unapaswa kuipa `.beak` `height` ya `--fcc-expected--`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak')?.height, '10%');
+```
+
+Unapaswa kuipa `.beak` `background-color` ya `--fcc-expected--`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak')?.backgroundColor, 'orange');
+```
+
+Unapaswa kuipa `.beak` `border-radius` ya `--fcc-expected--`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak')?.borderRadius, '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d11e6d5ef9515d2a16033.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d11e6d5ef9515d2a16033.md
new file mode 100644
index 00000000000..897b358a2af
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d11e6d5ef9515d2a16033.md
@@ -0,0 +1,262 @@
+---
+id: 619d11e6d5ef9515d2a16033
+title: Hatua ya 69
+challengeType: 0
+dashedName: step-69
+---
+
+# --description--
+
+Lenga kipengele cha `.beak` chenye `class` ya `top`, ipe `width` ya `20%`, na uiweke `60%` kutoka juu na `40%` kutoka upande wa kushoto wa mzazi wake.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.beak.top`.
+
+```js
+assert.match(code, /\.beak\.top\s*\{/);
+```
+
+Unapaswa kuipa `.beak.top` `width` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak.top')?.width, '20%');
+```
+
+Unapaswa kuipa `.beak.top` `top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak.top')?.top, '60%');
+```
+
+Unapaswa kuipa `.beak.top` `left` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak.top')?.left, '40%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d129a417d0716a94de913.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d129a417d0716a94de913.md
new file mode 100644
index 00000000000..f6043ac401e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d129a417d0716a94de913.md
@@ -0,0 +1,267 @@
+---
+id: 619d129a417d0716a94de913
+title: Hatua ya 70
+challengeType: 0
+dashedName: step-70
+---
+
+# --description--
+
+Lenga kipengele cha `.beak` chenye `class` ya `bottom`, na uipe `width` ya `4%` ndogo kuliko `.beak.top`, `5%` zaidi kutoka juu, na `2%` zaidi kutoka upande wa kushoto wa mzazi wake kuliko `.beak.top`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.beak.bottom`.
+
+```js
+assert.match(code, /\.beak\.bottom\s*\{/);
+```
+
+Unapaswa kuipa `.beak.bottom` `width` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak.bottom')?.width, '16%');
+```
+
+Unapaswa kuipa `.beak.bottom` `top` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak.bottom')?.top, '65%');
+```
+
+Unapaswa kuipa `.beak.bottom` `left` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak.bottom')?.left, '42%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+--fcc-editable-region--
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1340361095175f4b5115.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1340361095175f4b5115.md
new file mode 100644
index 00000000000..438b0400648
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1340361095175f4b5115.md
@@ -0,0 +1,267 @@
+---
+id: 619d1340361095175f4b5115
+title: Hatua ya 71
+challengeType: 0
+dashedName: step-71
+---
+
+# --description--
+
+Mwili wa pengwini unaonekana wazi kidogo. Msaidie kwa kuongeza kipengele cha `div` kwa `class` ya `shirt`, mara moja kabla ya kipengele cha `.penguin-body`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `div` kwenye `.penguin`. `--fcc-expected--` inatarajiwa kwa vipengele vya `div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin > div')?.length, 3);
+```
+
+Unapaswa kuipa `div` mpya `class` ya `shirt`.
+
+```js
+assert.exists(document.querySelector('.penguin > div.shirt'));
+```
+
+Unapaswa kuweka `div` mpya kabla ya `.penguin-body`.
+
+```js
+assert.exists(document.querySelector('.shirt + .penguin-body'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d15797b580c1828b05426.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d15797b580c1828b05426.md
new file mode 100644
index 00000000000..89690f451b1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d15797b580c1828b05426.md
@@ -0,0 +1,263 @@
+---
+id: 619d15797b580c1828b05426
+title: Hatua ya 72
+challengeType: 0
+dashedName: step-72
+---
+
+# --description--
+
+Ndani ya kipengele cha `.shirt`, ongeza `div` yenye emoji ifuatayo kama maudhui: 💜
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `div` kwenye `div.shirt`. `--fcc-expected--` inatarajiwa kwa vipengele vya `div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.shirt > div')?.length, 1);
+```
+
+Unapaswa kuipa `div` mpya maudhui ya `💜`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelector('.shirt > div')?.textContent, '💜');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d15d955d9d418c4487bbc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d15d955d9d418c4487bbc.md
new file mode 100644
index 00000000000..b2ea30fb248
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d15d955d9d418c4487bbc.md
@@ -0,0 +1,264 @@
+---
+id: 619d15d955d9d418c4487bbc
+title: Hatua ya 73
+challengeType: 0
+dashedName: step-73
+---
+
+# --description--
+
+Ndani ya `.shirt`, baada ya kipengele cha `div`, ongeza kipengele cha `p` chenye maudhui yafuatayo: `I CSS`
+
+# --hints--
+
+Unapaswa kuongeza kipengele kimoja cha `p` ndani ya `.shirt`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.shirt > p')?.length, 1);
+```
+
+Unapaswa kukipa kipengele cha `p` maudhui `I CSS`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelector('.shirt > p')?.textContent, 'I CSS');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1629a8adc61960ca8b40.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1629a8adc61960ca8b40.md
new file mode 100644
index 00000000000..1807ea85bb9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1629a8adc61960ca8b40.md
@@ -0,0 +1,278 @@
+---
+id: 619d1629a8adc61960ca8b40
+title: Hatua ya 74
+challengeType: 0
+dashedName: step-74
+---
+
+# --description--
+
+Lenga kipengele cha `.shirt`, na uweke `font-size` kuwa `25px`, `font-family` kuwa `Helvetica` yenye njia mbadala ya `sans-serif`, na `font-weight` kuwa `bold`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.shirt`.
+
+```js
+assert.match(code, /\.shirt\s*\{/);
+```
+
+Unapaswa kuipa `.shirt` `font-size` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt')?.fontSize, '25px');
+```
+
+Unapaswa kuipa `.shirt` `font-family` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt')?.fontFamily, 'Helvetica, sans-serif');
+```
+
+Unapaswa kuipa `.shirt` `font-weight` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt')?.fontWeight, 'bold');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1c5fc9f8941a400955da.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1c5fc9f8941a400955da.md
new file mode 100644
index 00000000000..c6f5f634087
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1c5fc9f8941a400955da.md
@@ -0,0 +1,272 @@
+---
+id: 619d1c5fc9f8941a400955da
+title: Hatua ya 75
+challengeType: 0
+dashedName: step-75
+---
+
+# --description--
+
+Katika baadhi ya vivinjari, emoji ya _heart_ inaweza kuonekana tofauti kidogo na hatua ya awali. Hii ni kwa sababu baadhi ya sifa za mhusika zilibatilishwa na mtindo wa `font-weight` wa `bold`.
+
+Rekebisha hili, kwa kulenga `div` na emoji ya moyo, na kuweka `font-weight` kwa thamani yake asili.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.shirt div` ili kulenga `div` kwa emoji ya moyo.
+
+```js
+assert.match(code, /\.shirt div\s*\{/);
+```
+
+Unapaswa kuipa `.shirt div` `font-weight` ya `initial` au `normal`.
+
+```js
+assert.include(['normal', 'initial'], new __helpers.CSSHelp(document).getStyle('.shirt div')?.fontWeight);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+--fcc-editable-region--
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+}
+
+
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1dab9ff3421ae1976991.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1dab9ff3421ae1976991.md
new file mode 100644
index 00000000000..eaa6ca8ffcf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1dab9ff3421ae1976991.md
@@ -0,0 +1,273 @@
+---
+id: 619d1dab9ff3421ae1976991
+title: Hatua ya 76
+challengeType: 0
+dashedName: step-76
+---
+
+# --description--
+
+Weka `div` kwa emoji ya moyo `22.5px` kutoka juu, na `12px` kutoka upande wa kushoto wa mzazi wake.
+
+# --hints--
+
+Unapaswa kuipa `.shirt div` `top` ya `--fcc-expected--`, lakini iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt div')?.top, '22.5px');
+```
+
+Unapaswa kuipa `.shirt div` `left` ya `--fcc-expected--`, lakini iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt div')?.left, '12px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+--fcc-editable-region--
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+}
+
+.shirt div {
+ font-weight: initial;
+
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1deb8b04811b8839ffe4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1deb8b04811b8839ffe4.md
new file mode 100644
index 00000000000..ed112835143
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1deb8b04811b8839ffe4.md
@@ -0,0 +1,281 @@
+---
+id: 619d1deb8b04811b8839ffe4
+title: Hatua ya 77
+challengeType: 0
+dashedName: step-77
+---
+
+# --description--
+
+Weka kipengele cha `.shirt` `165px` kutoka juu, na `127.5px` kutoka upande wa kushoto wa mzazi wake. Kisha, ongeza mpangilio wake wa kutundika hivi kwamba inaonekana juu ya kipengele cha `.penguin-body`.
+
+# --hints--
+
+Unapaswa kuipa `.shirt` `top` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt')?.top, '165px');
+```
+
+Unapaswa kuipa `.shirt` `left` ya `--fcc-expected--`, lakini iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt')?.left, '127.5px');
+```
+
+Unapaswa kukipa kipengele cha `.shirt` `z-index` ya `1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt')?.zIndex, '1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+--fcc-editable-region--
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1e7a8e81a61c5a819dc4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1e7a8e81a61c5a819dc4.md
new file mode 100644
index 00000000000..4b82990f251
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1e7a8e81a61c5a819dc4.md
@@ -0,0 +1,272 @@
+---
+id: 619d1e7a8e81a61c5a819dc4
+title: Hatua ya 78
+challengeType: 0
+dashedName: step-78
+---
+
+# --description--
+
+Kwa mguso wa mwisho wa shati, weka `color` kuwa `#6a6969`.
+
+# --hints--
+
+Unapaswa kuipa `.shirt` `color` ya `#6a6969`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.shirt')?.color, 'rgb(106, 105, 105)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+--fcc-editable-region--
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+--fcc-editable-region--
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1ed33c9a071cf657a0d6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1ed33c9a071cf657a0d6.md
new file mode 100644
index 00000000000..6f933475eb7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1ed33c9a071cf657a0d6.md
@@ -0,0 +1,306 @@
+---
+id: 619d1ed33c9a071cf657a0d6
+title: Hatua ya 79
+challengeType: 0
+dashedName: step-79
+---
+
+# --description--
+
+Ukweli wa kufurahisha: Penguins hawawezi kusimama bila angalau miguu miwili.
+
+Ndani ya kila kipengele cha `.penguin-body`, ongeza vipengele viwili vya `div` kila kimoja kikiwa na `class` ya `foot`. Ipe `.foot` ya kwanza `class` ya `left`, na `.foot` ya pili `class` ya `right`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` ndani ya `.penguin-body`. Vipengele vya `--fcc-expected--` `div` vilivyotarajiwa, vimepatikana `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-body > div')?.length, 2);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `foot`.
+
+```js
+assert.exists(document.querySelector('.penguin-body > div.foot'));
+```
+
+Unapaswa kuipa `div` ya pili `class` ya `foot`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-body > div.foot')?.length, 2);
+```
+
+Unapaswa kuipa `div` moja `class` ya `left`.
+
+```js
+assert.exists(document.querySelector('.penguin-body > div.foot.left'));
+```
+
+Unapaswa kuipa `div` nyingine `class` ya `right`.
+
+```js
+assert.exists(document.querySelector('.penguin-body > div.foot.right'));
+```
+
+Unapaswa kuweka `.foot.right` baada ya `.foot.left`.
+
+```js
+assert.exists(document.querySelector('.foot.left + .foot.right'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1fb5d244c31db8a7fdb7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1fb5d244c31db8a7fdb7.md
new file mode 100644
index 00000000000..c8cfb4db155
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d1fb5d244c31db8a7fdb7.md
@@ -0,0 +1,295 @@
+---
+id: 619d1fb5d244c31db8a7fdb7
+title: Hatua ya 80
+challengeType: 0
+dashedName: step-80
+---
+
+# --description--
+
+Lenga vipengele vya `.foot`, na uzipe `width` ya `15%`, `height` ya `30%`, na `background-color` ya `orange`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.foot`.
+
+```js
+assert.match(code, /\.foot\s*\{/);
+```
+
+Unapaswa kuipa `.foot` `width` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot')?.width, '15%');
+```
+
+Unapaswa kuipa `.foot` `height` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot')?.height, '30%');
+```
+
+Unapaswa kuipa `.foot` `background-color` ya `--fcc-expected--`, iliyopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot')?.backgroundColor, 'orange');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d204bd73ae51e743b8e94.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d204bd73ae51e743b8e94.md
new file mode 100644
index 00000000000..809b1cd0254
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d204bd73ae51e743b8e94.md
@@ -0,0 +1,288 @@
+---
+id: 619d204bd73ae51e743b8e94
+title: Hatua ya 81
+challengeType: 0
+dashedName: step-81
+---
+
+# --description--
+
+Weka vipengele vya `.foot`, `85%` kutoka juu ya mzazi wao, na upe pembe zote radius ya `50%`.
+
+# --hints--
+
+Unapaswa kuipa `.foot` `top` ya `--fcc-expected--`, lakini inayoatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot')?.top, '85%');
+```
+
+Unapaswa kuipa `.foot` `border-radius` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot')?.borderRadius, '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+--fcc-editable-region--
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: orange;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d20b12996101f430920fb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d20b12996101f430920fb.md
new file mode 100644
index 00000000000..cb0f4114095
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d20b12996101f430920fb.md
@@ -0,0 +1,304 @@
+---
+id: 619d20b12996101f430920fb
+title: Hatua ya 82
+challengeType: 0
+dashedName: step-82
+---
+
+# --description--
+
+Mdomo na miguu ya pengwini hushiriki `color` sawa.
+
+Unda kigezo kipya maalum cha CSS kiitwacho `--penguin-picorna`, na ubadilishe thamani zote za sifa zinazohusiana nayo.
+
+# --hints--
+
+Unapaswa kuipa `:root` sifa ya `--penguin-picorna`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle(':root').getPropertyValue('--penguin-picorna'));
+```
+
+Unapaswa kuipa `--penguin-picorna` thamani ya `orange`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root').getPropVal('--penguin-picorna', true), 'orange');
+```
+
+Unapaswa kuipa `.beak` `background-color` ya `var(--penguin-picorna)`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.beak')?.getPropVal('background-color', true), 'var(--penguin-picorna)');
+```
+
+Unapaswa kuipa `.foot` `background-color` ya `var(--penguin-picorna)`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot')?.getPropVal('background-color', true), 'var(--penguin-picorna)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --penguin-face: white;
+
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: orange;
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: orange;
+ top: 85%;
+ border-radius: 50%;
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d21fe6a3f9b2016be9d9d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d21fe6a3f9b2016be9d9d.md
new file mode 100644
index 00000000000..94649df5d69
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d21fe6a3f9b2016be9d9d.md
@@ -0,0 +1,304 @@
+---
+id: 619d21fe6a3f9b2016be9d9d
+title: Hatua ya 83
+challengeType: 0
+dashedName: step-83
+---
+
+# --description--
+
+Lenga kipengele cha `.foot` kilicho na `class` ya `left` na uiweke `25%` kutoka upande wa kushoto wa mzazi wake. Kisha, lenga kipengele cha `.foot` chenye `class` ya `right` na ukiweke `25%` kulia kwa mzazi wake.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.foot.left`.
+
+```js
+assert.match(code, /\.foot\.left\s*\{/);
+```
+
+Unapaswa kuipa `.foot.left` `left` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot.left')?.left, '25%');
+```
+
+Unapaswa kutumia kichaguzi cha `.foot.right`.
+
+```js
+assert.match(code, /\.foot\.right\s*\{/);
+```
+
+Unapaswa kuipa `.foot.right` `right` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot.right')?.right, '25%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+--fcc-editable-region--
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+}
+
+
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d229b0e542520cd91c685.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d229b0e542520cd91c685.md
new file mode 100644
index 00000000000..240e1dd2e99
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d229b0e542520cd91c685.md
@@ -0,0 +1,312 @@
+---
+id: 619d229b0e542520cd91c685
+title: Hatua ya 84
+challengeType: 0
+dashedName: step-84
+---
+
+# --description--
+
+Ili kufanya miguu ya pengwini ionekane zaidi _penguiny_, zungusha mguu wa kushoto kwa `80deg`, na kulia kwa `-80deg`.
+
+# --hints--
+
+Unapaswa kuipa `.foot.left` `transform` ya `rotate(80deg)`.
+
+```js
+const leftFoot = new __helpers.CSSHelp(document).getStyle('.foot.left');
+
+if (leftFoot?.transform) {
+ assert.equal(leftFoot.getPropVal('transform', true), 'rotate(80deg)');
+} else {
+ assert.equal(leftFoot.getPropVal('rotate', true), '80deg');
+}
+```
+
+Unapaswa kuipa `.foot.right` `transform` ya `rotate(-80deg)`.
+
+```js
+const rightFoot = new __helpers.CSSHelp(document).getStyle('.foot.right');
+
+if (rightFoot?.transform) {
+ assert.equal(rightFoot.getPropVal('transform', true), 'rotate(-80deg)');
+} else {
+ assert.equal(rightFoot.getPropVal('rotate', true), '-80deg');
+}
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+}
+
+--fcc-editable-region--
+.foot.left {
+ left: 25%;
+
+}
+
+.foot.right {
+ right: 25%;
+
+}
+--fcc-editable-region--
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d23089e787e216a7043d6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d23089e787e216a7043d6.md
new file mode 100644
index 00000000000..07a6a5370c9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d23089e787e216a7043d6.md
@@ -0,0 +1,295 @@
+---
+id: 619d23089e787e216a7043d6
+title: Hatua ya 85
+challengeType: 0
+dashedName: step-85
+---
+
+# --description--
+
+Badilisha mpangilio wa mrundikano wa vipengele vya `.foot` ili vionekane chini ya kipengele cha `.penguin-body`.
+
+# --hints--
+
+Unapaswa kuipa `.foot` `z-index` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foot')?.zIndex, '-1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+--fcc-editable-region--
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+
+}
+--fcc-editable-region--
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d237a107c10221ed743fa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d237a107c10221ed743fa.md
new file mode 100644
index 00000000000..55235f9af0b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d237a107c10221ed743fa.md
@@ -0,0 +1,328 @@
+---
+id: 619d237a107c10221ed743fa
+title: Hatua ya 86
+challengeType: 0
+dashedName: step-86
+---
+
+# --description--
+
+Ukweli wa kufurahisha: Pengwini hawawezi kuruka bila mbawa.
+
+Ndani ya kila kipengele cha `.penguin-body`, kabla ya vipengele vya`.foot`, ongeza vipengele viwili vya `div` kila kimoja kikiwa na `class` ya `arm`. Ipe `.arm` ya kwanza `class` ya `left`, na `.arm` ya pili `class` ya `right`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` ndani ya `.penguin-body`. `--fcc-expected--` inatarajiwa kwa vipengele vya `div`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-body > div')?.length, 4);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza `class` ya `arm`.
+
+```js
+assert.exists(document.querySelector('.penguin-body > div.arm'));
+```
+
+Unapaswa kuipa `div` mpya ya pili `class` ya `arm`.
+
+```js
+assert.equal(document.querySelectorAll('.penguin-body > div.arm')?.length, 2);
+```
+
+Unapaswa kuipa `div` moja `class` ya `left`.
+
+```js
+assert.exists(document.querySelector('.penguin-body > div.arm.left'));
+```
+
+Unapaswa kuipa `div` nyingine `class` ya `right`.
+
+```js
+assert.exists(document.querySelector('.penguin-body > div.arm.right'));
+```
+
+Unapaswa kuweka `.arm.right` baada ya `.arm.left`.
+
+```js
+assert.exists(document.querySelector('.arm.left + .arm.right'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d26b12e651022d80cd017.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d26b12e651022d80cd017.md
new file mode 100644
index 00000000000..f64c9e33d93
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d26b12e651022d80cd017.md
@@ -0,0 +1,317 @@
+---
+id: 619d26b12e651022d80cd017
+title: Hatua ya 87
+challengeType: 0
+dashedName: step-87
+---
+
+# --description--
+
+Lenga vipengele vya `.arm`, na uzipe `width` ya `30%`, `height` ya `60%`, na `background` ya linear gradient ya `90deg` kutoka mzunguko wa akrabu, kwanzia `gray` na kuishia `rgb(209, 210, 199)`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.arm`.
+
+```js
+assert.match(code, /\.arm\s*\{/);
+```
+
+Unapaswa kuipa `.arm` `width` ya `--fcc-expected--`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm')?.width, '30%');
+```
+
+Unapaswa kuipa `.arm` `height` ya `--fcc-expected--`, inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm')?.height, '60%');
+```
+
+Unapaswa kuipa `.arm` `background` ya `linear-gradient(90deg, gray, rgb(209, 210, 199))`.
+
+```js
+assert.include(['linear-gradient(90deg,gray,rgb(209,210,199))', 'rgba(0,0,0,0)linear-gradient(90deg,gray,rgb(209,210,199))repeatscroll0%0%'], new __helpers.CSSHelp(document).getStyle('.arm')?.getPropVal('background', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2712853306238f41828e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2712853306238f41828e.md
new file mode 100644
index 00000000000..355254780d3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2712853306238f41828e.md
@@ -0,0 +1,332 @@
+---
+id: 619d2712853306238f41828e
+title: Hatua ya 88
+challengeType: 0
+dashedName: step-88
+---
+
+# --description--
+
+Unda kigezo maalum cha CSS kiitwacho `--penguin-skin`, na kiweke kiwe `gray`. Kisha, badilisha sifa zote muhimu nayo.
+
+# --hints--
+
+Unapaswa kuipa `:root` sifa ya `--penguin-skin`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle(':root').getPropertyValue('--penguin-skin'));
+```
+
+Unapaswa kuipa `--penguin-skin` thamani ya `gray`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root').getPropVal('--penguin-skin', true), 'gray');
+```
+
+Unapaswa kuipa `.penguin-head` `background` ya `linear-gradient(45deg, var(--penguin-skin), rgb(239, 240, 228))`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-head')?.getPropVal('background', true), 'linear-gradient(45deg,var(--penguin-skin),rgb(239,240,228))');
+```
+
+Unapaswa kuipa `.penguin-body::before` `background-color` ya `var(--penguin-skin)`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin-body::before')?.getPropVal('background-color', true), 'var(--penguin-skin)');
+```
+
+Unapaswa kuipa `.arm` `background` ya `linear-gradient(90deg, var(--penguin-skin), rgb(209, 210, 199))`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm')?.getPropVal('background', true), 'linear-gradient(90deg,var(--penguin-skin),rgb(209,210,199))');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ gray,
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: gray;
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ gray,
+ rgb(209, 210, 199)
+ );
+}
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2b7a84e78b246f2d17a2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2b7a84e78b246f2d17a2.md
new file mode 100644
index 00000000000..35dcfa4bd28
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2b7a84e78b246f2d17a2.md
@@ -0,0 +1,340 @@
+---
+id: 619d2b7a84e78b246f2d17a2
+title: Hatua ya 89
+challengeType: 0
+dashedName: step-89
+---
+
+# --description--
+
+Lenga kipengele cha `.arm` chenye `class` ya `left`, na uiweke `35%` kutoka juu, na `5%` kutoka upande wa kushoto wa mzazi wake. Kisha, lenga kipengele cha `.arm` chenye `class` ya `right` na uiweke `0%` kutoka juu, na `-5%` kutoka upande wa kulia wa mzazi wake.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.arm.left`.
+
+```js
+assert.match(code, /\.arm\.left\s*\{/);
+```
+
+Unapaswa kuipa `.arm.left` `top` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm.left')?.top, '35%');
+```
+
+Unapaswa kuipa `.arm.left` `left` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm.left')?.left, '5%');
+```
+
+Unapaswa kutumia kichaguzi cha `.arm.right`.
+
+```js
+assert.match(code, /\.arm\.right\s*\{/);
+```
+
+Unapaswa kuipa `.arm.right` `top` ya `0%`.
+
+```js
+assert.include(['0%', '0', '0px'], new __helpers.CSSHelp(document).getStyle('.arm.right')?.top);
+```
+
+Unapaswa kuipa `.arm.right` `right` ya `--fcc-expected--`, lakini inayopatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm.right')?.right, '-5%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2bd9c1d43c2526e96f1f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2bd9c1d43c2526e96f1f.md
new file mode 100644
index 00000000000..d98f6ce72c6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2bd9c1d43c2526e96f1f.md
@@ -0,0 +1,325 @@
+---
+id: 619d2bd9c1d43c2526e96f1f
+title: Hatua ya 90
+challengeType: 0
+dashedName: step-90
+---
+
+# --description--
+
+Ndani ya kichaguzi cha `.arm.left`, badilisha asili ya kitendakazi cha `transform` kuwa kona ya juu kushoto ya mzazi wake.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `transform-origin` kufanya hivi.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.arm.left')?.transformOrigin);
+```
+
+Unapaswa kuipa `.arm.left` `transform-origin` ya `0% 0%` au `top left`.
+
+```js
+assert.include(['0% 0%', 'left top', '0% 0% 0px', 'left top 0px'], new __helpers.CSSHelp(document).getStyle('.arm.left')?.transformOrigin);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+}
+
+--fcc-editable-region--
+.arm.left {
+ top: 35%;
+ left: 5%;
+
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+}
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2d4e80400325ff89664a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2d4e80400325ff89664a.md
new file mode 100644
index 00000000000..2a0c977eafb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2d4e80400325ff89664a.md
@@ -0,0 +1,326 @@
+---
+id: 619d2d4e80400325ff89664a
+title: Hatua ya 91
+challengeType: 0
+dashedName: step-91
+---
+
+# --description--
+
+Ili kuweka linear gradient kwenye upande sahihi wa mkono wa kushoto wa pengwini, kwanza uzungushe kwa `130deg`, kisha ugeuze x-axis.
+
+# --hints--
+
+Unapaswa kuipa `.arm.left` `transform` ya `rotate(130deg) scaleX(-1)`.
+
+```js
+const leftArm = new __helpers.CSSHelp(document).getStyle('.arm.left');
+
+if (leftArm?.rotate && leftArm?.transform) {
+ assert.equal(leftArm.getPropVal('rotate', true), '130deg');
+ assert.equal(leftArm.getPropVal('transform', true), 'scaleX(-1)');
+} else {
+ assert.equal(leftArm.getPropVal('transform', true), 'rotate(130deg)scaleX(-1)');
+}
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+}
+
+--fcc-editable-region--
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+}
+--fcc-editable-region--
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2ebc81ba81271460850d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2ebc81ba81271460850d.md
new file mode 100644
index 00000000000..c3b437b7f3c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2ebc81ba81271460850d.md
@@ -0,0 +1,326 @@
+---
+id: 619d2ebc81ba81271460850d
+title: Hatua ya 92
+challengeType: 0
+dashedName: step-92
+---
+
+# --description--
+
+Zungusha mkono wa kulia kwa `45deg` kinyume cha saa.
+
+# --hints--
+
+Unapaswa kuipa `.arm.right` `transform` ya `rotate(-45deg)`.
+
+```js
+const rightArm = new __helpers.CSSHelp(document).getStyle('.arm.right');
+
+if (rightArm?.transform) {
+ assert.equal(rightArm?.getPropVal('transform', true), 'rotate(-45deg)');
+} else {
+ assert.equal(rightArm?.getPropVal('rotate', true), '-45deg');
+}
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+}
+
+--fcc-editable-region--
+.arm.right {
+ top: 0%;
+ right: -5%;
+}
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2f0e9440bc27caee1cec.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2f0e9440bc27caee1cec.md
new file mode 100644
index 00000000000..fa097668bf6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2f0e9440bc27caee1cec.md
@@ -0,0 +1,327 @@
+---
+id: 619d2f0e9440bc27caee1cec
+title: Hatua ya 93
+challengeType: 0
+dashedName: step-93
+---
+
+# --description--
+
+Ukweli wa kufurahisha: Nyingi, ikiwa sio zote, mabango sio mistatili asilia.
+
+Vipe vipengele vya `.arm` kona za top -left, top-right, na bottom-right radius ya `30%`, na kona ya bottom-left radius ya `120%`.
+
+# --hints--
+
+Unapaswa kuipa `.arm` `border-radius` ya `30% 30% 30% 120%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm')?.borderTopLeftRadius, '30%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm')?.borderTopRightRadius, '30%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm')?.borderBottomRightRadius, '30%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm')?.borderBottomLeftRadius, '120%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+--fcc-editable-region--
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+
+}
+--fcc-editable-region--
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2fd3ff4f772882e3d998.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2fd3ff4f772882e3d998.md
new file mode 100644
index 00000000000..74e57514d08
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d2fd3ff4f772882e3d998.md
@@ -0,0 +1,323 @@
+---
+id: 619d2fd3ff4f772882e3d998
+title: Hatua ya 94
+challengeType: 0
+dashedName: step-94
+---
+
+# --description--
+
+Badilisha mpangilio wa vipengee vya `.arm` ili vionekane nyuma ya kipengele cha `.penguin-body`.
+
+# --hints--
+
+Unapaswa kuipa `.arm` `z-index` ya `--fcc-expected--`, lakini ikapatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm')?.zIndex, '-1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+--fcc-editable-region--
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+
+}
+--fcc-editable-region--
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d30350883802921bfcccc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d30350883802921bfcccc.md
new file mode 100644
index 00000000000..d53a691b9a4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d30350883802921bfcccc.md
@@ -0,0 +1,333 @@
+---
+id: 619d30350883802921bfcccc
+title: Hatua ya 95
+challengeType: 0
+dashedName: step-95
+---
+
+# --description--
+
+Sasa, utatumia uhuishaji wa CSS kutengeneza penguin wave.
+
+Unda sheria ya `@keyframes` inayoitwa `wave`.
+
+# --hints--
+
+Unapaswa kuwa na sheria ya `@keyframes`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getCSSRules('keyframes'));
+```
+
+Unapaswa kuipa sheria ya `@keyframes` jina la `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getCSSRules('keyframes')?.[0]?.name, 'wave');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d324f5915c929f36ae91d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d324f5915c929f36ae91d.md
new file mode 100644
index 00000000000..a484ab9bd08
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d324f5915c929f36ae91d.md
@@ -0,0 +1,351 @@
+---
+id: 619d324f5915c929f36ae91d
+title: Hatua ya 96
+challengeType: 0
+dashedName: step-96
+---
+
+# --description--
+
+Ipe `wave` waypoints nne kuanzia `10%`, na ukiongeza kwa `10%`.
+
+# --hints--
+
+Unapaswa kuongeza waypoint ya `10%` kwa `@keyframes wave`.
+
+```js
+assert([...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].some(css => css?.keyText === '10%'));
+```
+
+Unapaswa kuongeza waypoint ya `20%` kwa `@keyframes wave`.
+
+```js
+assert([...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].some(css => css?.keyText === '20%'));
+```
+
+Unapaswa kuongeza waypoint ya `30%` kwa `@keyframes wave`.
+
+```js
+assert([...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].some(css => css?.keyText === '30%'));
+```
+
+Unapaswa kuongeza waypoint ya `40%` kwa `@keyframes wave`.
+
+```js
+assert([...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].some(css => css?.keyText === '40%'));
+```
+
+Unapaswa kuwa na waypoint 4 kwenye keyframe yako.
+
+```js
+assert([...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].length === 4);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+--fcc-editable-region--
+@keyframes wave {
+
+}
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d32c7fa21f32aaa91d499.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d32c7fa21f32aaa91d499.md
new file mode 100644
index 00000000000..c11e8509725
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d32c7fa21f32aaa91d499.md
@@ -0,0 +1,347 @@
+---
+id: 619d32c7fa21f32aaa91d499
+title: Hatua ya 97
+challengeType: 0
+dashedName: step-97
+---
+
+# --description--
+
+Ndani ya waypoint, zungusha hadi `110deg`, na uhifadhi upanuzi wa mkono wa kushoto.
+
+# --hints--
+
+Unapaswa kuipa waypoint ya `10%` `transform` ya `rotate(110deg) scaleX(-1)`.
+
+```js
+const wave10Percent = [...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].find(css => css?.keyText === '10%');
+const rotateProp = wave10Percent?.style?.rotate?.replace(/\s+/g, '');
+const transformProp = wave10Percent?.style?.transform?.replace(/\s+/g, '');
+
+if (rotateProp && transformProp) {
+ assert(rotateProp === '110deg');
+ assert(transformProp === 'scaleX(-1)');
+} else {
+ assert(transformProp === 'rotate(110deg)scaleX(-1)');
+}
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+--fcc-editable-region--
+@keyframes wave {
+ 10% {
+
+ }
+ 20% {
+
+ }
+ 30% {
+
+ }
+ 40% {
+
+ }
+}
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d333b738e3c2b5d58b095.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d333b738e3c2b5d58b095.md
new file mode 100644
index 00000000000..bc9e6aeacb7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d333b738e3c2b5d58b095.md
@@ -0,0 +1,347 @@
+---
+id: 619d333b738e3c2b5d58b095
+title: Hatua ya 98
+challengeType: 0
+dashedName: step-98
+---
+
+# --description--
+
+Ndani ya waypoint ya pili, zungusha hadi `130deg`, na uhifadhi upanuzi wa mkono wa kushoto.
+
+# --hints--
+
+Unapaswa kuipa waypoint ya `20%` `transform` ya `rotate(130deg) scaleX(-1)`.
+
+```js
+const wave20Percent = [...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].find(css => css?.keyText === '20%');
+const transformProp = wave20Percent?.style?.transform?.replace(/\s+/g, '');
+const rotateProp = wave20Percent?.style?.rotate?.replace(/\s+/g, '');
+
+if (rotateProp && transformProp) {
+ assert(rotateProp === '130deg');
+ assert(transformProp === 'scaleX(-1)');
+} else {
+ assert(transformProp === 'rotate(130deg)scaleX(-1)');
+}
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+--fcc-editable-region--
+@keyframes wave {
+ 10% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 20% {
+
+ }
+ 30% {
+
+ }
+ 40% {
+
+ }
+}
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d337765b9f02c10e93722.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d337765b9f02c10e93722.md
new file mode 100644
index 00000000000..5938c755643
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d337765b9f02c10e93722.md
@@ -0,0 +1,362 @@
+---
+id: 619d337765b9f02c10e93722
+title: Hatua ya 99
+challengeType: 0
+dashedName: step-99
+---
+
+# --description--
+
+Kwa waypoints za tatu na nne, rudia muundo wa `transform` tena.
+
+# --hints--
+
+Unapaswa kuipa waypoint ya `30%` `transform` ya `rotate(110deg) scaleX(-1)`.
+
+```js
+const wave30Percent = [...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].find(css => css?.keyText === '30%');
+const transformProp = wave30Percent?.style?.transform?.replace(/\s+/g, '');
+const rotateProp = wave30Percent?.style?.rotate?.replace(/\s+/g, '');
+
+if (rotateProp && transformProp) {
+ assert(rotateProp === '110deg');
+ assert(transformProp === 'scaleX(-1)');
+} else {
+ assert(transformProp === 'rotate(110deg)scaleX(-1)');
+}
+```
+
+Unapaswa kuipa waypoint ya `40%` `transform` ya `rotate(130deg) scaleX(-1)`.
+
+```js
+const wave40Percent = [...[...new __helpers.CSSHelp(document).getCSSRules('keyframes')].find(rule => rule?.name === 'wave')?.cssRules].find(css => css?.keyText === '40%');
+const transformProp = wave40Percent?.style?.transform?.replace(/\s+/g, '');
+const rotateProp = wave40Percent?.style?.rotate?.replace(/\s+/g, '');
+
+if (rotateProp && transformProp) {
+ assert(rotateProp === '130deg');
+ assert(transformProp === 'scaleX(-1)');
+} else {
+ assert(transformProp === 'rotate(130deg)scaleX(-1)');
+}
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+--fcc-editable-region--
+@keyframes wave {
+ 10% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 20% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+ 30% {
+
+ }
+ 40% {
+
+ }
+}
+--fcc-editable-region--
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d33c51140292cc5a21742.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d33c51140292cc5a21742.md
new file mode 100644
index 00000000000..f45cadb2fa6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d33c51140292cc5a21742.md
@@ -0,0 +1,357 @@
+---
+id: 619d33c51140292cc5a21742
+title: Hatua ya 100
+challengeType: 0
+dashedName: step-100
+---
+
+# --description--
+
+Tumia uhuishaji wa `wave` kwenye mkono wa kushoto. Kuwa na uhuishaji usioisha wa `3s`, na uwe na kitendakazi cha linear timing.
+
+# --hints--
+
+Unapaswa kuipa `.arm.left` `animation-name` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm.left')?.animationName, 'wave');
+```
+
+Unapaswa kuipa `.arm.left` `animation-duration` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm.left')?.animationDuration, '3s');
+```
+
+Unapaswa kuipa `.arm.left` `animation-iteration-count` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm.left')?.animationIterationCount, 'infinite');
+```
+
+Unapaswa kuipa `.arm.left` `animation-timing-function` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.arm.left')?.animationTimingFunction, 'linear');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+--fcc-editable-region--
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+
+}
+--fcc-editable-region--
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+@keyframes wave {
+ 10% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 20% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+ 30% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 40% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3482f505452d861d0f62.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3482f505452d861d0f62.md
new file mode 100644
index 00000000000..a74823524ed
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3482f505452d861d0f62.md
@@ -0,0 +1,347 @@
+---
+id: 619d3482f505452d861d0f62
+title: Hatua ya 101
+challengeType: 0
+dashedName: step-101
+---
+
+# --description--
+
+Lenga kipengele cha `.penguin` kinapotumika, na uongeze ukubwa wake kwa `50%` katika vipimo vyote viwili.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.penguin:active`.
+
+```js
+assert.match(code, /\.penguin:active\s*\{/);
+```
+
+Unapaswa kuipa `.penguin:active` `transform` ya `scale(1.5)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin:active')?.getPropVal('transform', true), 'scale(1.5)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+ animation: 3s linear infinite wave;
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+@keyframes wave {
+ 10% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 20% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+ 30% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 40% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3561a951bf2e41a24f10.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3561a951bf2e41a24f10.md
new file mode 100644
index 00000000000..b210c737e9f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3561a951bf2e41a24f10.md
@@ -0,0 +1,346 @@
+---
+id: 619d3561a951bf2e41a24f10
+title: Hatua ya 102
+challengeType: 0
+dashedName: step-102
+---
+
+# --description--
+
+Unapoamilisha kipengele cha `.penguin`, inaweza kuonekana kana kwamba unaweza kukiburuta. Hiyo si kweli.
+
+Onyesha hili kwa watumiaji, kwa kuamilisha kipengele kinachotumika cha `cursor` sifa ya `not-allowed`.
+
+# --hints--
+
+Unapaswa kuipa `.penguin:active` sifa ya `cursor` ya `not-allowed`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin:active')?.cursor, 'not-allowed');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+--fcc-editable-region--
+.penguin:active {
+ transform: scale(1.5);
+
+}
+--fcc-editable-region--
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+ animation: 3s linear infinite wave;
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+@keyframes wave {
+ 10% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 20% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+ 30% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 40% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d36103839c82efa95dd34.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d36103839c82efa95dd34.md
new file mode 100644
index 00000000000..1de70dc03eb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d36103839c82efa95dd34.md
@@ -0,0 +1,357 @@
+---
+id: 619d36103839c82efa95dd34
+title: Hatua ya 103
+challengeType: 0
+dashedName: step-103
+---
+
+# --description--
+
+Badilisha tabia ya `transition` ya kipengele cha `.penguin` wakati wa mageuzi ili kuwa na muda wa `1s`, kitendakazi cha kuweka muda cha `ease-in-out`, na kuchelewa kwa `0ms`.
+
+# --hints--
+
+Unapaswa kuipa `.penguin` `transition-duration` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.transitionDuration, '1s');
+```
+
+Unapaswa kuipa `.penguin` `transition-timing-function` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.transitionTimingFunction, 'ease-in-out');
+```
+
+Unapaswa kuipa `.penguin` `transition-delay` ya `--fcc-expected--`, lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.penguin')?.transitionDelay, '0ms');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+--fcc-editable-region--
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+
+}
+--fcc-editable-region--
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin:active {
+ transform: scale(1.5);
+ cursor: not-allowed;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+ animation: 3s linear infinite wave;
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+@keyframes wave {
+ 10% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 20% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+ 30% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 40% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3711d04d623000013e9e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3711d04d623000013e9e.md
new file mode 100644
index 00000000000..90b83a2421f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619d3711d04d623000013e9e.md
@@ -0,0 +1,670 @@
+---
+id: 619d3711d04d623000013e9e
+title: Hatua ya 104
+challengeType: 0
+dashedName: step-104
+---
+
+# --description--
+
+Hatimaye, kokotoa `height` ya kipengele cha `.ground` kuwa urefu wa viewport ukiondoa urefu wa kipengele cha `.penguin`.
+
+Hongera! Umekamilisha uthibitishaji wa Responsive Web Design certification.
+
+# --hints--
+
+Unapaswa kuipa `.ground` `height` ya `calc(100vh - 300px)`.
+
+```js
+assert.include(['calc(100vh-300px)', 'calc(-300px+100vh)'], new __helpers.CSSHelp(document).getStyle('.ground')?.getPropVal('height', true));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+ transition: transform 1s ease-in-out 0ms;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin:active {
+ transform: scale(1.5);
+ cursor: not-allowed;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+ animation: 3s linear infinite wave;
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+@keyframes wave {
+ 10% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 20% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+ 30% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 40% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+--fcc-editable-region--
+.ground {
+ width: 100vw;
+ height: 400px;
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+--fcc-editable-region--
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --penguin-face: white;
+ --penguin-picorna: orange;
+ --penguin-skin: gray;
+}
+
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.left-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(80, 183, 255));
+ position: absolute;
+ transform: skew(0deg, 44deg);
+ z-index: 2;
+ margin-top: 100px;
+}
+
+.back-mountain {
+ width: 300px;
+ height: 300px;
+ background: linear-gradient(rgb(203, 241, 228), rgb(47, 170, 255));
+ position: absolute;
+ z-index: 1;
+ transform: rotate(45deg);
+ left: 110px;
+ top: 225px;
+}
+
+.sun {
+ width: 200px;
+ height: 200px;
+ background-color: yellow;
+ position: absolute;
+ border-radius: 50%;
+ top: -75px;
+ right: -75px;
+}
+
+.penguin {
+ width: 300px;
+ height: 300px;
+ margin: auto;
+ margin-top: 75px;
+ z-index: 4;
+ position: relative;
+ transition: transform 1s ease-in-out 0ms;
+}
+
+.penguin * {
+ position: absolute;
+}
+
+.penguin:active {
+ transform: scale(1.5);
+ cursor: not-allowed;
+}
+
+.penguin-head {
+ width: 50%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ var(--penguin-skin),
+ rgb(239, 240, 228)
+ );
+ border-radius: 70% 70% 65% 65%;
+ top: 10%;
+ left: 25%;
+ z-index: 1;
+}
+
+.face {
+ width: 60%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ border-radius: 70% 70% 60% 60%;
+ top: 15%;
+}
+
+.face.left {
+ left: 5%;
+}
+
+.face.right {
+ right: 5%;
+}
+
+.chin {
+ width: 90%;
+ height: 70%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: 5%;
+ border-radius: 70% 70% 100% 100%;
+}
+
+.eye {
+ width: 15%;
+ height: 17%;
+ background-color: black;
+ top: 45%;
+ border-radius: 50%;
+}
+
+.eye.left {
+ left: 25%;
+}
+
+.eye.right {
+ right: 25%;
+}
+
+.eye-lid {
+ width: 150%;
+ height: 100%;
+ background-color: var(--penguin-face);
+ top: 25%;
+ left: -23%;
+ border-radius: 50%;
+}
+
+.blush {
+ width: 15%;
+ height: 10%;
+ background-color: pink;
+ top: 65%;
+ border-radius: 50%;
+}
+
+.blush.left {
+ left: 15%;
+}
+
+.blush.right {
+ right: 15%;
+}
+
+.beak {
+ height: 10%;
+ background-color: var(--penguin-picorna);
+ border-radius: 50%;
+}
+
+.beak.top {
+ width: 20%;
+ top: 60%;
+ left: 40%;
+}
+
+.beak.bottom {
+ width: 16%;
+ top: 65%;
+ left: 42%;
+}
+
+.shirt {
+ font: bold 25px Helvetica, sans-serif;
+ top: 165px;
+ left: 127.5px;
+ z-index: 1;
+ color: #6a6969;
+}
+
+.shirt div {
+ font-weight: initial;
+ top: 22.5px;
+ left: 12px;
+}
+
+.penguin-body {
+ width: 53%;
+ height: 45%;
+ background: linear-gradient(
+ 45deg,
+ rgb(134, 133, 133) 0%,
+ rgb(234, 231, 231) 25%,
+ white 67%
+ );
+ border-radius: 80% 80% 100% 100%;
+ top: 40%;
+ left: 23.5%;
+}
+
+.penguin-body::before {
+ content: "";
+ position: absolute;
+ width: 50%;
+ height: 45%;
+ background-color: var(--penguin-skin);
+ top: 10%;
+ left: 25%;
+ border-radius: 0% 0% 100% 100%;
+ opacity: 70%;
+}
+
+.arm {
+ width: 30%;
+ height: 60%;
+ background: linear-gradient(
+ 90deg,
+ var(--penguin-skin),
+ rgb(209, 210, 199)
+ );
+ border-radius: 30% 30% 30% 120%;
+ z-index: -1;
+}
+
+.arm.left {
+ top: 35%;
+ left: 5%;
+ transform-origin: top left;
+ transform: rotate(130deg) scaleX(-1);
+ animation: 3s linear infinite wave;
+}
+
+.arm.right {
+ top: 0%;
+ right: -5%;
+ transform: rotate(-45deg);
+}
+
+@keyframes wave {
+ 10% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 20% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+ 30% {
+ transform: rotate(110deg) scaleX(-1);
+ }
+ 40% {
+ transform: rotate(130deg) scaleX(-1);
+ }
+}
+
+.foot {
+ width: 15%;
+ height: 30%;
+ background-color: var(--penguin-picorna);
+ top: 85%;
+ border-radius: 50%;
+ z-index: -1;
+}
+
+.foot.left {
+ left: 25%;
+ transform: rotate(80deg);
+}
+
+.foot.right {
+ right: 25%;
+ transform: rotate(-80deg);
+}
+
+.ground {
+ width: 100vw;
+ height: calc(100vh - 300px);
+ background: linear-gradient(90deg, rgb(88, 175, 236), rgb(182, 255, 255));
+ z-index: 3;
+ position: absolute;
+ margin-top: -58px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61a8fe15a6a31306e60d1e89.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61a8fe15a6a31306e60d1e89.md
new file mode 100644
index 00000000000..894e4af7b04
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/61a8fe15a6a31306e60d1e89.md
@@ -0,0 +1,55 @@
+---
+id: 61a8fe15a6a31306e60d1e89
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Rekebisha ukurasa wako, kwa kuweka `width` kuwa `100%`, na `height` kuwa `100vh`.
+
+# --hints--
+
+Unapaswa kuipa `body` `width` ya `--fcc-expected--`, lakini imepatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.width, '100%');
+```
+
+Unapaswa kuipa `body` `height` ya `--fcc-expected--`, lakini imepatikana `--fcc-actual--`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.height, '100vh');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Penguin
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+body {
+ background: linear-gradient(45deg, rgb(118, 201, 255), rgb(247, 255, 222));
+ margin: 0;
+ padding: 0;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98c9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98c9.md
new file mode 100644
index 00000000000..4fb410f518e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98c9.md
@@ -0,0 +1,53 @@
+---
+id: 5d822fd413a79914d39e98c9
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Karibu kwenye mradi wa CSS Variables Skyline! Anza kwa kuongeza tamko la `!DOCTYPE html` juu ya hati ili kivinjari kijue ni aina gani ya hati inayosoma.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na rejeleo la `DOCTYPE`.
+
+```js
+assert(code.match(/` baada ya aina.
+
+```js
+assert(code.match(/html\s*>/gi));
+```
+
+Tamko lako la `DOCTYPE` linapaswa kuwa mwanzoni mwa HTML yako.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ca.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ca.md
new file mode 100644
index 00000000000..27fecc275ed
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ca.md
@@ -0,0 +1,54 @@
+---
+id: 5d822fd413a79914d39e98ca
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Ongeza tagi za `html` za kufungua na kufunga chini ya `DOCTYPE` ili uwe na mahali pa kuanza kuweka msimbo. Hakikisha umeweka lugha kwa Kiingereza.
+
+# --hints--
+
+Tamko lako la `DOCTYPE` linapaswa kuwa mwanzoni mwa HTML yako.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+Kipengele chako cha `html` kinafaa kuwa na tagi ya ufunguzi yenye sifa ya `lang` ya `en`.
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufunga.
+
+```js
+assert(code.match(/<\/html\s*>/));
+```
+
+Tagi zako `html` zinapaswa kuwa katika mpangilio sahihi.
+
+```js
+assert(code.match(/\s*<\/html\s*>/));
+```
+
+Unapaswa kuwa na kipengele kimoja cha `html` tu.
+
+```js
+assert(document.querySelectorAll('html').length === 1);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cb.md
new file mode 100644
index 00000000000..54ba0104d5b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cb.md
@@ -0,0 +1,69 @@
+---
+id: 5d822fd413a79914d39e98cb
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Kisha ongeza tagi za kufungua na kufunga za `head` na `body` ndani ya kipengele cha `html`.
+
+# --hints--
+
+Unapaswa kuwa na tagi ya kufungua ya `head`.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `head`.
+
+```js
+assert(code.match(/<\/head\s*>/i));
+```
+
+Unapaswa kuwa na tagi ya kufungua ya `body`.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `body`.
+
+```js
+assert(code.match(/<\/body\s*>/i));
+```
+
+Vipengele vya `head` na `body` vinapaswa kuwa ndugu.
+
+```js
+assert(document.querySelector('head').nextElementSibling.localName === 'body');
+```
+
+Kipengele cha `head` kinapaswa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html').children].some(x => x.localName === 'head'));
+```
+
+Kipengele cha `body` kinapaswa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html').children].some(x => x.localName === 'body'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cc.md
new file mode 100644
index 00000000000..25d75ac72f8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cc.md
@@ -0,0 +1,108 @@
+---
+id: 5d822fd413a79914d39e98cc
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Ndani ya kipengele cha `head`, ongeza kipengele cha `meta` chenye `charset` ya `UTF-8`, kipengele cha `title` chenye kichwa cha `City Skyline`, na kipengele cha `link` kinachounganisha faili yako ya `styles.css`.
+
+# --hints--
+
+Unapaswa kuunda kipengele cha `meta` ndani ya kipengele cha `head`.
+
+```js
+assert.exists(document.querySelector('head > meta'));
+```
+
+Unapaswa kuipa tagi ya `meta` `charset` ya `UTF-8`.
+
+```js
+assert.equal(document.querySelector('head > meta')?.getAttribute('charset')?.toLowerCase(), 'utf-8');
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `title`.
+
+```js
+const title = document.querySelector('title');
+assert.exists(title);
+```
+
+Kipengele cha `title` kinapaswa kuwa ndani ya kipengele cha `head`.
+
+```js
+assert.exists(document.querySelector('head > title'));
+```
+
+Mradi wako unapaswa kuwa na kichwa cha `City Skyline`.
+
+```js
+const title = document.querySelector('title');
+assert.equal(title.text.toLowerCase(), 'city skyline')
+```
+
+Kumbuka, ukubwa wa herufi na tahajia ni jambo la muhimu katika kichwa.
+
+```js
+const title = document.querySelector('title');
+assert.equal(title.text, 'City Skyline');
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `link`.
+
+```js
+assert.match(code, /
link'));
+```
+
+Kipengele chako cha `link` kinapaswa kuwa na sifa ya `rel` yenye thamani ya `stylesheet`.
+
+```js
+const link_element = document.querySelector('link');
+const rel = link_element.getAttribute("rel");
+assert.equal(rel, "stylesheet");
+```
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `href` yenye thamani `styles.css`.
+
+```js
+const link = document.querySelector('link');
+assert.equal(link.dataset.href, "styles.css");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cd.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cd.md
new file mode 100644
index 00000000000..f46babbf42b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cd.md
@@ -0,0 +1,56 @@
+---
+id: 5d822fd413a79914d39e98cd
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Katika CSS, unaweza kulenga kila kitu kwa kutumia alama ya nyota (*). Ongeza mpaka kwenye kila kitu kwa kutumia kichaguzi cha `*`, na kuipa `border` ya `1px solid black`. Hii ni mbinu inayosaidia kuona vizuri mahali pa vipengele na ukubwa wake. Baadaye utaondoa hii.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `*`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('*'));
+```
+
+Unapaswa kutumia sifa ya `border` kuunda mtindo wa vipengele vyote.
+
+```js
+assert(new __helpers.CSSHelp(document).isPropertyUsed('border'));
+```
+
+Vipengele vyote vinapaswa kuwa na mpaka wa `1px solid black`.
+
+```js
+const astStyles = new __helpers.CSSHelp(document).getStyle('*');
+assert.equal(astStyles?.border, '1px solid black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ce.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ce.md
new file mode 100644
index 00000000000..76267a1cc60
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ce.md
@@ -0,0 +1,61 @@
+---
+id: 5d822fd413a79914d39e98ce
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Pia ongeza `box-sizing` ya `border-box` kwenye kila kitu. Hii itafanya hivyo kwamba mpaka ulioongeza usiweke ukubwa wowote kwenye vipengele vyako.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `box-sizing`.
+
+```js
+assert(new __helpers.CSSHelp(document).isPropertyUsed('box-sizing'));
+```
+
+Unapaswa kutumia kichaguzi cha `*` kilichopo.
+
+```js
+// Two selectors create two CSSStyleRule objects
+assert.equal(new __helpers.CSSHelp(document).getStyleDeclarations('*').length, 1);
+```
+
+Vipengele vyote vinapaswa kuwa na `box-sizing` ya `border-box`.
+
+```js
+const astStyles = new __helpers.CSSHelp(document).getStyle('*');
+assert.equal(astStyles.boxSizing, 'border-box');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+* {
+ border: 1px solid black;
+}
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cf.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cf.md
new file mode 100644
index 00000000000..08d8cf39add
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98cf.md
@@ -0,0 +1,69 @@
+---
+id: 5d822fd413a79914d39e98cf
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Unaweza kuona `body` (ni sanduku la ndani kabisa kwenye ukurasa wako); sanduku lililozunguka ni kipengele cha `html`. Fanya `body` yako kujaza skrini yote kwa kuipa sifa ya `height` ya `100vh`. Ondoa `margin` ya chaguo-msingi kutoka kwenye kipengele cha `body` kwa kumwekea `margin` ya `0`. Hatimaye, weka sifa ya `overflow` kuwa `hidden` ili kuficha pau zozote za kusogeza zinazoonekana wakati kitu kinapita nyuma ya kituo cha kutazama.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `body`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+`body` yako inapaswa kuwa na `height` ya `100vh`.
+
+```js
+const bodyStyles = new __helpers.CSSHelp(document).getStyle('body');
+assert.equal(bodyStyles?.height, '100vh');
+```
+
+`body` yako inapaswa kuwa na `margin` ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.margin, '0px');
+```
+
+`body` yako inapaswa kuwa na sifa ya `overflow` iliyowekwa kuwa `hidden`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.overflow, 'hidden');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d0.md
new file mode 100644
index 00000000000..3dc3d7b683a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d0.md
@@ -0,0 +1,65 @@
+---
+id: 5d822fd413a79914d39e98d0
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Tengeneza kipengele cha `div` ndani ya `body` na kiwe na class ya `background-buildings`. Hii itakuwa chombo cha kikundi cha majengo.
+
+# --hints--
+
+Unapaswa kuunda kipengele cha `div`.
+
+```js
+assert.exists(document.querySelector('div'));
+```
+
+Kipengele cha `div` kinafaa kuwa ndani ya `body`.
+
+```js
+assert(document.querySelector('div')?.parentElement?.localName === 'body');
+```
+
+Kipengele chako cha `div` kinapaswa kuwa na class ya `background-buildings`
+
+```js
+assert([...document.querySelector('div')?.classList]?.includes('background-buildings'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d1.md
new file mode 100644
index 00000000000..83d97e5d258
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d1.md
@@ -0,0 +1,68 @@
+---
+id: 5d822fd413a79914d39e98d1
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Kipe kipengele chako cha `.background-buildings` `width` na `height` ya `100%` ili iwe na upana na urefu kamili wa mzazi wake, `body`.
+
+# --hints--
+
+Unapaswa kutumia darasa la `background-buildings` ili kuchagua kipengele sahihi.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.background-buildings'));
+```
+
+Kipengele chako cha `.background-buildings` kinapaswa kuwa na `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.background-buildings')?.width, '100%');
+```
+
+Kipengele chako cha `.background-buildings` kinapaswa kuwa na `height` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.background-buildings')?.height, '100%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d2.md
new file mode 100644
index 00000000000..3f99b6ee414
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d2.md
@@ -0,0 +1,83 @@
+---
+id: 5d822fd413a79914d39e98d2
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Weka `div` yenye class ya `bb1` katika kontena la majengo ya usuli (background-buildings). Fungua faili yako ya `styles.css`, kisha weka `.bb1` kuwa na `width` ya `10%` na `height` ya `70%`. "bb" inasimamia "background building", hili litakuwa jengo lako la kwanza.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+assert.equal(document.querySelectorAll('div').length, 2);
+```
+
+Unapaswa kuipa `div` mpya class ya `bb1`.
+
+```js
+assert.exists(document.querySelector('div.bb1'));
+```
+
+Unapaswa kutumia kichaguzi cha class ya `.bb1` ili kuunda mtindo wa kipengele.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1'));
+```
+
+Unapaswa kukipa kipengele cha `.bb1` `width` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1')?.width, '10%');
+```
+
+Unapaswa kukipa kipengele cha `.bb1` `height` ya `70%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1')?.height, '70%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d3.md
new file mode 100644
index 00000000000..bfc4299ae70
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d3.md
@@ -0,0 +1,105 @@
+---
+id: 5d822fd413a79914d39e98d3
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Wekeza vipengele vinne vya `div` ndani ya sanduku la `.bb1`. Zipe darasa za `bb1a`, `bb1b`, `bb1c`, na `bb1d` kwa utaratibu huo. Jengo hili litakuwa na sehemu nne.
+
+# --hints--
+
+Unapaswa kuunda vipengele vinne vya vipya vya `div`.
+
+```js
+assert.equal(document.querySelectorAll('div')?.length, 6);
+```
+
+Unapaswa kukipa kipengele kimoja kipya cha `div` class ya `bb1a`.
+
+```js
+assert.exists(document.querySelector('div.bb1a'));
+```
+
+Unapaswa kukipa kipengele kimoja kipya cha `div` class ya `bb1b`.
+
+```js
+assert.exists(document.querySelector('div.bb1b'));
+```
+
+Unapaswa kukipa kipengele kimoja kipya cha `div` class ya `bb1c`.
+
+```js
+assert.exists(document.querySelector('div.bb1c'));
+```
+
+Unapaswa kukipa kipengele kimoja kipya cha `div` class ya `bb1d`.
+
+```js
+assert.exists(document.querySelector('div.bb1d'));
+```
+
+Unapaswa kuweka vipengele vipya vya `div` kwa utaratibu sahihi.
+
+```js
+function __t(a, b) {
+ return [...document.querySelector(a)?.nextElementSibling?.classList]?.includes(b);
+}
+assert(__t('div.bb1a','bb1b') && __t('div.bb1b','bb1c') && __t('div.bb1c','bb1d'));
+```
+
+Unapaswa kuweka kipengele cha `div` ndani ya kipengele cha `.bb1`.
+
+```js
+assert.equal(document.querySelectorAll('div.bb1 > div')?.length, 4);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d4.md
new file mode 100644
index 00000000000..688deabd43e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d4.md
@@ -0,0 +1,138 @@
+---
+id: 5d822fd413a79914d39e98d4
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Zipe sehemu za jengo lako sifa za `width` na `height` zenye thamani hizi: `70%` na `10%` kwa `.bb1a`, `80%` na `10%` kwa `.bb1b`, `90%` na `10%` kwa `.bb1c`, na `100%` na `70%` kwa `.bb1d`. Kumbuka kuwa asilimia hizi ni kulingana na mzazi na ufahamu kuwa urefu utaongezeka hadi kufikia 100% - kujaza chombo kwa usawa.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha class kuweka mtindo kwa `.bb1a`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1a'));
+```
+
+Unapaswa kuipa `.bb1a` `width` ya `70%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1a')?.width, '70%');
+```
+
+Unapaswa kuipa `.bb1a` `height` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1a')?.height, '10%');
+```
+
+Unapaswa kutumia kichaguzi cha class kuweka mtindo kwa `.bb1b`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1b'));
+```
+
+Unapaswa kuipa `.bb1b` `width` ya `80%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1b')?.width, '80%');
+```
+
+Unapaswa kuipa `.bb1b` `height` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1b')?.height, '10%');
+```
+
+Unapaswa kutumia kichaguzi cha class kuweka mtindo kwa `.bb1c`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1c'));
+```
+
+Unapaswa kuipa `.bb1c` `width` ya `90%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1c')?.width, '90%');
+```
+
+Unapaswa kuipa `.bb1c` `height` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1c')?.height, '10%');
+```
+
+Unapaswa kutumia kichaguzi cha class kuweka mtindo kwa `.bb1d`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1d'));
+```
+
+Unapaswa kuipa `.bb1d` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1d')?.width, '100%');
+```
+
+Unapaswa kuipa `.bb1d` `height` ya `70%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1d')?.height, '70%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d5.md
new file mode 100644
index 00000000000..6090401de1a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d5.md
@@ -0,0 +1,112 @@
+---
+id: 5d822fd413a79914d39e98d5
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Weka sehemu za jengo lako katikati kwa kugeuza kipengele cha `.bb1` kuwa kizazi cha flexbox. Tumia sifa za `flex-direction` na `align-items` ili kuwaweka watoto katikati.
+
+# --hints--
+
+Hupaswi kubadilisha sifa za `.bb1` za `width` au `height`.
+
+```js
+const bb1Style = new __helpers.CSSHelp(document).getStyle('.bb1');
+assert.equal(bb1Style?.width, '10%');
+assert.equal(bb1Style?.height, '70%');
+```
+
+Unapaswa kukipa kipengele cha `.bb1` `display` ya `flex`.
+
+```js
+const bb1Style = new __helpers.CSSHelp(document).getStyle('.bb1');
+assert.equal(bb1Style?.display, 'flex');
+```
+
+Unapaswa kukipa kipengele cha `.bb1` `flex-direction` ya `column`.
+
+```js
+const bb1Style = new __helpers.CSSHelp(document).getStyle('.bb1');
+assert.equal(bb1Style?.flexDirection, 'column');
+```
+
+Unapaswa kukipa kipengele cha `.bb1` `align-items` ya `center`.
+
+```js
+const bb1Style = new __helpers.CSSHelp(document).getStyle('.bb1');
+assert.equal(bb1Style?.alignItems, 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+--fcc-editable-region--
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+--fcc-editable-region--
+.bb1a {
+ width: 70%;
+ height: 10%;
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d6.md
new file mode 100644
index 00000000000..afee215c7a4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d6.md
@@ -0,0 +1,103 @@
+---
+id: 5d822fd413a79914d39e98d6
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Sasa una kitu ambacho kinafanana na jengo. Sasa uko tayari kuunda kihifadhi (variable) chako cha kwanza. Kihifadhi huanza na dashi mbili (`-`) na hupewa jina na thamani kama hivi: `--variable-name: value;`. Katika sheria za darasa la `bb1`, tengeneza kihifadhi (variable) kwa jina la `--building-color1` na ukipatie thamani ya `#999`.
+
+# --hints--
+
+Unapaswa kuunda kihifadhi kipya kiitwacho `--building-color1`.
+
+```js
+assert(new __helpers.CSSHelp(document).isPropertyUsed('--building-color1'));
+```
+
+Unapaswa kufafanua kihifadhi `--building-color1` kwenye `.bb1`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1')?.getPropertyValue('--building-color1'));
+```
+
+Unapaswa kuipa `--building-color1` thamani ya `#999`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1')?.getPropertyValue('--building-color1').trim(),'#999');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+--fcc-editable-region--
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+--fcc-editable-region--
+.bb1a {
+ width: 70%;
+ height: 10%;
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d7.md
new file mode 100644
index 00000000000..089d273e175
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d7.md
@@ -0,0 +1,100 @@
+---
+id: 5d822fd413a79914d39e98d7
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Ili kutumia kihifadhi (variable), weka jina la kihifadhi kwenye mabano na weka `var` mbele yake kama hivi: `var(--variable-name)`. Thamani yeyote uliyoipa kihifadhi itatumika kwenye sifa yeyote ambapo utaitumia.
+
+Ongeza kihifadhi cha `--building-color1` ulichounda katika hatua ya awali kama thamani ya sifa `background-color` ya darasa la `.bb1a`.
+
+# --hints--
+
+`background-color` ya kipengele cha `.bb1a` inapaswa kuwekwa.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1a')?.backgroundColor)
+```
+
+Unapaswa kutumia `var(--building-color1)` kuweka `background-color` ya kipengele cha `.bb1a`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1a')?.getPropVal('background-color', true), 'var(--building-color1)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #999;
+}
+--fcc-editable-region--
+.bb1a {
+ width: 70%;
+ height: 10%;
+}
+--fcc-editable-region--
+.bb1b {
+ width: 80%;
+ height: 10%;
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d8.md
new file mode 100644
index 00000000000..b6d62e61158
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d8.md
@@ -0,0 +1,124 @@
+---
+id: 5d822fd413a79914d39e98d8
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Tumia kihifadhi sawa na `background-color` ya madarasa ya `.bb1b`, `.bb1c` na `.bb1d` ili kujaza sehemu iliyobaki ya jengo.
+
+# --hints--
+
+`background-color` ya kipengele cha `.bb1b` inapaswa kuwekwa.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1b')?.backgroundColor)
+```
+
+Unapaswa kutumia `var(--building-color1)` kuweka `background-color` ya kipengele cha `.bb1b`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1b')?.getPropVal('background-color', true), 'var(--building-color1)');
+```
+
+`background-color` ya kipengele cha `.bb1c` inapaswa kuwekwa.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1c')?.backgroundColor)
+```
+
+Unapaswa kutumia `var(--building-color1)` kuweka `background-color` ya kipengele cha `.bb1c`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1c')?.getPropVal('background-color', true), 'var(--building-color1)');
+```
+
+`background-color` ya kipengele cha `.bb1d` inapaswa kuwekwa.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1d')?.backgroundColor)
+```
+
+Unapaswa kutumia `var(--building-color1)` kuweka `background-color` ya kipengele cha `.bb1d`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1d')?.getPropVal('background-color', true), 'var(--building-color1)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #999;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.bb1b {
+ width: 80%;
+ height: 10%;
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d9.md
new file mode 100644
index 00000000000..c42dc6ca699
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d9.md
@@ -0,0 +1,99 @@
+---
+id: 5d822fd413a79914d39e98d9
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Badilisha thamani ya kihifadhi chako kutoka `#999` hadi `#aa80ff` na unaweza kuona jinsi kinavyotumika kila mahali ulipotumia kihifadhi. Hii ndio faida kuu ya kutumia vihifadhi, kuwa na uwezo wa kubadilisha haraka thamani nyingi kwenye laha yako ya mitindo kwa kubadilisha tu thamani ya kihifadhi.
+
+# --hints--
+
+Unapaswa kubadilisha thamani ya sifa yha `--building-color1` kutoka `#999` hadi `#aa80ff`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1')?.getPropertyValue('--building-color1').trim(),'#aa80ff');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+--fcc-editable-region--
+ --building-color1: #999;
+--fcc-editable-region--
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98da.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98da.md
new file mode 100644
index 00000000000..9bd135badc4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98da.md
@@ -0,0 +1,133 @@
+---
+id: 5d822fd413a79914d39e98da
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Jengo lako la kwanza linaonekana zuri sasa. Ongeza vipengele vitatu vipya vya `div` katika chombo cha `.background-buildings` na uvipe classes za `bb2`, `bb3`, na `bb4` kwa mpangilio huo. Haya yatakuwa majengo matatu zaidi kwa mandharinyuma.
+
+# --hints--
+
+Unapaswa kuunda `div` na class ya `bb2`.
+
+```js
+assert.exists(document.querySelector('div.bb2'));
+```
+
+Unapaswa kuunda `div` na class ya `bb3`.
+
+```js
+assert.exists(document.querySelector('div.bb3'));
+```
+
+Unapaswa kuunda `div` na class ya `bb4`.
+
+```js
+assert.exists(document.querySelector('div.bb4'));
+```
+
+Unapaswa kuunda vipengee 3 vipya vya `div`.
+
+```js
+assert.equal(document.querySelectorAll('div')?.length, 9);
+```
+
+Unapaswa kuweka vipengele hivi vya `div` ndani ya kipengele cha `.background-buildings`.
+
+```js
+assert.equal(document.querySelector('div.background-buildings')?.children?.length, 4);
+```
+
+Unapaswa kuweka vipengele kwa utaratibu sahihi.
+
+```js
+function __t(a, b) {
+ return [...document.querySelector(a)?.nextElementSibling?.classList]?.includes(b);
+}
+assert(__t('div.bb1','bb2') && __t('div.bb2','bb3') && __t('div.bb3','bb4'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #aa80ff;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98db.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98db.md
new file mode 100644
index 00000000000..09eec3d1820
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98db.md
@@ -0,0 +1,133 @@
+---
+id: 5d822fd413a79914d39e98db
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Yape majengo mapya sifa za `width` na `height` za: `10%` na `50%` kwa `.bb2`, `10%` na `55%` kwa `.bb3`, na `11%` na `58%` kwa `.bb4`. Utatumia vitengo vilivyotegemea asilimia kwa karibu kila kitu na baadhi ya vitengo vya flexbox kwa mradi huu, hivyo kila kitu kitakuwa kabisa kinajibu.
+
+# --hints--
+
+Unapaswa kuipa `.bb2` `width` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2')?.width, '10%');
+```
+
+Unapaswa kuipa `.bb2` `height` ya `50%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2')?.height, '50%');
+```
+
+Unapaswa kuipa `.bb3` `width` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb3')?.width, '10%');
+```
+
+Unapaswa kuipa `.bb3` `height` ya `55%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb3')?.height, '55%');
+```
+
+Unapaswa kuipa `.bb4` `width` ya `11%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb4')?.width, '11%');
+```
+
+Unapaswa kuipa `.bb4` `height` ya `58%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb4')?.height, '58%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #aa80ff;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98dc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98dc.md
new file mode 100644
index 00000000000..31d32c87a8e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98dc.md
@@ -0,0 +1,127 @@
+---
+id: 5d822fd413a79914d39e98dc
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Majengo hayo kwa sasa yamepangwa juu ya kila moja. Pangilia majengo kwa kugeuza kipengele cha `.background-buildings` kuwa mzazi wa flexbox. Tumia sifa za `align-items` na `justify-content` ili kuweka majengo kwa usawa katika sehemu ya chini ya kipengele.
+
+# --hints--
+
+Unapaswa kuongeza `display` ya `flex` kwenye class ya `background-buildings`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.background-buildings')?.display, 'flex');
+```
+
+Unapaswa kuongeza `align-items` ya `flex-end` kwenye class ya `background-buildings`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.background-buildings')?.alignItems, 'flex-end');
+```
+
+Unapaswa kuongeza `justify-content` ya `space-evenly` kwenye class ya `background-buildings`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.background-buildings')?.justifyContent, 'space-evenly');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+--fcc-editable-region--
+.background-buildings {
+ width: 100%;
+ height: 100%;
+}
+--fcc-editable-region--
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #aa80ff;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98dd.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98dd.md
new file mode 100644
index 00000000000..15f733408d6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98dd.md
@@ -0,0 +1,142 @@
+---
+id: 5d822fd413a79914d39e98dd
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Majengo yana nafasi nyingi sana. Zibananishe pamoja kwa kuongeza vipengele viwili tupu vya `div` juu ya kipengele cha `.background-buildings`, viwili zaidi chini yake, na kimoja zaidi kati ya `.bb3` na `.bb4`. Hizi zitaongezwa kama vipengee vilivyo na nafasi sawa kwenye kontena, ikisogeza majengo karibu na kati.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vipya vya `div` kabla ya kipengele cha `.bb1`.
+
+```js
+const bBuildings = document.querySelector('.background-buildings')?.children;
+assert(![...bBuildings?.[0]?.classList]?.includes('bb1'));
+assert(![...bBuildings?.[1]?.classList]?.includes('bb1'));
+```
+
+Unapaswa kuongeza kipengele kimoja kipya cha `div` kati ya kipengele cha `.bb3` na `.bb4`.
+
+```js
+assert(document.querySelector('.bb3')?.nextElementSibling === document.querySelector('.bb4')?.previousElementSibling);
+```
+
+Unapaswa kuongeza vipengele viwili vipya vya `div` baada ya kipengele cha `.bb4`.
+
+```js
+const bb4 = document.querySelector('.bb4');
+assert.exists(bb4?.nextElementSibling);
+assert.exists(bb4?.nextElementSibling?.nextElementSibling);
+```
+
+Unapaswa kuongeza vipengele 5 vipya vya `div`.
+
+```js
+assert.equal(document.querySelectorAll('div')?.length, 14);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #aa80ff;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98de.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98de.md
new file mode 100644
index 00000000000..fa8f32020db
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98de.md
@@ -0,0 +1,140 @@
+---
+id: 5d822fd413a79914d39e98de
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Unda kihifadhi kipya chini ya kihifadhi chako cha `--building-color1`. Kiite kihifadhi chako kipya `--building-color2` na ukipe thamani ya `#66cc99`. Kisha iweke kama `background-color` ya `.bb2`.
+
+# --hints--
+
+Unapaswa kufafanua sifa mpya ya kihifadhi kinachoitwa `--building-color2`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).isPropertyUsed('--building-color2'));
+```
+
+Unapaswa kuipa `--building-color2` thamani ya `#66cc99` ndani ya darasa la `.bb1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1')?.getPropertyValue('--building-color2').trim(), '#66cc99');
+```
+
+Unapaswa kuweka `background-color` ya `.bb2`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb2')?.backgroundColor);
+```
+
+Unapaswa kuweka `background-color` kwa kutumia kihifadhi cha `--building-color2`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2')?.getPropVal('background-color', true), 'var(--building-color2)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+--fcc-editable-region--
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #aa80ff;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+--fcc-editable-region--
+.bb3 {
+ width: 10%;
+ height: 55%;
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98df.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98df.md
new file mode 100644
index 00000000000..2d974cff84e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98df.md
@@ -0,0 +1,124 @@
+---
+id: 5d822fd413a79914d39e98df
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Hilo halikufaulu. Unapaswa kuongeza thamani mbadala kwa kihifadhi kwa kuiweka kama thamani ya pili ya mahali unapotumia kihifadhi kama hiki: `var(--variable-name, fallback-value)`. Sifa hii itatumia thamani mbadala kunapokuwa na tatizo na kihifadhi. Ongeza thamani mbadala ya `green` kwenye `background-color` ya `.bb2`.
+
+# --hints--
+
+Unapaswa kuongeza thamani mbadala ya `green` kwenye sifa ya `background-color`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2')?.getPropVal('background-color', true), 'var(--building-color2,green)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+--fcc-editable-region--
+.bb3 {
+ width: 10%;
+ height: 55%;
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e0.md
new file mode 100644
index 00000000000..e3ec612c5dc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e0.md
@@ -0,0 +1,142 @@
+---
+id: 5d822fd413a79914d39e98e0
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Unda kihifadhi kipya chini ya zile zingine zinazoitwa `--building-color3` na ukipe thamani ya `#cc6699`. Kisha itumie kama `background-color` ya darasa la `.bb3` na uipe thamani mbadala ya `pink`.
+
+# --hints--
+
+Unapaswa kufafanua kihifadhi kipya cha sifa kinachoitwa `--building-color3`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).isPropertyUsed('--building-color3'));
+```
+
+Unapaswa kuipa `--building-color3` thamani ya `#cc6699`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1')?.getPropertyValue('--building-color3')?.trim(), '#cc6699');
+```
+
+Unapaswa kuweka `background-color` ya `.bb3`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb3')?.backgroundColor);
+```
+
+Unapaswa kuweka `background-color` kwa kutumia kihifadhi cha `--building-color3` na mbadala ya `pink`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb3')?.getPropVal('background-color', true), 'var(--building-color3,pink)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+--fcc-editable-region--
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2, green);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+}
+--fcc-editable-region--
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e1.md
new file mode 100644
index 00000000000..02bd745c0a7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e1.md
@@ -0,0 +1,155 @@
+---
+id: 5d822fd413a79914d39e98e1
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Hiyo haikufanya kazi, kwa sababu vihifadhi ulivyotangaza katika `.bb1` havielekei kwa vipengele ndugu vya `.bb2` na `.bb3`. Hivyo ndivyo CSS inavyofanya kazi. Kwa sababu hii, vihifadhi mara nyingi hutangazwa katika kichaguzi cha `:root`. Hiki ndicho kichaguzi cha kiwango cha juu zaidi katika CSS; kuweka vihifadhi vyako hapo kutazifanya zitumike kila mahali. Ongeza kichaguzi cha `:root` juu ya laha yako ya mitindo, na usogeze vihifadhi vyako vyote hapo.
+
+# --hints--
+
+Unapaswa kutangaza kichaguzi cha `:root` juu ya laha ya mtindo.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle(':root'));
+```
+
+Unapaswa kufafanua `--building-color1` kwa thamani ya `#aa80ff` katika kichaguzi cha `:root`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root')?.getPropertyValue('--building-color1')?.trim(), '#aa80ff');
+```
+
+Unapaswa kufafanua `--building-color2` kwa thamani ya `#66cc99` katika kichaguzi cha `:root`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root')?.getPropertyValue('--building-color2')?.trim(), '#66cc99');
+```
+
+Unapaswa kufafanua `--building-color3` kwa thamani ya `#cc6699` katika kichaguzi cha `:root`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root')?.getPropertyValue('--building-color3')?.trim(), '#cc6699');
+```
+
+Unapaswa kuondoa vihifadhi vya sifa maalum kutoka `.bb1`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1')?.getPropertyValue('--building-color1'));
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1')?.getPropertyValue('--building-color2'));
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1')?.getPropertyValue('--building-color3'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+}
+--fcc-editable-region--
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2, green);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3, pink);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e2.md
new file mode 100644
index 00000000000..ad10569e13c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e2.md
@@ -0,0 +1,135 @@
+---
+id: 5d822fd413a79914d39e98e2
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Kwa kuwa sasa umesuluhisha hitilafu na majengo ni rangi zinazofaa, unaweza kuondoa thamani mbadala katika sehemu mbili zilipotumika. Endelea na ufanye hivyo sasa.
+
+# --hints--
+
+Unapaswa kuondoa njia mbadala katika `background-color` kutoka `.bb2`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2')?.getPropVal('background-color', true), 'var(--building-color2)');
+```
+
+Unapaswa kuondoa njia mbadala katika `background-color` kutoka `.bb3`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb3')?.getPropVal('background-color', true), 'var(--building-color3)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2, green);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3, pink);
+}
+--fcc-editable-region--
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e3.md
new file mode 100644
index 00000000000..cda0c60a510
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e3.md
@@ -0,0 +1,144 @@
+---
+id: 5d822fd413a79914d39e98e3
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Unda kihifadhi kingine kiitwacho `--building-color4` na ukipe thamani ya `#538cc6`. Hakikisha kuwa iko kwenye kichaguzi cha `:root` wakati huu. Kisha uitumie kujaza jengo la mwisho.
+
+# --hints--
+
+Unapaswa kufafanua sifa ya kihifadhi kipya kinachoitwa `--building-color4`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).isPropertyUsed('--building-color4'));
+```
+
+Unapaswa kuipa `--building-color4` thamani ya `#538cc6` katika kichaguzi cha `:root`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root')?.getPropertyValue('--building-color4').trim(), '#538cc6');
+```
+
+Unapaswa kuongeza `background-color: var(--building-color4)` katika kichaguzi cha `.bb4`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb4')?.getPropVal('background-color', true), 'var(--building-color4)')
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e4.md
new file mode 100644
index 00000000000..0c2e2fd8fec
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e4.md
@@ -0,0 +1,147 @@
+---
+id: 5d822fd413a79914d39e98e4
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Majengo ya mandharinyuma yanaanza kuonekana mazuri. Unda `div` mpya chini ya kipengele cha `.background-buildings` na ukipe darasa la `foreground-buildings`. Hiki kitakuwa chombo kingine kwa majengo zaidi.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+assert.equal(document.querySelectorAll('div')?.length, 15);
+```
+
+`div` mpya inapaswa kuja baada ya kipengele cha `div.background-buildings`.
+
+```js
+assert.exists(document.querySelector('div.background-buildings + div'));
+```
+
+Kipengele chako cha kipy cha `div` kinapaswa kuwa na class ya `foreground-buildings`.
+
+```js
+assert.exists(document.querySelector('div.foreground-buildings'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e5.md
new file mode 100644
index 00000000000..6277c5b5402
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e5.md
@@ -0,0 +1,161 @@
+---
+id: 5d822fd413a79914d39e98e5
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Unataka chombo cha `.foreground-buildings` kikae moja kwa moja juu ya kipengele cha `.background-buildings`. Ipe `width` na `height` ya `100%`, weka `position` kuwa `absolute`, na `top` hadi `0`. Hii itafanya ukubwa sawa na mwili na kusogeza mwanzo wake kwenye kona ya juu kushoto.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.foreground-buildings`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.foreground-buildings'));
+```
+
+Unapaswa kukipa kipengele cha `.foreground-buildings` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.width, '100%');
+```
+
+Unapaswa kukipa kipengele cha `.foreground-buildings` `height` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.height, '100%');
+```
+
+Unapaswa kukipa kipengele cha `.foreground-buildings` `position` ya `absolute`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.position, 'absolute');
+```
+
+Unapaswa kukipa kipengele cha `.foreground-buildings` `top` ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.top, '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e6.md
new file mode 100644
index 00000000000..0acebba2bc9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e6.md
@@ -0,0 +1,192 @@
+---
+id: 5d822fd413a79914d39e98e6
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Ongeza vipengele sita vya `div` ndani ya `.foreground-buildings` na uvipe classes za `fb1` hadi `fb6` kwa mpangilio huo. "fb" inasimama kwa "foreground building". Haya yatakuwa majengo sita zaidi kwa ajili ya foreground.
+
+# --hints--
+
+Unapaswa kuunda `div` mpya na darasa la `fb1`.
+
+```js
+assert.exists(document.querySelector('div.fb1'));
+```
+
+Unapaswa kuunda `div` mpya na darasa la `fb2`.
+
+```js
+assert.exists(document.querySelector('div.fb2'));
+```
+
+Unapaswa kuunda `div` mpya na darasa la `fb3`.
+
+```js
+assert.exists(document.querySelector('div.fb3'));
+```
+
+Unapaswa kuunda `div` mpya na darasa la `fb4`.
+
+```js
+assert.exists(document.querySelector('div.fb4'));
+```
+
+Unapaswa kuunda `div` mpya na darasa la `fb5`.
+
+```js
+assert.exists(document.querySelector('div.fb5'));
+```
+
+Unapaswa kuunda `div` mpya na darasa la `fb6`.
+
+```js
+assert.exists(document.querySelector('div.fb6'));
+```
+
+Unapaswa kuweka vipengele hivi vya `div` ndani ya kipengele cha `.foreground-buildings`.
+
+```js
+assert.exists(document.querySelector('div.foreground-buildings > div.fb1'));
+assert.exists(document.querySelector('div.foreground-buildings > div.fb2'));
+assert.exists(document.querySelector('div.foreground-buildings > div.fb3'));
+assert.exists(document.querySelector('div.foreground-buildings > div.fb4'));
+assert.exists(document.querySelector('div.foreground-buildings > div.fb5'));
+assert.exists(document.querySelector('div.foreground-buildings > div.fb6'));
+```
+
+Unapaswa kuweka vipengele vipya vya `div` kwa utaratibu sahihi.
+
+```js
+function __t(a, b) {
+ return [...document.querySelector(a)?.nextElementSibling?.classList]?.includes(b);
+}
+assert(__t('div.fb1','fb2') && __t('div.fb2','fb3') && __t('div.fb3','fb4') && __t('div.fb4', 'fb5') && __t('div.fb5', 'fb6'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+.foreground-buildings {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e7.md
new file mode 100644
index 00000000000..78b69036549
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e7.md
@@ -0,0 +1,253 @@
+---
+id: 5d822fd413a79914d39e98e7
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Zipe vipengele sita vipya thamani hizi za `width` na `height`: `10%` na `60%` kwa `.fb1`, `10%` na `40%` kwa `.fb2`, `10%` na `35%` kwa `.fb3`, `8%` na `45%` kwa `.fb4`, `10%` na `33%` kwa `.fb5`, na `9%` na `38%` kwa `.fb6`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.fb1`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.fb1'));
+```
+
+Unapaswa kukipa kichaguzi cha `.fb1` `width` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb1')?.width, '10%');
+```
+
+Unapaswa kukipa kichaguzi cha `.fb1` `height` ya `60%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb1')?.height, '60%');
+```
+
+Unapaswa kuunda kichaguzi cha `.fb2`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.fb2'));
+```
+
+Unapaswa kukipa kichaguzi cha `.fb2` `width` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb2')?.width, '10%');
+```
+
+Unapaswa kukipa kichaguzi cha `.fb2` `height` ya `40%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb2')?.height, '40%');
+```
+
+Unapaswa kuunda kichaguzi cha `.fb3`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.fb3'));
+```
+
+Unapaswa kukipa kichaguzi cha `.fb3` `width` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb3')?.width, '10%');
+```
+
+Unapaswa kukipa kichaguzi cha `.fb3` `height` ya `35%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb3')?.height, '35%');
+```
+
+Unapaswa kuunda kichaguzi cha `.fb4`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.fb4'));
+```
+
+Unapaswa kukipa kichaguzi cha `.fb4` `width` ya `8%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb4')?.width, '8%');
+```
+
+Unapaswa kukipa kichaguzi cha `.fb4` `height` ya `45%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb4')?.height, '45%');
+```
+
+Unapaswa kuunda kichaguzi cha `.fb5`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.fb5'));
+```
+
+Unapaswa kukipa kichaguzi cha `.fb5` `width` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb5')?.width, '10%');
+```
+
+Unapaswa kukipa kichaguzi cha `.fb5` `height` ya `33%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb5')?.height, '33%');
+```
+
+Unapaswa kuunda kichaguzi cha `.fb6`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.fb6'));
+```
+
+Unapaswa kukipa kichaguzi cha `.fb6` `width` ya `9%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb6')?.width, '9%');
+```
+
+Unapaswa kukipa kichaguzi cha `.fb6` `height` ya `38%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb6')?.height, '38%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+.foreground-buildings {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e8.md
new file mode 100644
index 00000000000..de06eab271b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e8.md
@@ -0,0 +1,190 @@
+---
+id: 5d822fd413a79914d39e98e8
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Ongeza sifa na thamani za `display`, `align-items` na `justify-content` kwenye `.foreground-buildings` ambazo ulitumia kwenye `.background-buildings`. Tena, hii itatumia Flexbox kuweka sawa majengo chini ya kontena lao.
+
+# --hints--
+
+Unapaswa kuipa `.foreground-buildings` sifa ya `display` ya `flex`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.display, 'flex');
+```
+
+Unapaswa kuipa `.foreground-buildings` sifa ya `align-items` ya `flex-end`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.alignItems, 'flex-end');
+```
+
+Unapaswa kuipa `.foreground-buildings` sifa ya `justify-content` ya `space-evenly`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.justifyContent, 'space-evenly');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+.foreground-buildings {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+}
+--fcc-editable-region--
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e9.md
new file mode 100644
index 00000000000..a4a8acca827
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98e9.md
@@ -0,0 +1,223 @@
+---
+id: 5d822fd413a79914d39e98e9
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Unapaswa kuboresha msimbo wako. Hamisha sifa za `position` na `top` na thamani kutoka `.foreground-buildings` hadi `.background-buildings`. Kisha chagua `.background-buildings` na `.foreground-buildings` hapo, ukitumia mitindo hiyo kwa vipengele vyote viwili. Unaweza kutumia koma (`,`) kutenganisha vichaguzi kama hivi: `selector1, selector2`.
+
+# --hints--
+
+Hupaswi kuondoa tamko la `.foreground-buildings`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.foreground-buildings'));
+```
+
+Unapaswa kuondoa sifa ya `position` kutoka `.foreground-buildings`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.position);
+```
+
+Unapaswa kuondoa sifa ya `top` kutoka `.foreground-buildings`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.foreground-buildings')?.top);
+```
+
+Unapaswa kuongeza sifa ya `position` ya `absolute` kwenye `.background-buildings, .foreground-buildings`.
+
+```js
+function eitherOr() {
+ const a = new __helpers.CSSHelp(document)
+ return a.getStyle('.background-buildings, .foreground-buildings') ?? a.getStyle('.foreground-buildings, .background-buildings');
+}
+assert.equal(eitherOr()?.position, 'absolute');
+```
+
+Unapaswa kuongeza sifa ya `top` ya `0` kwenye `.background-buildings, .foreground-buildings`.
+
+```js
+function eitherOr() {
+ const a = new __helpers.CSSHelp(document)
+ return a.getStyle('.background-buildings, .foreground-buildings') ?? a.getStyle('.foreground-buildings, .background-buildings');
+}
+assert.equal(eitherOr()?.top, '0px');
+```
+
+Unapaswa kutumia koma ili uweze kutumia vichaguzi vya `.foreground-buildings` na `.background-buildings` katika tamko la mtindo sawa.
+
+```js
+function eitherOr() {
+ const a = new __helpers.CSSHelp(document)
+ return a.getStyle('.background-buildings, .foreground-buildings') ?? a.getStyle('.foreground-buildings, .background-buildings');
+}
+assert.exists(eitherOr());
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+--fcc-editable-region--
+.background-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+.foreground-buildings {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+--fcc-editable-region--
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ea.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ea.md
new file mode 100644
index 00000000000..9deaa3cafd3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ea.md
@@ -0,0 +1,181 @@
+---
+id: 5d822fd413a79914d39e98ea
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Kwa kuwa ulifanya hivyo, unaweza kufuta tamko la zamani la `.foreground-buildings` na sifa zake zote kwa kuwa hazihitajiki tena.
+
+# --hints--
+
+Unapaswa kufuta tamko zima la mtindo wa `.foreground-buildings`.
+
+```js
+assert.notExists(new __helpers.CSSHelp(document).getStyle('.foreground-buildings'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+.foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+}
+--fcc-editable-region--
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98eb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98eb.md
new file mode 100644
index 00000000000..92b49ed581b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98eb.md
@@ -0,0 +1,203 @@
+---
+id: 5d822fd413a79914d39e98eb
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Mandhari ya mji yanakaribia kuwa tayari. Jaza sifa ya `background-color` ya majengo ya mandhari ya mbele. Tumia kihifadhi chako cha `--building-color1` kujaza `.fb3` na `.fb4`, `--building-color2` kwa `.fb5`, `--building-color3` kwa `.fb2` na `.fb6`, na `--building-color4` kwa `.fb1`.
+
+# --hints--
+
+Unapaswa kuipa `.fb1` `background-color` kwa kutumia `--building-color4`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb1')?.getPropVal('background-color', true), 'var(--building-color4)');
+```
+
+Unapaswa kuipa `.fb2` `background-color` kwa kutumia `--building-color3`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb2')?.getPropVal('background-color', true), 'var(--building-color3)');
+```
+
+Unapaswa kuipa `.fb3` `background-color` kwa kutumia `--building-color1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb3')?.getPropVal('background-color', true), 'var(--building-color1)');
+```
+
+Unapaswa kuipa `.fb4` `background-color` kwa kutumia `--building-color1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb4')?.getPropVal('background-color', true), 'var(--building-color1)');
+```
+
+Unapaswa kuipa `.fb5` `background-color` kwa kutumia `--building-color2`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb5')?.getPropVal('background-color', true), 'var(--building-color2)');
+```
+
+Unapaswa kuipa `.fb6` `background-color` kwa kutumia `--building-color3`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb6')?.getPropVal('background-color', true), 'var(--building-color3)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ec.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ec.md
new file mode 100644
index 00000000000..b2837339c27
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ec.md
@@ -0,0 +1,203 @@
+---
+id: 5d822fd413a79914d39e98ec
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Sogeza majengo pamoja tena kwa kuongeza vipengele viwili tupu vya `div` ndani ya juu na chini ya kipengele cha `.foreground-buildings`, na kimoja zaidi kati ya `.fb2` na `.fb3`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` kama watoto wa kwanza wa `.foreground-buildings`.
+
+```js
+const bBuildings = document.querySelector('.background-buildings')?.children;
+assert(![...bBuildings?.[0]?.classList]?.includes('fb1'));
+assert(![...bBuildings?.[1]?.classList]?.includes('fb1'));
+```
+
+Unapaswa kuongeza kipengele kimoja cha `div` kati ya kipengele cha `.fb2` na `.fb3`.
+
+```js
+assert(document.querySelector('.fb2')?.nextElementSibling === document.querySelector('.fb3')?.previousElementSibling);
+```
+
+
+Unapaswa kuongeza vipengele viwili vya `div` kama watoto wa mwisho wa `.foreground-buildings`.
+
+```js
+const fb6 = document.querySelector('.fb6');
+assert.exists(fb6?.nextElementSibling);
+assert.exists(fb6?.nextElementSibling?.nextElementSibling);
+```
+
+Unapaswa kuwa umeongeza vipengele 5 vipya vya `div`.
+
+```js
+assert.equal(document.querySelectorAll('div')?.length, 26);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ed.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ed.md
new file mode 100644
index 00000000000..7dba2407a7e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ed.md
@@ -0,0 +1,202 @@
+---
+id: 5d822fd413a79914d39e98ed
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Sogeza nafasi ya `.fb4` ikilinganishwa na ilipo sasa kwa kuongeza `position` ya `relative` na `left` ya `10%` kwake. Fanya vivyo hivyo kwa `.fb5` lakini tumia `right` badala ya `left`. Hii itafunika nafasi nyeupe iliyobaki kati ya majengo.
+
+# --hints--
+
+Unapaswa kuipa `.fb4` `position` ya `relative`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb4')?.position, 'relative');
+```
+
+Unapaswa kuipa `.fb4` `left` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb4')?.left, '10%');
+```
+
+Unapaswa kuipa `.fb5` `position` ya `relative`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb5')?.position, 'relative');
+```
+
+Unapaswa kuipa `.fb5` `right` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.fb5')?.right, '10%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+}
+--fcc-editable-region--
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ee.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ee.md
new file mode 100644
index 00000000000..c979ce23ce4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ee.md
@@ -0,0 +1,196 @@
+---
+id: 5d822fd413a79914d39e98ee
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Msimbo wako unaanza kuwa mrefu sana. Ongeza maoni juu ya darasa la `.fb1` linalosema `FOREGROUND BUILDINGS - "fb" stands for "foreground building"` ili kuwasaidia watu kuelewa msimbo wako. Juu ya darasa la `.bb1` ongeza maoni mengine yanayosema `BACKGROUND BUILDINGS - "bb" stands for "background building"`. Ikiwa hukumbuki, maoni katika CSS yanaonekana kama hii: `/* Comment here */`.
+
+# --hints--
+
+Unapaswa kuongeza maoni `BACKGROUND BUILDINGS - "bb" stands for "background building"` juu ya kichaguzi cha `.bb1`.
+
+```js
+assert(/\/\*\s*BACKGROUND BUILDINGS - "bb" stands for "background building"\s*\*\//gi.test(code));
+```
+
+Unapaswa kuongeza maoni `FOREGROUND BUILDINGS - "fb" stands for "foreground building"` juu ya kichaguzi cha `.fb1`.
+
+```js
+assert(/\/\*\s*FOREGROUND BUILDINGS - "fb" stands for "foreground building"\s*\*\//gi.test(code));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+--fcc-editable-region--
+
+
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ef.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ef.md
new file mode 100644
index 00000000000..c65ae318dca
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ef.md
@@ -0,0 +1,197 @@
+---
+id: 5d822fd413a79914d39e98ef
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Unda kihifadhi kipya katika `:root` kiitwacho `--window-color1` na ukipe thamani ya `black`. Hii itakuwa rangi ya sekondari kwa majengo ya zambarau.
+
+# --hints--
+
+Unapaswa kuunda kihifadhi kipya katika `:root` kiitwacho `--window-color1`.
+
+```js
+assert(new __helpers.CSSHelp(document).isPropertyUsed('--window-color1'));
+```
+
+Unapaswa kukipa kihifadhi sifa ya `--window-color1` yenye thamani ya `black`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root')?.getPropertyValue('--window-color1').trim(), 'black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+}
+--fcc-editable-region--
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f0.md
new file mode 100644
index 00000000000..763b0019228
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f0.md
@@ -0,0 +1,218 @@
+---
+id: 5d822fd413a79914d39e98f0
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Gradients katika CSS ni njia ya kubadilisha kati ya rangi katika umbali wa kipengele. Zinatumika kwa sifa ya `background` na sintaksia inaonekana kama hii:
+
+```css
+gradient-type(
+ color1,
+ color2
+);
+```
+
+Katika mfano, `color1` ni thabiti juu, `color2` ni thabiti chini, na kati yake inabadilika kwa usawa kutoka kwa moja hadi nyingine. Katika `.bb1a`, ongeza sifa ya `background` chini ya sifa ya `background-color`. Iweke kama gradient ya aina `linear-gradient` inayotumia `--building-color1` kama rangi ya kwanza na `--window-color1` kama pili.
+
+# --hints--
+
+Unapaswa kuweka `background` kwa `.bb1a` baada ya `background-color`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.bb1a')?.background);
+```
+
+Unapaswa kuweka `background` iwe `linear-gradient`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.bb1a')?.background, 'linear-gradient');
+```
+
+Unapaswa kuweka `background` iwe `linear-gradient` inayoanzia `var(--building-color1)`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.bb1a')?.getPropVal('background', true), 'linear-gradient(var(--building-color1');
+```
+
+Unapaswa kuweka `background` iwe `linear-gradient` inayomalizia `var(--window-color1)`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.bb1a')?.getPropVal('background', true), 'linear-gradient(var(--building-color1),var(--window-color1))');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+--fcc-editable-region--
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f1.md
new file mode 100644
index 00000000000..2a43be50564
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f1.md
@@ -0,0 +1,223 @@
+---
+id: 5d822fd413a79914d39e98f1
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Utatakiwa kuongeza gradient sawa kwa sehemu mbili zifuatazo. Badala ya kufanya hivyo, unda kichaguzi kipya cha class kinachoitwa `bb1-window`, na usogeze sifa za `height` na `background` na thamani kutoka `.bb1a` kwa kichaguzi kipya cha class.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi kipya cha class kinachoitwa `bb1-window`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.bb1-window'));
+```
+
+Unapaswa kuhamisha sifa ya `height` na thamani kutoka `.bb1a` hadi `.bb1-window`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1a')?.height);
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1-window')?.height, '10%');
+```
+
+Unapaswa kuhamisha sifa ya `background` na thamani kutoka `.bb1a` hadi `.bb1-window`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1a')?.background);
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1-window')?.getPropVal('background', true), 'linear-gradient(var(--building-color1),var(--window-color1))');
+```
+
+Hupaswi kuhamisha sifa ya `background-color` kutoka `.bb1a`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.bb1a')?.backgroundColor);
+```
+
+Hupaswi kuhamisha sifa ya `width` kutoka `.bb1a`.
+
+```js
+assert.notEmpty(new __helpers.CSSHelp(document).getStyle('.bb1a')?.width);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+--fcc-editable-region--
+.bb1a {
+ width: 70%;
+ height: 10%;
+ background-color: var(--building-color1);
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+
+--fcc-editable-region--
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f2.md
new file mode 100644
index 00000000000..b42a7821fce
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f2.md
@@ -0,0 +1,237 @@
+---
+id: 5d822fd413a79914d39e98f2
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Ongeza darasa jipya la `bb1-window` kwa vipengele vya `.bb1a`, `.bb1b` na `.bb1c`. Hii itaweka gradient kwao.
+
+# --hints--
+
+Hupaswi kuondoa darasa la `bb1a`.
+
+```js
+assert.exists(document.querySelector('div.bb1a'));
+```
+
+Unapaswa kuongeza class ya `bb1-window` kwenye kipengele cha `.bb1a`.
+
+```js
+assert.exists(document.querySelector('div.bb1a.bb1-window'));
+```
+
+Hupaswi kuondoa darasa la `bb1b`.
+
+```js
+assert.exists(document.querySelector('div.bb1b'));
+```
+
+Unapaswa kuongeza class ya `bb1-window` kwenye kipengele cha `.bb1b`.
+
+```js
+assert.exists(document.querySelector('div.bb1b.bb1-window'));
+```
+
+Hupaswi kuondoa darasa la `bb1c`.
+
+```js
+assert.exists(document.querySelector('div.bb1c'));
+```
+
+Unapaswa kuongeza class ya `bb1-window` kwenye kipengele cha `.bb1c`.
+
+```js
+assert.exists(document.querySelector('div.bb1c.bb1-window'));
+```
+
+Hupaswi kubadilisha kipengele cha `.bb1d`.
+
+```js
+assert.exists(document.querySelector('div.bb1d'));
+assert.notExists(document.querySelector('div.bb1d.bb1-window'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f3.md
new file mode 100644
index 00000000000..26c0af51bef
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f3.md
@@ -0,0 +1,222 @@
+---
+id: 5d822fd413a79914d39e98f3
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Huhitaji `height` au `background-color` katika sifa za `.bb1a`, `.bb1b` au `.bb1c` tena, kwa hivyo ziondoe.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka `.bb1a`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1a')?.backgroundColor);
+```
+
+Unapaswa kuondoasifa ya `height` kutoka `.bb1b`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1b')?.height);
+```
+
+Unapaswa kuondoa sifa ya `background-color` kutoka kwa `.bb1b`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1b')?.backgroundColor);
+```
+
+Unapaswa kuondoa sifa ya `height` kutoka kwa `.bb1c`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1c')?.height);
+```
+
+Unapaswa kuondoa sifa ya `background-color` kutoka kwa `.bb1c`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('.bb1c')?.backgroundColor);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+--fcc-editable-region--
+.bb1a {
+ width: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb1b {
+ width: 80%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+
+.bb1c {
+ width: 90%;
+ height: 10%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f4.md
new file mode 100644
index 00000000000..c919fd57e74
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f4.md
@@ -0,0 +1,227 @@
+---
+id: 5d822fd413a79914d39e98f4
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Gradients inaweza kutumia rangi nyingi unavyotaka kama hii:
+
+```css
+gradient-type(
+ color1,
+ color2,
+ color3
+);
+```
+
+Ongeza `linear-gradient` kwa `.bb1d` na `orange` kama rangi ya kwanza, `--building-color1` kama rangi pili, na `--window-color1` kama ya tatu. Kumbuka kutumia gradient kwenye sifa ya `background`.
+
+# --hints--
+
+Unapaswa kutumia `background` kwenye `.bb1d`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('.bb1d')?.background);
+```
+
+Unapaswa kuipa `background` sifa ya `linear-gradient`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.bb1d')?.background, 'linear-gradient');
+```
+
+Unapaswa kutumia `orange` kama rangi ya kwanza katika `linear-gradient`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.bb1d')?.getPropVal('background', true), 'linear-gradient(orange');
+```
+
+Unapaswa kutumia `--building-color1` kama rangi ya pili katika `linear-gradient`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle('.bb1d')?.getPropVal('background', true), 'linear-gradient(orange,var(--building-color1)');
+```
+
+Unapaswa kutumia `--window-color1` kama rangi ya tatu katika `linear-gradient`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1d')?.getPropVal('background', true), 'linear-gradient(orange,var(--building-color1),var(--window-color1))');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+--fcc-editable-region--
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f5.md
new file mode 100644
index 00000000000..b6cc448ff1f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f5.md
@@ -0,0 +1,198 @@
+---
+id: 5d822fd413a79914d39e98f5
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Imefichwa kidogo nyuma ya majengo ya mbele, lakini unaweza kuona gradient ya rangi tatu hapo. Kwa kuwa unatumia hiyo sasa, ondoa sifa ya `background-color` kutoka kwa `.bb1d`.
+
+# --hints--
+
+Unapaswa kuondoa sifa ya `background-color` na thamani kutoka kwa `.bb1d`
+
+```js
+assert.notMatch(code, /\.bb1d\s*\{\s*[^}]*?background-color[^}]*?\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+--fcc-editable-region--
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background-color: var(--building-color1);
+ background: linear-gradient(
+ orange,
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+--fcc-editable-region--
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f6.md
new file mode 100644
index 00000000000..99f0d25d4fe
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f6.md
@@ -0,0 +1,207 @@
+---
+id: 5d822fd413a79914d39e98f6
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Unaweza kubainisha ni wapi unataka mpito wa gradient ukamilike kwa kuiongeza kwa rangi kama hii:
+
+```css
+gradient-type(
+ color1,
+ color2 20%,
+ color3
+);
+```
+
+Hapa, itabadilika kutoka `color1` hadi `color2` kati ya `0%` na `20%` ya kipengele na kisha kubadilisha hadi `color3` kwa zingine. Ongeza `80%` kwenye rangi ya `--building-color1` ya `.bb1d` gradient ili uweze kuiona ikitenda.
+
+# --hints--
+
+Unapaswa kuongeza thamani ya `80%` kwa rangi ya `--building-color1` katika `linear-gradient` ya `.bb1d`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1d')?.getPropVal('background', true), 'linear-gradient(orange,var(--building-color1)80%,var(--window-color1))');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+--fcc-editable-region--
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ orange,
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+--fcc-editable-region--
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f7.md
new file mode 100644
index 00000000000..0b858d0d1c2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f7.md
@@ -0,0 +1,203 @@
+---
+id: 5d822fd413a79914d39e98f7
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Ondoa `orange` kutoka kwa gradient ya `.bb1d` na ubadilishe `80%` hadi `50%`. Hii itafanya `--building-color1` kuwa thabiti kwa nusu ya juu, na kisha kubadilisha hadi `--window-color1` kwa nusu ya chini.
+
+# --hints--
+
+Unapaswa kuondoa `orange` kutoka kwa `linear-gradient`.
+
+```js
+assert.notInclude(new __helpers.CSSHelp(document).getStyle('.bb1d')?.background, 'orange');
+```
+
+Unapaswa kubadilisha rangi ya sasa ya `linear-gradient` kubadilika kwa `50%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb1d')?.getPropVal('background', true), 'linear-gradient(var(--building-color1)50%,var(--window-color1))');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+--fcc-editable-region--
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ orange,
+ var(--building-color1) 80%,
+ var(--window-color1)
+ );
+}
+--fcc-editable-region--
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f8.md
new file mode 100644
index 00000000000..0fd2742d61c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f8.md
@@ -0,0 +1,210 @@
+---
+id: 5d822fd413a79914d39e98f8
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Ongeza vipengele viwili vya `div` ndani ya `.bb2` na uvipe classes za `bb2a` na `bb2b` kwa mpangilio huo. Hizi zitakuwa sehemu mbili za jengo hili.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` kwa `.bb2`.
+
+```js
+assert.equal(document.querySelector('div.bb2')?.children?.length, 2);
+```
+
+Unapaswa kuipa `div` ya kwanza class ya `bb2a`.
+
+```js
+assert.exists(document.querySelector('div.bb2a'));
+```
+
+Unapaswa kuipa `div` ya pili class ya `bb2b`.
+
+```js
+assert.exists(document.querySelector('div.bb2b'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f9.md
new file mode 100644
index 00000000000..0b560c7650f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98f9.md
@@ -0,0 +1,207 @@
+---
+id: 5d822fd413a79914d39e98f9
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Ipe `.bb2b` `width` na `height` ya `100%` ili kuifanya ijaze chombo cha ujenzi. Utaongeza kitu juu kidogo baadaye.
+
+# --hints--
+
+Unapaswa kuipa `.bb2b` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2b')?.width, '100%');
+```
+
+Unapaswa kuipa `.bb2b` `height` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2b')?.height, '100%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fa.md
new file mode 100644
index 00000000000..076d5ad444e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fa.md
@@ -0,0 +1,211 @@
+---
+id: 5d822fd413a79914d39e98fa
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Unda kihifadhi kipya katika `:root` kiitwacho `window-color2` na ukipe thamani ya `#8cd9b3`. Hii itatumika kama rangi ya pili kwa jengo hili.
+
+# --hints--
+
+Unapaswa kuunda kihifadhi kipya cha sifa kiitwacho `window-color2` ndani ya `:root`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle(':root')?.getPropertyValue('--window-color2'));
+```
+
+Unapaswa kuipa `window-color2` thamani ya `#8cd9b3`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(':root')?.getPropertyValue('--window-color2').trim(), '#8cd9b3');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+}
+--fcc-editable-region--
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fb.md
new file mode 100644
index 00000000000..d0b3d06b43e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fb.md
@@ -0,0 +1,240 @@
+---
+id: 5d822fd413a79914d39e98fb
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Mabadiliko ya gradient mara nyingi hubadilika polepole kutoka kwa rangi moja hadi nyingine. Unaweza kufanya mabadiliko kuwa laini kama hii:
+
+```css
+linear-gradient(
+ var(--first-color) 0%,
+ var(--first-color) 40%,
+ var(--second-color) 40%,
+ var(--second-color) 80%
+);
+```
+
+Ongeza `linear-gradient` kwa `.bb2b` inayotumia `--building-color2` kutoka `0%` hadi `6%` na `--window-color2` kutoka `6%` hadi `9%`.
+
+# --hints--
+
+Unapaswa kuipa `.bb2b` sifa ya `background`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle(`.bb2b`)?.background);
+```
+
+Unapaswa kutumia `linear-gradient` kwenye `background`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(`.bb2b`)?.background, "linear-gradient");
+```
+
+Unapaswa kutumia `--building-color2` kutoka `0%` hadi `6%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(`.bb2b`)?.getPropVal('background', true), /var\(--building-color2\)(0%)?,var\(--building-color2\)6%/);
+```
+
+Unapaswa kutumia `--window-color2` kutoka `6%` hadi `9%`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(`.bb2b`)?.getPropVal('background', true), "var(--window-color2)6%,var(--window-color2)9%");
+```
+
+`.bb2b` inapaswa kuwa na `linear-gradient` inayobadilika kutoka `--building-color2` kwa `0%` hadi `6%`, na `--window-color2` kwa `6%` hadi `9%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(`.bb2b`)?.getPropVal('background', true), /linear-gradient\(var\(--building-color2\)(0%)?,var\(--building-color2\)6%,var\(--window-color2\)6%,var\(--window-color2\)9%\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+--fcc-editable-region--
+.bb2b {
+ width: 100%;
+ height: 100%;
+}
+--fcc-editable-region--
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fc.md
new file mode 100644
index 00000000000..d9549642580
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fc.md
@@ -0,0 +1,211 @@
+---
+id: 5d822fd413a79914d39e98fc
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Unaweza kuona mabadiliko ya rangi ngumu juu ya sehemu. Badilisha aina ya gradient kutoka `linear-gradient` hadi `repeating-linear-gradient` kwa sehemu hii. Hii itafanya rangi nne za gradient yako kurudia hadi ifike chini ya kipengele; kukupa mistari kadhaa, na kukuokoa kutokana na kulazimika kuongeza rundo la vipengele ili kuviunda.
+
+# --hints--
+
+Unapaswa kubadilisha sifa ya `background` ya `.bb2b` kutoka kwa kutumia `linear-gradient` hadi kutumia `repeating-linear-gradient`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(`.bb2b`)?.getPropVal('background', true), "repeating-linear-gradient(var(--building-color2),var(--building-color2)6%,var(--window-color2)6%,var(--window-color2)9%)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+--fcc-editable-region--
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+--fcc-editable-region--
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fd.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fd.md
new file mode 100644
index 00000000000..c74a4aba6ee
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fd.md
@@ -0,0 +1,209 @@
+---
+id: 5d822fd413a79914d39e98fd
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Katika hatua chache zinazofuata, utatumia mbinu fulani na mipaka ya CSS kugeuza sehemu ya `.bb2a` kuwa pembetatu iliyo juu ya jengo. Kwanza, ondoa `background-color` kutoka `.bb2` kwa kuwa huihitaji tena.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka `.bb2`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb2")?.backgroundColor);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+var(--building-color1) 50%,
+var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+var(--building-color1),
+var(--window-color1)
+ );
+}
+--fcc-editable-region--
+.bb2 {
+ width: 10%;
+ height: 50%;
+ background-color: var(--building-color2);
+}
+--fcc-editable-region--
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+var(--building-color2),
+var(--building-color2) 6%,
+var(--window-color2) 6%,
+var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fe.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fe.md
new file mode 100644
index 00000000000..360e4bf3457
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98fe.md
@@ -0,0 +1,260 @@
+---
+id: 5d822fd413a79914d39e98fe
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Ongeza sifa hizi kwa `.bb2a`:
+
+```css
+margin: auto;
+width: 5vw;
+height: 5vw;
+border-top: 1vw solid #000;
+border-bottom: 1vw solid #000;
+border-left: 1vw solid #999;
+border-right: 1vw solid #999;
+```
+
+Baada ya kuongeza hizi, unaweza kuona jinsi mpaka mnene kwenye kipengele hukupa pembe ambazo pande mbili zinakutana. Utatumia mpaka huo wa chini kama sehemu ya juu ya jengo.
+
+# --hints--
+
+Unapaswa kuipa `.bb2a` `margin` ya `auto`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2a')?.margin, "auto");
+```
+
+Unapaswa kuipa `.bb2a` `width` ya `auto`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2a')?.width, "5vw");
+```
+
+Unapaswa kuipa `.bb2a` `height` ya `5vw`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2a')?.height, "5vw");
+```
+
+Unapaswa kuipa`.bb2a` `border-top` ya `1vw solid #000`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2a')?.borderTop, "1vw solid rgb(0, 0, 0)");
+```
+
+Unapaswa kuipa`.bb2a` `border-bottom` ya `1vw solid #000`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2a')?.borderBottom, "1vw solid rgb(0, 0, 0)");
+```
+
+Unapaswa kuipa`.bb2a` `border-left` ya `1vw solid #999`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2a')?.borderLeft, "1vw solid rgb(153, 153, 153)");
+```
+
+Unapaswa kuipa`.bb2a` `border-right` ya `1vw solid #999`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.bb2a')?.borderRight, "1vw solid rgb(153, 153, 153)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ff.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ff.md
new file mode 100644
index 00000000000..1775ff7ff24
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98ff.md
@@ -0,0 +1,238 @@
+---
+id: 5d822fd413a79914d39e98ff
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Kisha, ondoa `width` na `height` kutoka kwa `.bb2a`, na ubadilishe `border-left` na `border-right` ili kutumia `5vw` badala ya `1vw`. Kipengele sasa kitakuwa na saizi ya sifuri na mipaka itakuja pamoja katikati.
+
+# --hints--
+
+Unapaswa kuondoa `width` kutoka kwa `.bb2a`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb2a")?.width);
+```
+
+Unapaswa kuondoa `height` kutoka kwa `.bb2a`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb2a")?.height);
+```
+
+Unapaswa kubadilisha `border-left` ili kutumia `5vw`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb2a")?.borderLeft, "5vw solid rgb(153, 153, 153)");
+```
+
+Unapaswa kubadilisha `border-right` ili kutumia `5vw`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb2a")?.borderRight, "5vw solid rgb(153, 153, 153)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+--fcc-editable-region--
+.bb2a {
+ margin: auto;
+ width: 5vw;
+ height: 5vw;
+ border-top: 1vw solid #000;
+ border-bottom: 1vw solid #000;
+ border-left: 1vw solid #999;
+ border-right: 1vw solid #999;
+}
+--fcc-editable-region--
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9900.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9900.md
new file mode 100644
index 00000000000..54dcd91cf7c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9900.md
@@ -0,0 +1,224 @@
+---
+id: 5d822fd413a79914d39e9900
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Kisha, badilisha `#999` mbili za `.bb2a` hadi `transparent`. Hii itafanya mipaka ya kushoto na kulia isionekane.
+
+# --hints--
+
+Unapaswa kubadilisha `border-left` ili kutumia `transparent`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb2a")?.borderLeft, "5vw solid transparent");
+```
+
+Unapaswa kubadilisha `border-right` ili kutumia `transparent`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb2a")?.borderRight, "5vw solid transparent");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+--fcc-editable-region--
+.bb2a {
+ margin: auto;
+ border-top: 1vw solid #000;
+ border-bottom: 1vw solid #000;
+ border-left: 5vw solid #999;
+ border-right: 5vw solid #999;
+}
+--fcc-editable-region--
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9901.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9901.md
new file mode 100644
index 00000000000..15d5769992a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9901.md
@@ -0,0 +1,224 @@
+---
+id: 5d822fd413a79914d39e9901
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Ondoa sifa za `margin` na `border-top` na thamani kutoka `.bb2a` ili kuigeuza kuwa pembetatu kwa sehemu ya juu ya jengo.
+
+# --hints--
+
+Unapaswa kuondoa `margin` kutoka kwa `.bb2a`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb2a")?.margin);
+```
+
+Unapaswa kuondoa `border-top` kutoka kwa `.bb2a`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb2a")?.borderTop);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+--fcc-editable-region--
+.bb2a {
+ margin: auto;
+ border-top: 1vw solid #000;
+ border-bottom: 1vw solid #000;
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+--fcc-editable-region--
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9902.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9902.md
new file mode 100644
index 00000000000..f70d3d258db
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9902.md
@@ -0,0 +1,227 @@
+---
+id: 5d822fd413a79914d39e9902
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Hatimaye, kwenye sifa ya `border-bottom` ya `.bb2a`, badilisha `1vw` hadi `5vh` na ubadilishe rangi ya `#000` kuwa kihifadhi chako cha `--building-color2`. Kwa sasa inaonekana nzuri! Wakati wowote katika mradi huu, unaweza kutoa maoni au kuondoa sifa ya `border` uliyoongeza kwa kila kitu mwanzoni ili kuona jinsi majengo yatakavyokuwa yakiondolewa mwishoni.
+
+# --hints--
+
+Unapaswa kubadilisha `border-bottom` ili kutumia `5vh`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".bb2a")?.borderBottom, "5vh");
+```
+
+Unapaswa kubadilisha `border-bottom` ili kutumia `--building-color2`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".bb2a")?.borderBottom.trim(), "var(--building-color2)");
+```
+
+`border-bottom` inapaswa kuwa `5vh solid var(--building-color2)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb2a")?.borderBottom.trim(), "5vh solid var(--building-color2)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+--fcc-editable-region--
+.bb2a {
+ border-bottom: 1vw solid #000;
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+--fcc-editable-region--
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9903.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9903.md
new file mode 100644
index 00000000000..c58a5498f44
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9903.md
@@ -0,0 +1,223 @@
+---
+id: 5d822fd413a79914d39e9903
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Tuendelee kwenye jengo linalofuata! Unda kihifadhi kipya kiitwacho `--window-color3` katika `:root` na ukipe thamani ya `#d98cb3`. Hii itakuwa rangi ya pili kwa majengo ya pink.
+
+# --hints--
+
+Unapaswa kufafanua kihifadhi kipya cha sifa `--window-color3`.
+
+```js
+assert(new __helpers.CSSHelp(document).isPropertyUsed("--window-color3"));
+```
+
+Unapaswa kuipa `--window-color3` thamani ya `#d98cb3`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(":root")?.getPropertyValue("--window-color3")?.trim(), "#d98cb3");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+}
+--fcc-editable-region--
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9904.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9904.md
new file mode 100644
index 00000000000..8747b7b1028
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9904.md
@@ -0,0 +1,245 @@
+---
+id: 5d822fd413a79914d39e9904
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Kufikia sasa, gradient zote ulizounda zimetoka juu hadi chini, huo ndio mwelekeo chaguo-msingi. Unaweza kutaja mwelekeo mwingine kwa kuiongeza kabla ya rangi zako kama hii:
+
+```css
+gradient-type(
+ direction,
+ color1,
+ color2
+);
+```
+
+Jaza `.bb3` kwa `repeating-linear-gradient`. Tumia `90deg` kwa mwelekeo, `building-color3` yako kwa rangi mbili za kwanza, na `window-color3` kwa `15%` kwa za tatu. Usipotaja umbali wa rangi, itatumia thamani zinazoeleweka. Katika hali hii, rangi mbili za kwanza zitabadilika kuwa `0%` na `7.5%` kwa sababu inaanzia `0%` na `7.5%` ni nusu ya `15%`.
+
+# --hints--
+
+Unapaswa kuipa `.bb3` `background` kwa kutumia `repeating-linear-gradient`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".bb3")?.background, "repeating-linear-gradient");
+```
+
+Unapaswa kutumia `90deg` kwa mwelekeo katika hoja ya kwanza ya `repeating-linear-gradient`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".bb3")?.getPropVal('background', true), "repeating-linear-gradient(90deg");
+```
+
+Unapaswa kutumia `--building-color3` kwa rangi mbili za kwanza.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".bb3")?.getPropVal('background', true), "repeating-linear-gradient(90deg,var(--building-color3),var(--building-color3)");
+```
+
+Unapaswa kutumia `--window-color3` katika `15%` kwa rangi ya tatu.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb3")?.getPropVal('background', true), "repeating-linear-gradient(90deg,var(--building-color3),var(--building-color3),var(--window-color3)15%)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+--fcc-editable-region--
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+}
+--fcc-editable-region--
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9905.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9905.md
new file mode 100644
index 00000000000..d248786afd4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9905.md
@@ -0,0 +1,223 @@
+---
+id: 5d822fd413a79914d39e9905
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Ondoa sifa ya `background-color` na thamani kutoka kwa `.bb3` kwa kuwa unatumia gradient kama usuli sasa.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka `.bb3`.
+
+```js
+assert.notMatch(code, /\.bb3\s*\{\s*[^}]*?background-color[^}]*?\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+--fcc-editable-region--
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background-color: var(--building-color3);
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+--fcc-editable-region--
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9906.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9906.md
new file mode 100644
index 00000000000..e8f959e960b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9906.md
@@ -0,0 +1,249 @@
+---
+id: 5d822fd413a79914d39e9906
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Jengo linalofuata litakuwa na sehemu tatu. Ongeza vipengele vitatu vya `div` ndani ya `.bb4`. Zipe classes za `bb4a`, `bb4b`, na `bb4c` kwa utaratibu huo.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vitatu vya `div` ndani ya `.bb4`.
+
+```js
+assert.equal(document.querySelector("div.bb4")?.children?.length, 3);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza class ya `bb4a`.
+
+```js
+assert.exists(document.querySelector("div.bb4 > div.bb4a"));
+```
+
+Unapaswa kuipa `div` mpya ya pili class ya `bb4b`.
+
+```js
+assert.exists(document.querySelector("div.bb4 > div.bb4a"));
+```
+
+Unapaswa kuipa `div` mpya ya kwanza class ya `bb4c`.
+
+```js
+assert.exists(document.querySelector("div.bb4 > div.bb4a"));
+```
+
+Unapaswa kuweka vipengele vipya vya `div` kwa mpangilio huu `.bb4a + .bb4b + .bb4c`.
+
+```js
+assert.exists(document.querySelector("div.bb4a + div.bb4b"));
+assert.exists(document.querySelector("div.bb4b + div.bb4c"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9907.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9907.md
new file mode 100644
index 00000000000..c43f06f2304
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9907.md
@@ -0,0 +1,258 @@
+---
+id: 5d822fd413a79914d39e9907
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Vipe vipengele vipya vya `div` hizi `width` na `height` thamani: `3%` na `10%` kwa `.bb4a`, `80%` na `5%` kwa `.bb4b`, na `100%` na `85%` kwa `.bb4c`.
+
+# --hints--
+
+Unapaswa kuipa `.bb4a` `width` ya `3%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4a")?.width, "3%");
+```
+
+Unapaswa kuipa `.bb4a` `height` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4a")?.height, "10%");
+```
+
+Unapaswa kuipa `.bb4b` `width` ya `80%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4b")?.width, "80%");
+```
+
+Unapaswa kuipa `.bb4b` `height` ya `5%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4b")?.height, "5%");
+```
+
+Unapaswa kuipa `.bb4c` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4c")?.width, "100%");
+```
+
+Unapaswa kuipa `.bb4c` `height` ya `85%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4c")?.height, "85%");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9908.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9908.md
new file mode 100644
index 00000000000..0e1c3a114c6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9908.md
@@ -0,0 +1,258 @@
+---
+id: 5d822fd413a79914d39e9908
+title: Hatua ya 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+Ondoa sifa ya `background-color` na thamani kutoka `.bb4`, na uiongeze kwenye sehemu tatu mpya `.bb4a`, `.bb4b`, na `.bb4c`, kwa hivyo ni sehemu tu ndizo zinajazwa.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka kwa `.bb4`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb4")?.backgroundColor);
+```
+
+Unapaswa kuipa `.bb4a` `background-color` ya `--building-color4`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4a")?.backgroundColor.trim(), "var(--building-color4)");
+```
+
+Unapaswa kuipa `.bb4b` `background-color` ya `--building-color4`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4b")?.backgroundColor.trim(), "var(--building-color4)");
+```
+
+Unapaswa kuipa `.bb4c` `background-color` ya `--building-color4`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4c")?.backgroundColor.trim(), "var(--building-color4)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+--fcc-editable-region--
+.bb4 {
+ width: 11%;
+ height: 58%;
+ background-color: var(--building-color4);
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+}
+--fcc-editable-region--
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9909.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9909.md
new file mode 100644
index 00000000000..11f02884e94
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9909.md
@@ -0,0 +1,245 @@
+---
+id: 5d822fd413a79914d39e9909
+title: Hatua ya 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Unataka `.bb4` kushiriki sifa za `.bb1` ambazo zinaweka katikati sehemu. Badala ya kunakili msimbo huo, unda darasa jipya juu ya maoni ya muundo wa usuli inayoitwa `building-wrap`. Iache tupu kwa sasa; darasa hili litatumika katika maeneo machache kukuhifadhia baadhi ya usimbaji.
+
+# --hints--
+
+Unapaswa kuunda tamko jipya la darasa linaloitwa `building-wrap`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle(".building-wrap"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990a.md
new file mode 100644
index 00000000000..9ecaca4c6af
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990a.md
@@ -0,0 +1,277 @@
+---
+id: 5d822fd413a79914d39e990a
+title: Hatua ya 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Hamisha sifa za `display`, `flex-direction`, na `align-items` na thamani kutoka `.bb1` hadi class mpya ya `building-wrap`.
+
+# --hints--
+
+Unapaswa kuondoa `display` kutoka kwa `.bb1`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb1")?.display);
+```
+
+Unapaswa kuhamisha `display` yenye thamani ya `flex` hadi `.building-wrap`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".building-wrap")?.display, "flex");
+```
+
+Unapaswa kuondoa `flex-direction` kutoka kwa `.bb1`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb1")?.flexDirection);
+```
+
+Unapaswa kuhamisha `flex-direction` yenye thamani ya `column` hadi `.building-wrap`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".building-wrap")?.flexDirection, "column");
+```
+
+Unapaswa kuondoa `align-items` kutoka kwa `.bb1`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".bb1")?.alignItems);
+```
+
+Unapaswa kuhamisha `align-items` yenye thamani ya `center` hadi `.building-wrap`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".building-wrap")?.alignItems, "center");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+--fcc-editable-region--
+.building-wrap {
+
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+--fcc-editable-region--
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990b.md
new file mode 100644
index 00000000000..bddc17385ad
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990b.md
@@ -0,0 +1,254 @@
+---
+id: 5d822fd413a79914d39e990b
+title: Hatua ya 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Ongeza darasa jipya la `building-wrap` kwa vipengele vya `.bb1`, `.bb4`. Hii itatumia sifa za kuzingatia kwa majengo ambayo yanahitaji.
+
+# --hints--
+
+Unapaswa kuongeza `building-wrap` kwenye kipengele cha `.bb1`.
+
+```js
+assert.exists(document.querySelector("div.bb1.building-wrap"));
+```
+
+Unapaswa kuongeza `building-wrap` kwenye kipengele cha `.bb4`.
+
+```js
+assert.exists(document.querySelector("div.bb4.building-wrap"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990c.md
new file mode 100644
index 00000000000..43aaf7c05e4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990c.md
@@ -0,0 +1,253 @@
+---
+id: 5d822fd413a79914d39e990c
+title: Hatua ya 68
+challengeType: 0
+dashedName: step-68
+---
+
+# --description--
+
+Unda kihifadhi kipya kiitwacho `--window-color4` katika `:root` na ukipe thamani ya `#8cb3d9`. Hii itakuwa rangi ya pili kwa jengo la mwisho la usuli.
+
+# --hints--
+
+Unapaswa kufafanua kihifadhi kipya cha sifa `--window-color4`.
+
+```js
+assert(new __helpers.CSSHelp(document).isPropertyUsed("--window-color4"));
+```
+
+Unapaswa kuipa `--window-color4` thamani ya `#8cb3d9`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(":root")?.getPropertyValue("--window-color4")?.trim(), "#8cb3d9");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+}
+--fcc-editable-region--
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990d.md
new file mode 100644
index 00000000000..0fd33ce84ce
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990d.md
@@ -0,0 +1,255 @@
+---
+id: 5d822fd413a79914d39e990d
+title: Hatua ya 69
+challengeType: 0
+dashedName: step-69
+---
+
+# --description--
+
+Weka vipengele vinne vipya vya `div` ndani ya `.bb4c`, vipe zote classes za `bb4-window`. Hizi zitakuwa madirisha kwa jengo hili.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vinne vya `div` kwenye `.bb4c`.
+
+```js
+assert.equal(document.querySelector(".bb4c")?.children?.length, 4);
+```
+
+Unapaswa kuipa kila `div` mpya class ya `bb4-window`.
+
+```js
+assert.equal(document.querySelectorAll("div.bb4c > div.bb4-window")?.length, 4);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990e.md
new file mode 100644
index 00000000000..5b498ddd7dc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990e.md
@@ -0,0 +1,265 @@
+---
+id: 5d822fd413a79914d39e990e
+title: Hatua ya 70
+challengeType: 0
+dashedName: step-70
+---
+
+# --description--
+
+Ipe class ya `bb4-window` `width` ya `18%`, `height` ya `90%`, na uongeze kihifadhi chako cha `--window-color4` kama `background-color`.
+
+# --hints--
+
+Unapaswa kuipa `.bb4-window` `width` ya `18%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4-window")?.width, "18%");
+```
+
+Unapaswa kuipa `.bb4-window` `height` ya `90%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4-window")?.height, "90%");
+```
+
+Unapaswa kuipa `.bb4-window` `background-color` ya `--window-color4`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".bb4-window")?.backgroundColor.trim(), "var(--window-color4)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990f.md
new file mode 100644
index 00000000000..e5e9b618cae
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e990f.md
@@ -0,0 +1,279 @@
+---
+id: 5d822fd413a79914d39e990f
+title: Hatua ya 71
+challengeType: 0
+dashedName: step-71
+---
+
+# --description--
+
+
+Madirisha yamewekwa juu ya kila mmoja upande wa kushoto wa sehemu, nyuma ya jengo la zambarau. Ongeza class mpya chini ya `.building-wrap` inayoitwa `window-wrap`. Tengeneza `.window-wrap` iwe flexbox container, na utumie sifa za `align-items` na `justify-content` ili kuweka vipengele vyake katikati kiwima na kwa usawa. kwa mzazi wao, mtawalia.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.window-wrap`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle(".window-wrap"));
+```
+
+Unapaswa kuipa`.window-wrap` `display` ya `flex`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".window-wrap")?.display, "flex");
+```
+
+Unapaswa kuipa `.window-wrap` `align-items` ya `center`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".window-wrap")?.alignItems, "center");
+```
+
+Unapaswa kuipa`.window-wrap` `justify-content` ya `space-evenly`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".window-wrap")?.justifyContent, "space-evenly");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9910.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9910.md
new file mode 100644
index 00000000000..8096c6c06cf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9910.md
@@ -0,0 +1,266 @@
+---
+id: 5d822fd413a79914d39e9910
+title: Hatua ya 72
+challengeType: 0
+dashedName: step-72
+---
+
+# --description--
+
+Ongeza darasa jipya la `window-wrap` kwenye kipengele cha `.bb4c`.
+
+# --hints--
+
+Unapaswa kuongeza class ya `window-wrap` kwa `.bb4c`.
+
+```js
+assert.exists(document.querySelector("div.bb4c.window-wrap"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9911.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9911.md
new file mode 100644
index 00000000000..ea371dd6205
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9911.md
@@ -0,0 +1,291 @@
+---
+id: 5d822fd413a79914d39e9911
+title: Hatua ya 73
+challengeType: 0
+dashedName: step-73
+---
+
+# --description--
+
+Yapendeza! Tuendelee kwenye majengo ya mbele! Geuza jengo la `.fb1` kuwa sehemu tatu kwa kuweka vipengee vitatu vipya vya `div` ndani yake. Zipe classes za `fb1a`, `fb1b`, na `fb1c` kwa utaratibu huo.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vitatu vya `div` ndani ya `.fb1`.
+
+```js
+assert.equal(document.querySelector("div.fb1")?.children?.length, 3);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza class ya `fb1a`.
+
+```js
+assert.exists(document.querySelector("div.fb1 > div.fb1a"));
+```
+
+Unapaswa kuipa `div` mpya ya pili class ya `fb1b`.
+
+```js
+assert.exists(document.querySelector("div.fb1 > div.fb1b"));
+```
+
+Unapaswa kuipa `div` mpya ya kwanza class ya `fb1c`.
+
+```js
+assert.exists(document.querySelector("div.fb1 > div.fb1c"));
+```
+
+Unapaswa kuweka vipengele vipya vya `div` kwa mpangilio huu `.fb1a + .fb1b + .fb1c`.
+
+```js
+assert.exists(document.querySelector("div.fb1a + div.fb1b"));
+assert.exists(document.querySelector("div.fb1b + div.fb1c"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9912.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9912.md
new file mode 100644
index 00000000000..81a433ae0a6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9912.md
@@ -0,0 +1,287 @@
+---
+id: 5d822fd413a79914d39e9912
+title: Hatua ya 74
+challengeType: 0
+dashedName: step-74
+---
+
+# --description--
+
+Ipe `.fb1b` `width` ya `60%` na `height` ya `10%`, na `.fb1c` `width` ya `100%` na `height` ya `80%`.
+
+# --hints--
+
+Unapaswa kuipa `.fb1b` `width` ya `60%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb1b")?.width, "60%");
+```
+
+Unapaswa kuipa `.fb1b` `height` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb1b")?.height, "10%");
+```
+
+Unapaswa kuipa `.fb1c` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb1c")?.width, "100%");
+```
+
+Unapaswa kuipa `.fb1c` `height` ya `80%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb1c")?.height, "80%");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9913.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9913.md
new file mode 100644
index 00000000000..79b72a4a25b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9913.md
@@ -0,0 +1,280 @@
+---
+id: 5d822fd413a79914d39e9913
+title: Hatua ya 75
+challengeType: 0
+dashedName: step-75
+---
+
+# --description--
+
+Ongeza class ya `building-wrap` kwenye kipengele cha `.fb1` ili kuweka sehemu katikati.
+
+# --hints--
+
+Unapaswa kuongeza class ya `building-wrap` kwa `.fb1`.
+
+```js
+assert.exists(document.querySelector("div.fb1.building-wrap"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9914.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9914.md
new file mode 100644
index 00000000000..ac9f86450d8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9914.md
@@ -0,0 +1,284 @@
+---
+id: 5d822fd413a79914d39e9914
+title: Hatua ya 76
+challengeType: 0
+dashedName: step-76
+---
+
+# --description--
+
+Hamisha sifa ya `background-color` na thamani kutoka `.fb1` hadi `.fb1b`.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka kwa `.fb1`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".fb1")?.backgroundColor);
+```
+
+Unapaswa kuongeza `background-color` ya `--building-color4` kwa `.fb1b`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb1b")?.backgroundColor.trim(), "var(--building-color4)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+--fcc-editable-region--
+.fb1 {
+ width: 10%;
+ height: 60%;
+ background-color: var(--building-color4);
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+}
+--fcc-editable-region--
+.fb1c {
+ width: 100%;
+ height: 80%;
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9915.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9915.md
new file mode 100644
index 00000000000..3d64e004d4d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9915.md
@@ -0,0 +1,391 @@
+---
+id: 5d822fd413a79914d39e9915
+title: Hatua ya 106
+challengeType: 0
+dashedName: step-106
+---
+
+# --description--
+
+Huhitaji `background-color` ya jengo hili tena kwa hivyo unaweza kuondoa sifa hiyo.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka kwa `.fb5`.
+
+```js
+assert.notMatch(code, /\.fb5\s*\{\s*[^}]*?background-color[^}]*?\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+--fcc-editable-region--
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+--fcc-editable-region--
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9916.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9916.md
new file mode 100644
index 00000000000..0bc02dc9aaa
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9916.md
@@ -0,0 +1,297 @@
+---
+id: 5d822fd413a79914d39e9916
+title: Hatua ya 77
+challengeType: 0
+dashedName: step-77
+---
+
+# --description--
+
+Usijali kuhusu nafasi iliyo chini, kila kitu kitasogezwa chini baadaye utakapoongeza urefu fulani kwenye kipengele kilicho juu ya jengo.
+
+Ongeza `repeating-linear-gradient` kwa `.fb1c` yenye pembe ya `90deg`, `--building-color4` yako kutoka `0%` hadi `10%` na `transparent` kutoka `10%` hadi `15%`.
+
+# --hints--
+
+Unapaswa kuipa `.fb1c` `background` yenye `repeating-linear-gradient`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".fb1c")?.background, "repeating-linear-gradient");
+```
+
+Unapaswa kutumia mwelekeo(direction) wa `90deg`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".fb1c")?.getPropVal('background', true), "repeating-linear-gradient(90deg");
+```
+
+Unapaswa kutumia rangi ya kwanza ya `--building-color4` kutoka `0%` hadi `10%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb1c")?.getPropVal('background', true), /repeating-linear-gradient\(90deg,var(\(--building-color4\)(0%)?,var\(--building-color4\)10%|\(--building-color4\)0%10%)/);
+```
+
+Unapaswa kutumia rangi ya pili ya `transparent` kutoka `10%` hadi `15%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb1c")?.getPropVal('background', true), /,(transparent10%,transparent15%\)|transparent10%15%\))$/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+.fb1c {
+ width: 100%;
+ height: 80%;
+}
+--fcc-editable-region--
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9917.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9917.md
new file mode 100644
index 00000000000..fa40eae768f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9917.md
@@ -0,0 +1,307 @@
+---
+id: 5d822fd413a79914d39e9917
+title: Hatua ya 78
+challengeType: 0
+dashedName: step-78
+---
+
+# --description--
+
+Unaweza kuongeza gradient nyingi kwenye kipengele kwa kukitenganisha na koma (`,`) kama hii:
+
+```css
+gradient1(
+ colors
+),
+gradient2(
+ colors
+);
+```
+
+Ongeza `repeating-linear-gradient` kwa `.fb1c` chini ya ile iliyopo; tumia `--building-color4` yako kutoka `0%` hadi `10%` na `--window-color4` kutoka `10%` na `90%`. Hii itajaza nyuma ya gradient uliyoongeza mwisho.
+
+# --hints--
+
+Hupaswi kubadilisha `repeating-linear-gradient` ya kwanza.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb1c")?.getPropVal('background', true), /repeating-linear-gradient\(90deg,var\(--building-color4\)(0%)?,var\(--building-color4\)10%,transparent10%,transparent15%\)/);
+```
+
+Unapaswa kuongeza `repeating-linear-gradient` yenye rangi ya kwanza ya `--building-color4` kutoka `0%` hadi `10%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb1c")?.getPropVal('background', true), /repeating-linear-gradient\(90deg,var\(--building-color4\)(0%)?,var\(--building-color4\)10%,transparent10%,transparent15%\),repeating-linear-gradient\(var(\(--building-color4\)(0%)?,var\(--building-color4\)10%|\(--building-color4\)0%10%)/);
+```
+
+Unapaswa kutumia rangi ya pili ya `--window-color4` kutoka `10%` hadi `90%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb1c")?.getPropVal('background', true), /,(var\(--window-color4\)10%,var\(--window-color4\)90%\)|var\(--window-color4\)10%90%\))$/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+--fcc-editable-region--
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ )
+}
+--fcc-editable-region--
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9918.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9918.md
new file mode 100644
index 00000000000..e36ef9fff46
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9918.md
@@ -0,0 +1,298 @@
+---
+id: 5d822fd413a79914d39e9918
+title: Hatua ya 79
+challengeType: 0
+dashedName: step-79
+---
+
+# --description--
+
+Utatumia hila zingine za mpaka kwa sehemu ya juu. Ongeza `border-bottom` yenye thamani ya `7vh solid var(--building-color4)` kwenye `.fb1a`. Hii itaweka mpaka wa urefu wa `7vh` chini. Lakini kwa kuwa kipengele kina ukubwa wa sifuri, inaonekana tu kama mstari mpana wa 2px kutoka mpaka wa 1px ulio kwenye vipengele vyote.
+
+# --hints--
+
+Unapaswa kuipa `.fb1a` `border-bottom`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle(".fb1a")?.borderBottom);
+```
+
+Unapaswa kutumia `border-bottom` ya `7vh solid var(--building-color4)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb1a")?.borderBottom.trim(), "7vh solid var(--building-color4)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9919.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9919.md
new file mode 100644
index 00000000000..ca384c72293
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9919.md
@@ -0,0 +1,301 @@
+---
+id: 5d822fd413a79914d39e9919
+title: Hatua ya 80
+challengeType: 0
+dashedName: step-80
+---
+
+# --description--
+
+Unapoongeza ukubwa wa mipaka ya kushoto na kulia, mpaka wa chini utapanuka kuwa upana mmoja wa kushoto na wa kulia. Ongeza `2vw solid transparent` kama thamani ya `border-left` na `border-right` sifa za `.fb1a`. Hazitaonekana, lakini itafanya mpaka wa chini kuwa na upana wa `4vw`.
+
+# --hints--
+
+Unapaswa kuipa`.fb1a` `border-left` ya `2vw solid transparent`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb1a")?.borderLeft, "2vw solid transparent");
+```
+
+Unapaswa kuipa`.fb1a` `border-right` ya `2vw solid transparent`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb1a")?.borderRight, "2vw solid transparent");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+--fcc-editable-region--
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+}
+--fcc-editable-region--
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991a.md
new file mode 100644
index 00000000000..dcac231b97b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991a.md
@@ -0,0 +1,312 @@
+---
+id: 5d822fd413a79914d39e991a
+title: Hatua ya 81
+challengeType: 0
+dashedName: step-81
+---
+
+# --description--
+
+Tuendelee kwenye jengo linalofuata! Weka vipengele viwili vya `div` ndani ya `.fb2` na uvipe classes za `fb2a` na `fb2b`, kwa mpangilio huo.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` kwa `.fb2`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb2 > div")?.length, 2);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza class ya `fb2a`.
+
+```js
+assert.exists(document.querySelector("div.fb2 > div.fb2a"));
+assert(document.querySelector("div.fb2 > div.fb2a") === document.querySelector("div.fb2")?.firstElementChild);
+```
+
+Unapaswa kuipa `div` mpya ya pili class ya `fb2b`.
+
+```js
+assert.exists(document.querySelector("div.fb2 > div.fb2b"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991b.md
new file mode 100644
index 00000000000..4dc7fc71fea
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991b.md
@@ -0,0 +1,314 @@
+---
+id: 5d822fd413a79914d39e991b
+title: Hatua ya 82
+challengeType: 0
+dashedName: step-82
+---
+
+# --description--
+
+Ipe `.fb2a` `width` ya `100%` na `.fb2b` `width` ya `100%` na `height` ya `75%`.
+
+# --hints--
+
+Unapaswa kuipa `.fb2a` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2a")?.width, "100%");
+```
+
+Unapaswa kuipa `.fb2b` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2b")?.width, "100%");
+```
+
+Unapaswa kuipa `.fb2b` `height` ya `75%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2b")?.height, "75%");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991c.md
new file mode 100644
index 00000000000..5a20cd3951a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991c.md
@@ -0,0 +1,317 @@
+---
+id: 5d822fd413a79914d39e991c
+title: Hatua ya 83
+challengeType: 0
+dashedName: step-83
+---
+
+# --description--
+
+Weka vipengele vitatu vya `div` ndani ya `.fb2b` na uvipe class ya `fb2-window`. Hizi zitakuwa madirisha kwa sehemu hii ya jengo.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vitatu vya `div` ndani ya `.fb2b`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb2b > div")?.length, 3);
+```
+
+Unapaswa kuvipa vipengele vitatu vipya vya `div` kila class ya `fb2-window`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb2-window")?.length, 3);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb2a {
+ width: 100%;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991d.md
new file mode 100644
index 00000000000..64d5037560b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991d.md
@@ -0,0 +1,315 @@
+---
+id: 5d822fd413a79914d39e991d
+title: Hatua ya 84
+challengeType: 0
+dashedName: step-84
+---
+
+# --description--
+
+Ongeza class yako ya `window-wrap` kwenye `.fb2b` ili kuweka vipengele vya dirisha vipya.
+
+# --hints--
+
+Unapaswa kuongeza class ya `window-wrap` kwa `.fb2b`.
+
+```js
+assert.exists(document.querySelector("div.fb2b.window-wrap"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb2a {
+ width: 100%;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991e.md
new file mode 100644
index 00000000000..0ed1da61a4c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991e.md
@@ -0,0 +1,326 @@
+---
+id: 5d822fd413a79914d39e991e
+title: Hatua ya 85
+challengeType: 0
+dashedName: step-85
+---
+
+# --description--
+
+Vipe vipengele vya `.fb2-window` `width` ya `22%`, `height` ya `100%`, na `background-color` ya kihifadhi chako cha `--window-color3`.
+
+# --hints--
+
+Unapaswa kuvipa vipengele vya `.fb2-window` `width` ya `22%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2-window")?.width, "22%");
+```
+
+Unapaswa kuvipa vipengele vya `.fb2-window` `height` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2-window")?.height, "100%");
+```
+
+Unapaswa kuvipa vipengele vya `.fb2-window` `background-color` ya `--window-color3`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2-window")?.backgroundColor.trim(), "var(--window-color3)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb2a {
+ width: 100%;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991f.md
new file mode 100644
index 00000000000..59fb3b767f2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e991f.md
@@ -0,0 +1,324 @@
+---
+id: 5d822fd413a79914d39e991f
+title: Hatua ya 86
+challengeType: 0
+dashedName: step-86
+---
+
+# --description--
+
+Hamisha sifa ya `background-color` na thamani kutoka `.fb2` hadi `.fb2b` ili tu kuweka rangi kwa sehemu na si chombo.
+
+# --hints--
+
+Unapaswa kuondoa sifa ya `background-color` kutoka kwa `.fb2`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".fb2")?.backgroundColor);
+```
+
+Unapaswa kuipa `.fb2b` `background-color` ya `--building-color3`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2b")?.backgroundColor.trim(), "var(--building-color3)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+--fcc-editable-region--
+.fb2 {
+ width: 10%;
+ height: 40%;
+ background-color: var(--building-color3);
+}
+
+.fb2a {
+ width: 100%;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+}
+--fcc-editable-region--
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9920.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9920.md
new file mode 100644
index 00000000000..256cc971334
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9920.md
@@ -0,0 +1,330 @@
+---
+id: 5d822fd413a79914d39e9920
+title: Hatua ya 87
+challengeType: 0
+dashedName: step-87
+---
+
+# --description--
+
+Kwa `.fb2a`, ongeza `border-bottom` ya `10vh solid var(--building-color3)`, na `border-left` na `border-right` ya `1vw solid transparent`. Wakati huu hila ya mpaka itaunda sura ya trapezoid.
+
+# --hints--
+
+Unapaswa kuipa `.fb2a` `border-bottom` ya `10vh solid var(--building-color3)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2a")?.borderBottom.trim(), "10vh solid var(--building-color3)");
+```
+
+Unapaswa kuipa`.fb2a` `border-left` ya `1vw solid transparent`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2a")?.borderLeft, "1vw solid transparent");
+```
+
+Unapaswa kuipa`.fb2a` `border-right` ya `1vw solid transparent`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb2a")?.borderRight, "1vw solid transparent");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+--fcc-editable-region--
+.fb2a {
+ width: 100%;
+}
+--fcc-editable-region--
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9921.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9921.md
new file mode 100644
index 00000000000..fd28809ce86
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9921.md
@@ -0,0 +1,348 @@
+---
+id: 5d822fd413a79914d39e9921
+title: Hatua ya 88
+challengeType: 0
+dashedName: step-88
+---
+
+# --description--
+
+Kwa jengo linalofuata, weka vipengele vinne vya `div` ndani ya `.fb3` vyenye madarasa ya `fb3a`, `fb3b`, `fb3a` tena, na `fb3b` tena, kwa mpangilio huo. Jengo hili litakuwa na sehemu nne, na mbili za juu zitakuwa karibu sawa na mbili za chini.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vinne vya `div` ndani ya `.fb3`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb3 > div")?.length, 4);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza class ya `fb3a`.
+
+```js
+assert.equal(document.querySelector("div.fb3").firstElementChild, document.querySelector("div.fb3a"));
+```
+
+Unapaswa kuipa `div` mpya ya pili class ya `fb3b`.
+
+```js
+assert.equal(document.querySelector("div.fb3 :nth-child(2)"), document.querySelector("div.fb3b"));
+```
+
+Unapaswa kuipa `div` mpya ya tatu class ya `fb3a`.
+
+```js
+assert.equal(document.querySelector("div.fb3 :nth-child(3)"), document.querySelector("div.fb3b + div.fb3a"));
+```
+
+Unapaswa kuipa `div` mpya ya nne class ya `fb3b`.
+
+```js
+assert.exists(document.querySelector("div.fb3 :nth-child(4).fb3b"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9922.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9922.md
new file mode 100644
index 00000000000..fd907e1c1bd
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9922.md
@@ -0,0 +1,347 @@
+---
+id: 5d822fd413a79914d39e9922
+title: Hatua ya 89
+challengeType: 0
+dashedName: step-89
+---
+
+# --description--
+
+Kipe kipengele cha `.fb3a` `width` ya `80%` na `height` ya `15%`. Kisha kipe kipengele cha `.fb3b` `width` ya `100%` na `height` ya `35%`.
+
+# --hints--
+
+Unapaswa kuipa `.fb3a` `width` ya `80%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3a")?.width, "80%");
+```
+
+Unapaswa kuipa `.fb3a` `height` ya `15%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3a")?.height, "15%");
+```
+
+Unapaswa kuipa `.fb3b` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3b")?.width, "100%");
+```
+
+Unapaswa kuipa `.fb3b` `height` ya `35%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3b")?.height, "35%");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9923.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9923.md
new file mode 100644
index 00000000000..87b4683f90f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9923.md
@@ -0,0 +1,348 @@
+---
+id: 5d822fd413a79914d39e9923
+title: Hatua ya 90
+challengeType: 0
+dashedName: step-90
+---
+
+# --description--
+
+Ondoa sifa ya `background-color` na thamani kutoka `.fb3`, na uziongeze kwenye `.fb3a` na `.fb3b`.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka `.fb3`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".fb3")?.backgroundColor);
+```
+
+Unapaswa kuipa `.fb3a` `background-color` ya `--building-color1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3a")?.backgroundColor.trim(), "var(--building-color1)");
+```
+
+Unapaswa kuipa `.fb3b` `background-color` ya `--building-color1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3b")?.backgroundColor.trim(), "var(--building-color1)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+--fcc-editable-region--
+.fb3 {
+ width: 10%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+}
+--fcc-editable-region--
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9924.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9924.md
new file mode 100644
index 00000000000..939151a486f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9924.md
@@ -0,0 +1,340 @@
+---
+id: 5d822fd413a79914d39e9924
+title: Hatua ya 91
+challengeType: 0
+dashedName: step-91
+---
+
+# --description--
+
+Ongeza class ya `building-wrap` kwenye kipengele cha `.fb3` ili kuweka sehemu katikati.
+
+# --hints--
+
+Unapaswa kuongeza class ya `building-wrap` kwa `.fb3`.
+
+```js
+assert.exists(document.querySelector("div.fb3.building-wrap"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9925.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9925.md
new file mode 100644
index 00000000000..1a4706688cc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9925.md
@@ -0,0 +1,346 @@
+---
+id: 5d822fd413a79914d39e9925
+title: Hatua ya 92
+challengeType: 0
+dashedName: step-92
+---
+
+# --description--
+
+Ongeza vipengele vitatu vya `div` ndani ya kipengele cha kwanza cha `.fb3a`. Zipe zote class za `fb3-window`. Hizi zitakuwa madirisha kwa sehemu hii.
+
+# --hints--
+
+Unapaswa kuweka vipengele vitatu vya `div` ndani ya kipengele cha kwanza cha `.fb3a`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb3a > div")?.length, 3);
+```
+
+Unapaswa kuipa kila `div` mpya class ya `fb3-window`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb3-window")?.length, 3)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9926.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9926.md
new file mode 100644
index 00000000000..20e8945362c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9926.md
@@ -0,0 +1,355 @@
+---
+id: 5d822fd413a79914d39e9926
+title: Hatua ya 93
+challengeType: 0
+dashedName: step-93
+---
+
+# --description--
+
+Vipe vipengele vya `.fb3-window` `width` ya `25%`, `height` ya `80%`, na utumie kihifadhi chako cha `--window-color1` kama thamani ya `background-color`.
+
+# --hints--
+
+Unapaswa kuipa `.fb3-window` `width` ya `25%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3-window")?.width, "25%");
+```
+
+Unapaswa kuipa `.fb3-window` `height` ya `80%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3-window")?.height, "80%");
+```
+
+Unapaswa kuipa `.fb3-window` `background-color` ya `--window-color1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb3-window")?.backgroundColor.trim(), "var(--window-color1)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9927.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9927.md
new file mode 100644
index 00000000000..b5a8e9630f8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9927.md
@@ -0,0 +1,350 @@
+---
+id: 5d822fd413a79914d39e9927
+title: Hatua ya 94
+challengeType: 0
+dashedName: step-94
+---
+
+# --description--
+
+Ongeza class ya `window-wrap` kwenye kipengele cha `.fb3a` ili kuweka kuweka madirisha.
+
+# --hints--
+
+Unapaswa kuipa kila `.fb3a` class ya `window-wrap`.
+
+```js
+assert.exists(document.querySelector("div.fb3a.window-wrap"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9928.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9928.md
new file mode 100644
index 00000000000..e3d42a79071
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9928.md
@@ -0,0 +1,349 @@
+---
+id: 5d822fd413a79914d39e9928
+title: Hatua ya 95
+challengeType: 0
+dashedName: step-95
+---
+
+# --description--
+
+Ukiwa na vihifadhi vya CSS unaweza kubadilisha thamani bila kutafuta kila mahali kwenye laha ya mtindo. Badilisha thamani ya `--window-color1` iwe `#bb99ff`.
+
+# --hints--
+
+Unapaswa kubadilisha thamani ya `--window-color1` hadi `#bb99ff`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(":root")?.getPropertyValue("--window-color1")?.trim(), "#bb99ff");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: black;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+--fcc-editable-region--
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9929.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9929.md
new file mode 100644
index 00000000000..7b3adc7ee63
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9929.md
@@ -0,0 +1,362 @@
+---
+id: 5d822fd413a79914d39e9929
+title: Hatua ya 96
+challengeType: 0
+dashedName: step-96
+---
+
+# --description--
+
+Majengo mengine matatu tu yamesalia. Ongeza vipengele viwili vya `div` ndani ya `.fb4` na uvipe classes za `fb4a` na `fb4b` kwa mpangilio huo. Kumbuka kwamba uligeuza eneo la `.fb4` na `.fb5`, kwa hivyo ndilo jengo la zambarau kulia zaidi unalofanyia kazi sasa.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `div` ndani ya `.fb4`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb4 > div")?.length, 2);
+```
+
+Unapaswa kuipa `div` mpya ya kwanza class ya `fb4a`.
+
+```js
+assert.exists(document.querySelector("div.fb4a"));
+```
+
+Unapaswa kuipa `div` mpya ya pili class ya `fb4b`.
+
+```js
+assert.exists(document.querySelector("div.fb4b"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992a.md
new file mode 100644
index 00000000000..8db06d00ed9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992a.md
@@ -0,0 +1,359 @@
+---
+id: 5d822fd413a79914d39e992a
+title: Hatua ya 97
+challengeType: 0
+dashedName: step-97
+---
+
+# --description--
+
+Ipe `.fb4b` `width` ya `100%` na `height` ya `89%`.
+
+# --hints--
+
+Unapaswa kuipa `.fb4b` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4b")?.width, "100%");
+```
+
+Unapaswa kuipa `.fb4b` `height` ya `89%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4b")?.height, "89%");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992b.md
new file mode 100644
index 00000000000..9c9b1450a72
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992b.md
@@ -0,0 +1,361 @@
+---
+id: 5d822fd413a79914d39e992b
+title: Hatua ya 98
+challengeType: 0
+dashedName: step-98
+---
+
+# --description--
+
+Ongeza kihifadhi chako cha `--building-color1` kama thamani ya `background-color` ya `.fb4b`. Kisha, ondoa `background-color` kutoka kwa `.fb4`.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka kwa `.fb4`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle(".fb4")?.backgroundColor);
+```
+
+Unapaswa kuipa `.fb4b` `background-color` ya `--building-color1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4b")?.backgroundColor.trim(), "var(--building-color1)");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+--fcc-editable-region--
+.fb4 {
+ width: 8%;
+ height: 45%;
+ background-color: var(--building-color1);
+ position: relative;
+ left: 10%;
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+}
+--fcc-editable-region--
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992c.md
new file mode 100644
index 00000000000..3d1e3d35642
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992c.md
@@ -0,0 +1,364 @@
+---
+id: 5d822fd413a79914d39e992c
+title: Hatua ya 99
+challengeType: 0
+dashedName: step-99
+---
+
+# --description--
+
+Weka vipengele sita vya `div` ndani ya `.fb4b` na uvipe vyote class ya `fb4-window`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele sita vya `div` ndani ya `.fb4b`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb4b > div")?.length, 6);
+```
+
+Unapaswa kuipa kila `div` mpya class ya `fb4-window`.
+
+```js
+assert.equal(document.querySelectorAll("div.fb4-window")?.length, 6);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992d.md
new file mode 100644
index 00000000000..3391c418120
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992d.md
@@ -0,0 +1,377 @@
+---
+id: 5d822fd413a79914d39e992d
+title: Hatua ya 100
+challengeType: 0
+dashedName: step-100
+---
+
+# --description--
+
+Vipe vipengele vya `.fb4-window` `width` ya `30%`, `height` ya `10%`, na `border-radius` ya `50%`. Hizi zitafanya madirisha kadhaa ya mviringo kwa jengo hili.
+
+# --hints--
+
+Unapaswa kuipa `.fb4-window` `width` ya `30%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4-window")?.width, "30%");
+```
+
+Unapaswa kuipa `.fb4-window` `height` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4-window")?.height, "10%");
+```
+
+Unapaswa kuipa `.fb4-window` `border-radius` ya `50%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4-window")?.borderRadius, "50%");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992e.md
new file mode 100644
index 00000000000..602df618a92
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992e.md
@@ -0,0 +1,374 @@
+---
+id: 5d822fd413a79914d39e992e
+title: Hatua ya 101
+challengeType: 0
+dashedName: step-101
+---
+
+# --description--
+
+Jaza madirisha na rangi yako ya pili ya jengo hili. Pia, ongeza `margin` ya `10%` ili kuyapa madirisha nafasi.
+
+# --hints--
+
+Unapaswa kuipa `.fb4-window` `background-color` ya `--window-color1`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4-window")?.backgroundColor.trim(), "var(--window-color1)");
+```
+
+Unapaswa kuipa `.fb4-window` `margin` ya `10%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4-window")?.margin, "10%");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+}
+--fcc-editable-region--
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992f.md
new file mode 100644
index 00000000000..589884722e7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e992f.md
@@ -0,0 +1,377 @@
+---
+id: 5d822fd413a79914d39e992f
+title: Hatua ya 102
+challengeType: 0
+dashedName: step-102
+---
+
+# --description--
+
+Madirisha yamewekwa juu ya kila moja kwenye jengo la zambarau la kulia. Geuza jengo liwe flexbox parent, na utumie sifa ya `flex-wrap` kuweka madirisha kando, na uyasukume chini hadi safu mlalo mpya wakati hayatoshei.
+
+# --hints--
+
+Unapaswa kuipa`.fb4b` `display` ya `flex`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4b")?.display, "flex");
+```
+
+Unapaswa kuipa `.fb4b` `flex-wrap` ya `wrap`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4b")?.flexWrap, "wrap");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+--fcc-editable-region--
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+}
+--fcc-editable-region--
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9930.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9930.md
new file mode 100644
index 00000000000..c15ebc8eb0c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9930.md
@@ -0,0 +1,381 @@
+---
+id: 5d822fd413a79914d39e9930
+title: Hatua ya 103
+challengeType: 0
+dashedName: step-103
+---
+
+# --description--
+
+Jengo hili litakuwa na pembetatu nyingine juu. Ipe sehemu ya juu `border-top` ya `5vh solid transparent`, na `border-left` ambayo ni `8vw`, `solid`, na hutumia kihifadhi cha rangi ya jengo kama rangi.
+
+# --hints--
+
+Unapaswa kuipa`.fb4a` `border-top` ya `5vh solid transparent`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4a")?.borderTop.trim(), "5vh solid transparent")
+```
+
+Unapaswa kuipa `.fb4a` `border-left` ya `8vw solid var(--building-color1)`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle(".fb4a")?.borderLeft.trim(), "8vw solid var(--building-color1)")
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9931.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9931.md
new file mode 100644
index 00000000000..a5b221340b5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9931.md
@@ -0,0 +1,404 @@
+---
+id: 5d822fd413a79914d39e9931
+title: Hatua ya 109
+challengeType: 0
+dashedName: step-109
+---
+
+# --description--
+
+Unaweza kuondoa `background-color` ya jengo hili sasa, kwa sababu haihitajiki.
+
+# --hints--
+
+Unapaswa kuondoa `background-color` kutoka kwa `.fb6`.
+
+```js
+assert.notMatch(code, /\.fb6\s*\{\s*[^}]*?background-color[^}]*?\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+--fcc-editable-region--
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9932.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9932.md
new file mode 100644
index 00000000000..7c5c9624a19
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9932.md
@@ -0,0 +1,396 @@
+---
+id: 5d822fd413a79914d39e9932
+title: Hatua ya 104
+challengeType: 0
+dashedName: step-104
+---
+
+# --description--
+
+Tuendelee kwenye jengo linalofuata! Ni ile ya kijani iliyo mbele. Ipe `repeating-linear-gradient` yenye rangi ya jengo lako kutoka `0%` hadi `5%`, na `transparent` kutoka `5%` hadi `10%`.
+
+# --hints--
+
+Unapaswa kuipa `.fb5` sifa ya `background`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle(".fb5")?.background);
+```
+
+Unapaswa kuipa `background` iwe `repeating-linear-gradient`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".fb5")?.background, "repeating-linear-gradient");
+```
+
+Unapaswa kuipa `repeating-linear-gradient` rangi ya kwanza ya `--building-color2` kutoka `0%` hadi `5%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb5")?.getPropVal('background', true), /repeating-linear-gradient\(var\(--building-color2\)(0%)?,var\(--building-color2\)5%/);
+```
+
+Unapaswa kuipa `repeating-linear-gradient` rangi ya pili ya `transparent` kutoka `5%` hadi `10%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb5")?.getPropVal('background', true), /repeating-linear-gradient\(var\(--building-color2\)(0%)?,var\(--building-color2\)5%,transparent5%,transparent10%\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+--fcc-editable-region--
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+}
+--fcc-editable-region--
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9933.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9933.md
new file mode 100644
index 00000000000..1184f8d6fb6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9933.md
@@ -0,0 +1,402 @@
+---
+id: 5d822fd413a79914d39e9933
+title: Hatua ya 105
+challengeType: 0
+dashedName: step-105
+---
+
+# --description--
+
+Ongeza `repeating-linear-gradient` nyingine chini ya ile uliyoongeza hivi punde. Ipe mwelekeo wa `90deg`, tumia rangi ya jengo lako kutoka `0%` hadi `12%` na rangi ya dirisha `12%` hadi `44%`. Hii itafanya rundo la madirisha ya mstatili.
+
+# --hints--
+
+Unapaswa kuipa `.fb5` `repeating-linear-gradient` ya pili katika sifa ya `background`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb5")?.getPropVal('background', true), /repeating-linear-gradient\(var\(--building-color2\)(0%)?,var\(--building-color2\)5%,transparent5%,transparent10%\),repeating-linear-gradient/);
+```
+
+Unapaswa kuipa `repeating-linear-gradient` ya pili mwelekeo wa `90deg`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb5")?.getPropVal('background', true), /repeating-linear-gradient\(var\(--building-color2\)(0%)?,var\(--building-color2\)5%,transparent5%,transparent10%\),repeating-linear-gradient\(90deg/);
+```
+
+Unapaswa kuipa `repeating-linear-gradient` ya pili rangi ya kwanza ya `--building-color2` kutoka `0%` hadi `12%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb5")?.getPropVal('background', true), /repeating-linear-gradient\(var\(--building-color2\)(0%)?,var\(--building-color2\)5%,transparent5%,transparent10%\),repeating-linear-gradient\(90deg,var\(--building-color2\)(0%)?,var\(--building-color2\)12%/);
+```
+
+Unapaswa kuipa `repeating-linear-gradient` ya pili rangi ya pili ya `--window-color2` kutoka `12%` hadi `44%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb5")?.getPropVal('background', true), /repeating-linear-gradient\(var\(--building-color2\)(0%)?,var\(--building-color2\)5%,transparent5%,transparent10%\),repeating-linear-gradient\(90deg,var\(--building-color2\)(0%)?,var\(--building-color2\)12%,var\(--window-color2\)12%,var\(--window-color2\)44%\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+--fcc-editable-region--
+.fb5 {
+ width: 10%;
+ height: 33%;
+ background-color: var(--building-color2);
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ )
+}
+--fcc-editable-region--
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9934.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9934.md
new file mode 100644
index 00000000000..c91a969220c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9934.md
@@ -0,0 +1,409 @@
+---
+id: 5d822fd413a79914d39e9934
+title: Hatua ya 107
+challengeType: 0
+dashedName: step-107
+---
+
+# --description--
+
+Hatimaye! Umefika kwenye jengo la mwisho! Ongeza repeating gradient kwa mwelekeo wa `90deg`. Tumia rangi ya jengo kutoka `0%` hadi `10%` na `transparent` kutoka `10%` hadi `30%`.
+
+# --hints--
+
+Unapaswa kuongeza `repeating-linear-gradient` kwa `.fb6` katika sifa ya`background`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".fb6")?.background, "repeating-linear-gradient");
+```
+
+Unapaswa kuipa `repeating-linear-gradient` mwelekeo wa `90deg`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".fb6")?.getPropVal('background', true), "repeating-linear-gradient(90deg");
+```
+
+Unapaswa kuipa `repeating-linear-gradient` rangi ya kwanza ya `--building-color3` kutoka `0%` hadi `10%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb6")?.getPropVal('background', true), /repeating-linear-gradient\(90deg,var\(--building-color3\)(0%)?,var\(--building-color3\)10%/);
+```
+
+Unapaswa kuipa `repeating-linear-gradient` rangi ya pili ya `transparent` kutoka `10%` hadi `30%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb6")?.getPropVal('background', true), /repeating-linear-gradient\(90deg,var\(--building-color3\)(0%)?,var\(--building-color3\)10%,transparent10%,transparent30%\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+--fcc-editable-region--
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+}
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9935.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9935.md
new file mode 100644
index 00000000000..e7f731bc81c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9935.md
@@ -0,0 +1,409 @@
+---
+id: 5d822fd413a79914d39e9935
+title: Hatua ya 108
+challengeType: 0
+dashedName: step-108
+---
+
+# --description--
+
+Ongeza repeating gradient nyingine kwenye jengo hili; ifanye sawa na ile uliyoongeza hivi punde, isipokuwa usiongeze mwelekeo wa `90deg` na utumie rangi ya dirisha lako badala ya rangi mbili za `transparent`.
+
+# --hints--
+
+Unapaswa kuipa `.fb6` `repeating-linear-gradient` ya pili katika sifa ya `background`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb6")?.getPropVal('background', true), /repeating-linear-gradient\(90deg,var\(--building-color3\)(0%)?,var\(--building-color3\)10%,transparent10%,transparent30%\),repeating-linear-gradient/);
+```
+
+Unapaswa kuipa `repeating-linear-gradient` ya pili rangi ya kwanza ya `--building-color3` kutoka `0%` hadi `10%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb6")?.getPropVal('background', true), /repeating-linear-gradient\(90deg,var\(--building-color3\)(0%)?,var\(--building-color3\)10%,transparent10%,transparent30%\),repeating-linear-gradient\(var\(--building-color3\)(0%)?,var\(--building-color3\)10%/);
+```
+
+Unapaswa kuipa `repeating-linear-gradient` ya pili rangi ya pili ya `--window-color3` kutoka `10%` hadi `30%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".fb6")?.getPropVal('background', true), /repeating-linear-gradient\(90deg,var\(--building-color3\)(0%)?,var\(--building-color3\)10%,transparent10%,transparent30%\),repeating-linear-gradient\(var\(--building-color3\)(0%)?,var\(--building-color3\)10%,var\(--window-color3\)10%,var\(--window-color3\)30%\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+--fcc-editable-region--
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background-color: var(--building-color3);
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ )
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9936.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9936.md
new file mode 100644
index 00000000000..7f512fda27d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9936.md
@@ -0,0 +1,402 @@
+---
+id: 5d822fd413a79914d39e9936
+title: Hatua ya 110
+challengeType: 0
+dashedName: step-110
+---
+
+# --description--
+
+Sasa, majengo yamekamilika. Rudi kwa kichaguzi cha `*` na uondoe `border` uliotumia kwa kila kitu mwanzoni na majengo yataunganishwa.
+
+# --hints--
+
+Unapaswa kuondoa `border` kutoka kwa `*`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle("*")?.border);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+--fcc-editable-region--
+* {
+ border: 1px solid black;
+ box-sizing: border-box;
+}
+--fcc-editable-region--
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9937.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9937.md
new file mode 100644
index 00000000000..d8b058c701a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9937.md
@@ -0,0 +1,403 @@
+---
+id: 5d822fd413a79914d39e9937
+title: Hatua ya 111
+challengeType: 0
+dashedName: step-111
+---
+
+# --description--
+
+Ongeza `sky` kama class ya pili kwenye kipengele cha `.background-buildings`. Utatengeneza mandharinyuma kwa ajili ya jengo.
+
+# --hints--
+
+Unapaswa kuongeza class ya `sky` kwenye `.background-buildings`.
+
+```js
+assert.exists(document.querySelector("div.background-buildings.sky"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9938.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9938.md
new file mode 100644
index 00000000000..445d49fc349
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9938.md
@@ -0,0 +1,421 @@
+---
+id: 5d822fd413a79914d39e9938
+title: Hatua ya 112
+challengeType: 0
+dashedName: step-112
+---
+
+# --description--
+
+Ipe class ya `sky` `radial-gradient`. Tumia `#ffcf33` kutoka `0%` hadi `20%`, `#ffff66` kwa `21%`, na `#bbeeff` kwa `100%`. Hii itaongeza upinde rangi wa mviringo kwenye usuli ambao utakuwa jua lako.
+
+# --hints--
+
+Unapaswa kuipa `.sky` `radial-gradient` katika sifa ya `background`.
+
+```js
+assert.include(new __helpers.CSSHelp(document).getStyle(".sky")?.background, "radial-gradient");
+```
+
+Unapaswa kuipa `radial-gradient` rangi ya kwanza ya `#ffcf33`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".sky")?.background, /radial-gradient\(rgb\(255, 207, 51\)( 0%)?, rgb\(255, 207, 51\) 20%/);
+```
+
+Unapaswa kuipa `radial-gradient` rangi ya pili ya `#ffff66` katika `21%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".sky")?.background, /radial-gradient\(rgb\(255, 207, 51\)( 0%)?, rgb\(255, 207, 51\) 20%, rgb\(255, 255, 102\) 21%/);
+```
+
+Unapaswa kuipa `radial-gradient` rangi ya tatu ya `#bbeeff` katika `100%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".sky")?.background, /radial-gradient\(rgb\(255, 207, 51\)( 0%)?, rgb\(255, 207, 51\) 20%, rgb\(255, 255, 102\) 21%, rgb\(187, 238, 255\) 100%\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9939.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9939.md
new file mode 100644
index 00000000000..fbec98f09e6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9939.md
@@ -0,0 +1,410 @@
+---
+id: 5d822fd413a79914d39e9939
+title: Hatua ya 113
+challengeType: 0
+dashedName: step-113
+---
+
+# --description--
+
+Juu ya orodha ya rangi ya gradient ya jengo, ambapo ungeweka mwelekeo wa gradient; ongeza `circle closest-corner at 15% 15%,`. Hii itasogeza mwanzo wa gradient hadi `15%` kutoka juu na kushoto. Itaifanya kuishia kwenye `closest-corner` na itadumisha umbo la `circle`. Haya ni baadhi ya maneno muhimu yaliyojengwa ndani ya gradient kuelezea jinsi inavyotenda.
+
+# --hints--
+
+Unapaswa kuipa `.sky` `radial-gradient` mwelekeo wa `circle closest-corner at 15% 15%`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".sky")?.background, /radial-gradient\(circle closest-corner at 15% 15%, rgb\(255, 207, 51\)|( 0%), rgb\(255, 207, 51\) 20%, rgb\(255, 255, 102\) 21%, rgb\(187, 238, 255\) 100%\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+--fcc-editable-region--
+.sky {
+ background: radial-gradient(
+ #ffcf33,
+ #ffcf33 20%,
+ #ffff66 21%,
+ #bbeeff 100%
+ );
+}
+--fcc-editable-region--
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993a.md
new file mode 100644
index 00000000000..705e1ea0499
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993a.md
@@ -0,0 +1,422 @@
+---
+id: 5d822fd413a79914d39e993a
+title: Hatua ya 114
+challengeType: 0
+dashedName: step-114
+---
+
+# --description--
+
+Media query inaweza kutumika kubadilisha mitindo kulingana na hali fulani, na inaonekana kama hii:
+
+```css
+@media (condition) {
+
+}
+```
+
+Ongeza media query tupu chini ya laha yako ya mitindo yenye sharti la `max-width: 1000px`. Mitindo iliyoongezwa hapa itaanza kutumika wakati ukubwa wa hati ni upana wa 1000px au chini ya hapo.
+
+# --hints--
+
+Unapaswa kuongeza media query tupu yenye `max-width: 1000px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getCSSRules("media")?.[0]?.media?.mediaText, '(max-width: 1000px)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+.sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ffcf33,
+ #ffcf33 20%,
+ #ffff66 21%,
+ #bbeeff 100%
+ );
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993b.md
new file mode 100644
index 00000000000..4cca7a31344
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993b.md
@@ -0,0 +1,424 @@
+---
+id: 5d822fd413a79914d39e993b
+title: Hatua ya 115
+challengeType: 0
+dashedName: step-115
+---
+
+# --description--
+
+Nakili na ubandike darasa lako lote la `sky` pamoja na sifa na thamani zake zote kwenye media query. Utatengeneza mpangilio mwingine wa rangi wa anga ambao huibadilisha kutoka mchana hadi usiku.
+
+Kumbuka: Utahitaji kusogeza kupita eneo linaloweza kuhaririwa ili kunakili darasa.
+
+# --hints--
+
+Hupaswi kufuta tamko lililopo la `.sky`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle(".sky")?.getPropVal('background', true), /radial-gradient\(circleclosest-cornerat15%15%,rgb\(255,207,51\)(0%)?,rgb\(255,207,51\)20%,rgb\(255,255,102\)21%,rgb\(187,238,255\)100%\)/);
+```
+
+Unapaswa kunakili tamko lililopo la `.sky` kwenye media query.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x => x.selectorText===".sky")?.style?.background, /radial-gradient\(\s*circle\s+closest-corner\s+at\s+15%\s+15%\s*,\s+rgb\(\s*255\s*,\s*207\s*,\s*51\s*\)\s*(0%)?\s*,\s*rgb\(\s*255\s*,\s*207\s*,\s*51\s*\)\s+20%\s*,\s*rgb\(\s*255\s*,\s*255\s*,\s*102\s*\)\s+21%\s*,\s*rgb\(\s*187\s*,\s*238\s*,\s*255\s*\)\s+100%\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+.sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ffcf33,
+ #ffcf33 20%,
+ #ffff66 21%,
+ #bbeeff 100%
+ );
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+--fcc-editable-region--
+@media (max-width: 1000px) {
+
+}
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993c.md
new file mode 100644
index 00000000000..5455e3a719d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993c.md
@@ -0,0 +1,437 @@
+---
+id: 5d822fd413a79914d39e993c
+title: Hatua ya 116
+challengeType: 0
+dashedName: step-116
+---
+
+# --description--
+
+Katika class ya media query ya `sky`, badilisha thamani mbili za rangi `#ffcf33` kuwa `#ccc`, `#ffff66` kuwa `#445`, na `#bbeeff` kuwa `#223`. Kisha unaweza kubadilisha ukubwa wa dirisha lako ili kuona mabadiliko ya rangi ya mandharinyuma.
+
+# --hints--
+
+Unapaswa kubadilisha thamani za rangi za kwanza kutoka `#ffcf33` hadi `#ccc`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x => x.selectorText===".sky")?.style?.background, /radial-gradient\(\s*circle\s+closest-corner\s+at\s+15%\s+15%\s*,\s+rgb\(\s*204\s*,\s*204\s*,\s*204\s*\)\s*(0%)?\s*,\s*rgb\(\s*204\s*,\s*204\s*,\s*204\s*\)\s+20%/);
+```
+
+Unapaswa kubadilisha thamani za rangi ya pili kutoka `#ffff66` hadi `#445`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x => x.selectorText===".sky")?.style?.background, /radial-gradient\(\s*circle\s+closest-corner\s+at\s+15%\s+15%\s*,\s+rgb\(\s*204\s*,\s*204\s*,\s*204\s*\)\s*(0%)?\s*,\s*rgb\(\s*204\s*,\s*204\s*,\s*204\s*\)\s+20%\s*,\s*rgb\(\s*68\s*,\s*68\s*,\s*85\s*\)\s+21%/);
+```
+
+Unapaswa kubadilisha thamani za rangi ya tatu kutoka `#bbeeff` hadi `#223`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x => x.selectorText===".sky")?.style?.background, /radial-gradient\(\s*circle\s+closest-corner\s+at\s+15%\s+15%\s*,\s+rgb\(\s*204\s*,\s*204\s*,\s*204\s*\)\s*(0%)?\s*,\s*rgb\(\s*204\s*,\s*204\s*,\s*204\s*\)\s+20%\s*,\s*rgb\(\s*68\s*,\s*68\s*,\s*85\s*\)\s+21%\s*,\s*rgb\(\s*34\s*,\s*34\s*,\s*51\s*\)\s+100%\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+.sky {
+ background: radial-gradient(
+closest-corner circle at 15% 15%,
+#ffcf33,
+#ffcf33 20%,
+#ffff66 21%,
+#bbeeff 100%
+ );
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+var(--building-color1) 50%,
+var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+var(--building-color1),
+var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+var(--building-color2),
+var(--building-color2) 6%,
+var(--window-color2) 6%,
+var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+90deg,
+var(--building-color3),
+var(--building-color3),
+var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+90deg,
+var(--building-color4),
+var(--building-color4) 10%,
+transparent 10%,
+transparent 15%
+ ),
+ repeating-linear-gradient(
+var(--building-color4),
+var(--building-color4) 10%,
+var(--window-color4) 10%,
+var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+var(--building-color2),
+var(--building-color2) 5%,
+transparent 5%,
+transparent 10%
+ ),
+ repeating-linear-gradient(
+90deg,
+var(--building-color2),
+var(--building-color2) 12%,
+var(--window-color2) 12%,
+var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+90deg,
+var(--building-color3),
+var(--building-color3) 10%,
+transparent 10%,
+transparent 30%
+ ),
+ repeating-linear-gradient(
+var(--building-color3),
+var(--building-color3) 10%,
+var(--window-color3) 10%,
+var(--window-color3) 30%
+ );
+}
+
+@media (max-width: 1000px) {
+--fcc-editable-region--
+ .sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ffcf33,
+ #ffcf33 20%,
+ #ffff66 21%,
+ #bbeeff 100%
+);
+ }
+--fcc-editable-region--
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993d.md
new file mode 100644
index 00000000000..32589e755e5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993d.md
@@ -0,0 +1,450 @@
+---
+id: 5d822fd413a79914d39e993d
+title: Hatua ya 117
+challengeType: 0
+dashedName: step-117
+---
+
+# --description--
+
+Ongeza kichaguzi cha `:root` juu ya hoja media query. Kisha fafanua upya vihifadhivyote vinne vya `--building-color` ili kutumia thamani `#000` hapo.
+
+# --hints--
+
+Unapaswa kuongeza kichaguzi cha `:root` kwenye media query.
+
+```js
+assert.notDeepEqual(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root"), undefined);
+```
+
+Unapaswa kuongeza `--building-color1` yenye thamani ya `#000`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root")?.style?.getPropertyValue("--building-color1")?.trim(), "#000");
+```
+
+Unapaswa kuongeza `--building-color2` yenye thamani ya `#000`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root")?.style?.getPropertyValue("--building-color2")?.trim(), "#000");
+```
+
+Unapaswa kuongeza `--building-color3` yenye thamani ya `#000`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root")?.style?.getPropertyValue("--building-color3")?.trim(), "#000");
+```
+
+Unapaswa kuongeza `--building-color4` yenye thamani ya `#000`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root")?.style?.getPropertyValue("--building-color4")?.trim(), "#000");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+.sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ffcf33,
+ #ffcf33 20%,
+ #ffff66 21%,
+ #bbeeff 100%
+ );
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+
+@media (max-width: 1000px) {
+--fcc-editable-region--
+
+--fcc-editable-region--
+ .sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ccc,
+ #ccc 20%,
+ #445 21%,
+ #223 100%
+ );
+ }
+}
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993e.md
new file mode 100644
index 00000000000..44b52505345
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e993e.md
@@ -0,0 +1,862 @@
+---
+id: 5d822fd413a79914d39e993e
+title: Hatua ya 118
+challengeType: 0
+dashedName: step-118
+---
+
+# --description--
+
+Hatimaye, katika kichaguzi cha `:root` cha media query, fafanua upya vihifadhi vyote vinne vya `--window-color` ili kutumia `#777`. Ukimaliza, rekebisha ukubwa wa dirisha na uitazame kutoka mchana hadi usiku.
+
+Vihifadhi hutumiwa kimsingi na rangi, na ndivyo ulivyotumia hapa. Lakini zinaweza kupewa thamani yoyote na kutumika kwenye sifa zozote. Mradi wako unaonekana mzuri!
+
+# --hints--
+
+Unapaswa kuongeza `--window-color1` yenye thamani ya `#777`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root")?.style?.getPropertyValue("--window-color1")?.trim(), "#777");
+```
+
+Unapaswa kuongeza `--window-color2` yenye thamani ya `#777`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root")?.style?.getPropertyValue("--window-color2")?.trim(), "#777");
+```
+
+Unapaswa kuongeza `--window-color3` yenye thamani ya `#777`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root")?.style?.getPropertyValue("--window-color3")?.trim(), "#777");
+```
+
+Unapaswa kuongeza `--window-color4` yenye thamani ya `#777`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia("(max-width: 1000px)")?.find(x=>x.selectorText === ":root")?.style?.getPropertyValue("--window-color4")?.trim(), "#777");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+.sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ffcf33,
+ #ffcf33 20%,
+ #ffff66 21%,
+ #bbeeff 100%
+ );
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+
+@media (max-width: 1000px) {
+--fcc-editable-region--
+ :root {
+ --building-color1: #000;
+ --building-color2: #000;
+ --building-color3: #000;
+ --building-color4: #000;
+ }
+--fcc-editable-region--
+ .sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ccc,
+ #ccc 20%,
+ #445 21%,
+ #223 100%
+ );
+ }
+}
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
City Skyline
+
+
+
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --building-color1: #aa80ff;
+ --building-color2: #66cc99;
+ --building-color3: #cc6699;
+ --building-color4: #538cc6;
+ --window-color1: #bb99ff;
+ --window-color2: #8cd9b3;
+ --window-color3: #d98cb3;
+ --window-color4: #8cb3d9;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ margin: 0;
+ overflow: hidden;
+}
+
+.background-buildings, .foreground-buildings {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-evenly;
+ position: absolute;
+ top: 0;
+}
+
+.building-wrap {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.window-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+}
+
+.sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ffcf33,
+ #ffcf33 20%,
+ #ffff66 21%,
+ #bbeeff 100%
+ );
+}
+
+/* BACKGROUND BUILDINGS - "bb" stands for "background building" */
+.bb1 {
+ width: 10%;
+ height: 70%;
+}
+
+.bb1a {
+ width: 70%;
+}
+
+.bb1b {
+ width: 80%;
+}
+
+.bb1c {
+ width: 90%;
+}
+
+.bb1d {
+ width: 100%;
+ height: 70%;
+ background: linear-gradient(
+ var(--building-color1) 50%,
+ var(--window-color1)
+ );
+}
+
+.bb1-window {
+ height: 10%;
+ background: linear-gradient(
+ var(--building-color1),
+ var(--window-color1)
+ );
+}
+
+.bb2 {
+ width: 10%;
+ height: 50%;
+}
+
+.bb2a {
+ border-bottom: 5vh solid var(--building-color2);
+ border-left: 5vw solid transparent;
+ border-right: 5vw solid transparent;
+}
+
+.bb2b {
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 6%,
+ var(--window-color2) 6%,
+ var(--window-color2) 9%
+ );
+}
+
+.bb3 {
+ width: 10%;
+ height: 55%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3),
+ var(--window-color3) 15%
+ );
+}
+
+.bb4 {
+ width: 11%;
+ height: 58%;
+}
+
+.bb4a {
+ width: 3%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.bb4b {
+ width: 80%;
+ height: 5%;
+ background-color: var(--building-color4);
+}
+
+.bb4c {
+ width: 100%;
+ height: 85%;
+ background-color: var(--building-color4);
+}
+
+.bb4-window {
+ width: 18%;
+ height: 90%;
+ background-color: var(--window-color4);
+}
+
+/* FOREGROUND BUILDINGS - "fb" stands for "foreground building" */
+.fb1 {
+ width: 10%;
+ height: 60%;
+}
+
+.fb1a {
+ border-bottom: 7vh solid var(--building-color4);
+ border-left: 2vw solid transparent;
+ border-right: 2vw solid transparent;
+}
+
+.fb1b {
+ width: 60%;
+ height: 10%;
+ background-color: var(--building-color4);
+}
+
+.fb1c {
+ width: 100%;
+ height: 80%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color4),
+ var(--building-color4) 10%,
+ transparent 10%,
+ transparent 15%
+ ),
+ repeating-linear-gradient(
+ var(--building-color4),
+ var(--building-color4) 10%,
+ var(--window-color4) 10%,
+ var(--window-color4) 90%
+ );
+}
+
+.fb2 {
+ width: 10%;
+ height: 40%;
+}
+
+.fb2a {
+ width: 100%;
+ border-bottom: 10vh solid var(--building-color3);
+ border-left: 1vw solid transparent;
+ border-right: 1vw solid transparent;
+}
+
+.fb2b {
+ width: 100%;
+ height: 75%;
+ background-color: var(--building-color3);
+}
+
+.fb2-window {
+ width: 22%;
+ height: 100%;
+ background-color: var(--window-color3);
+}
+
+.fb3 {
+ width: 10%;
+ height: 35%;
+}
+
+.fb3a {
+ width: 80%;
+ height: 15%;
+ background-color: var(--building-color1);
+}
+
+.fb3b {
+ width: 100%;
+ height: 35%;
+ background-color: var(--building-color1);
+}
+
+.fb3-window {
+ width: 25%;
+ height: 80%;
+ background-color: var(--window-color1);
+}
+
+.fb4 {
+ width: 8%;
+ height: 45%;
+ position: relative;
+ left: 10%;
+}
+
+.fb4a {
+ border-top: 5vh solid transparent;
+ border-left: 8vw solid var(--building-color1);
+}
+
+.fb4b {
+ width: 100%;
+ height: 89%;
+ background-color: var(--building-color1);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.fb4-window {
+ width: 30%;
+ height: 10%;
+ border-radius: 50%;
+ background-color: var(--window-color1);
+ margin: 10%;
+}
+
+.fb5 {
+ width: 10%;
+ height: 33%;
+ position: relative;
+ right: 10%;
+ background: repeating-linear-gradient(
+ var(--building-color2),
+ var(--building-color2) 5%,
+ transparent 5%,
+ transparent 10%
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ var(--building-color2),
+ var(--building-color2) 12%,
+ var(--window-color2) 12%,
+ var(--window-color2) 44%
+ );
+}
+
+.fb6 {
+ width: 9%;
+ height: 38%;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--building-color3),
+ var(--building-color3) 10%,
+ transparent 10%,
+ transparent 30%
+ ),
+ repeating-linear-gradient(
+ var(--building-color3),
+ var(--building-color3) 10%,
+ var(--window-color3) 10%,
+ var(--window-color3) 30%
+ );
+}
+
+@media (max-width: 1000px) {
+ :root {
+ --building-color1: #000;
+ --building-color2: #000;
+ --building-color3: #000;
+ --building-color4: #000;
+ --window-color1: #777;
+ --window-color2: #777;
+ --window-color3: #777;
+ --window-color4: #777;
+ }
+ .sky {
+ background: radial-gradient(
+ closest-corner circle at 15% 15%,
+ #ccc,
+ #ccc 20%,
+ #445 21%,
+ #223 100%
+ );
+ }
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc174fcf86c76b9248c6eb2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc174fcf86c76b9248c6eb2.md
new file mode 100644
index 00000000000..e986584005c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc174fcf86c76b9248c6eb2.md
@@ -0,0 +1,71 @@
+---
+id: 5dc174fcf86c76b9248c6eb2
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Vipengele vya HTML vina tagi za ufunguzi kama `
` na tagi za kufunga kama ` `.
+
+Maandishi ya kipengele huenda kati ya tagi zake za kufungua na kufunga.
+
+Tafuta kipengele cha `h1` na ubadilishe maandishi yake kuwa:
+
+`CatPhotoApp`
+
+# --hints--
+
+Maandishi `CatPhotoApp` yanapaswa kuwepo kwenye msimbo. Huenda ukahitaji kuangalia tahajia yako.
+
+```js
+assert(code.match(/catphotoapp/i));
+```
+
+Kipengele chako cha `h1` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: `
`.
+
+```js
+assert(document.querySelector('h1'));
+```
+
+Kipengele chako cha `h1` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/h1\>/));
+```
+
+Una zaidi ya kipengele kimoja cha `h1`. Ondoa kipengele cha ziada cha `h1`.
+
+```js
+assert(document.querySelectorAll('h1').length === 1);
+```
+
+Maandishi ya kipengele cha `h1` yanapaswa kuwa `CatPhotoApp`. Aidha umeacha maandishi, umeandika makosa, au haiko kati ya tagi za kufungua na kufunga za kipengele cha `h1`.
+
+```js
+assert(document.querySelector('h1').innerText.toLowerCase() === 'catphotoapp');
+```
+
+Inaonekana unatumia kiendelezi cha kivinjari ambacho kinarekebisha ukurasa. Hakikisha umezima viendelezi vyote vya kivinjari.
+
+```js
+assert.isAtMost(document.querySelectorAll('script').length, 2);
+assert.equal(document.querySelectorAll('style').length, 0);
+assert.equal(document.querySelectorAll('link').length, 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+--fcc-editable-region--
+ Hello World
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc1798ff86c76b9248c6eb3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc1798ff86c76b9248c6eb3.md
new file mode 100644
index 00000000000..0037444d653
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc1798ff86c76b9248c6eb3.md
@@ -0,0 +1,85 @@
+---
+id: 5dc1798ff86c76b9248c6eb3
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Vipengee vya vichwa vya `h1` kupitia `h6` hutumika kuashiria umuhimu wa maudhui yaliyo chini yao. Kadiri nambari inavyopungua ndivyo umuhimu unavyoongezeka, kwa hivyo vipengele vya `h2` vina umuhimu mdogo kuliko vipengee vya `h1`. Tumia kipengele kimoja cha `h1` pekee kwa kila ukurasa na uweke vichwa vya umuhimu wa chini chini ya vichwa vya umuhimu wa juu.
+
+Chini ya kipengele cha `h1`, ongeza kipengele cha `h2` na maandishi haya:
+
+`Cat Photos`
+
+# --hints--
+
+Kipengele chako cha `h1` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('h1'));
+```
+
+Kipengele chako cha `h1` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/h1\>/));
+```
+
+Unapaswa kuwa na kipengele kimoja cha `h1` tu. Ondoa ziada yoyote.
+
+```js
+assert(
+ document.querySelector('h1') && document.querySelectorAll('h1').length === 1
+);
+```
+
+Maandishi ya kipengele cha `h1` yanapaswa kuwa 'CatPhotoApp'. Aidha umesahau maandishi, au kuna makosa ya herufi.
+
+```js
+assert(document.querySelector('h1').innerText.toLowerCase() === 'catphotoapp');
+```
+
+Kipengele chako cha `h2` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('h2'));
+```
+
+Kipengele chako cha `h2` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/h2\>/));
+```
+
+Maandishi ya kipengele cha `h2` yanapaswa kuwa 'Cat Photos'. Weka maandishi ya `Cat Photos` pekee kati ya tagi za kufungua na kufunga za`h2`.
+
+```js
+assert(document.querySelector('h2').innerText.toLowerCase() === 'cat photos');
+```
+
+Kipengele chako cha `h2` kinapaswa kuwa chini ya kipengele cha `h1`. Kipengele cha `h1` kina umuhimu mkubwa na lazima kiwe juu ya kipengele cha `h2`.
+
+```js
+const collection = [...document.querySelectorAll('h1,h2')].map(
+ (node) => node.nodeName
+);
+assert(collection.indexOf('H1') < collection.indexOf('H2'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+--fcc-editable-region--
+ CatPhotoApp
+
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc17d3bf86c76b9248c6eb4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc17d3bf86c76b9248c6eb4.md
new file mode 100644
index 00000000000..54ec4098fd5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc17d3bf86c76b9248c6eb4.md
@@ -0,0 +1,61 @@
+---
+id: 5dc17d3bf86c76b9248c6eb4
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Kipengele cha `p` kinatumika kuunda aya ya maandishi kwenye tovuti. Unda kipengele cha `p` chini ya kipengele chako cha `h2` na ukipe maandishi yafuatayo:
+
+`See more cat photos in our gallery.`
+
+# --hints--
+
+Kipengele chako cha `p` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('p'));
+```
+
+Kipengele chako cha `p` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/p\>/));
+```
+
+Maandishi ya kipengele chako cha `p` yanapaswa kuwa `See more cat photos in our gallery.` Aidha umesahau maandishi, au kuna makosa ya herufi.
+
+```js
+const extraSpacesRemoved = document
+ .querySelector('p')
+ .innerText.replace(/\s+/g, ' ');
+assert(extraSpacesRemoved.match(/see more cat photos in our gallery\.?$/i));
+```
+
+Kipengele chako cha `p` kinapaswa kuwa chini ya kipengele chako cha `h2`. Unazo katika mpangilio mbaya.
+
+```js
+const collection = [...document.querySelectorAll('h2,p')].map(
+ (node) => node.nodeName
+);
+assert(collection.indexOf('H2') < collection.indexOf('P'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+ CatPhotoApp
+--fcc-editable-region--
+ Cat Photos
+
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc17dc8f86c76b9248c6eb5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc17dc8f86c76b9248c6eb5.md
new file mode 100644
index 00000000000..3973ff761c6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc17dc8f86c76b9248c6eb5.md
@@ -0,0 +1,72 @@
+---
+id: 5dc17dc8f86c76b9248c6eb5
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Kutoa maoni hukuruhusu kuacha ujumbe bila kuathiri onyesho la kivinjari. Pia hukuruhusu kufanya msimbo kutofanya kazi. Maoni katika HTML huanza na ``. Kwa mfano, maoni `` yana maandishi `TODO: Remove h1`.
+
+Ongeza maoni juu ya kipengele cha `p` na maandishi haya:
+
+`TODO: Add link to cat photos`
+
+# --hints--
+
+Maoni yako yanapaswa kuanza na ``. Unakosa herufi moja au zaidi zinazofafanua mwisho wa maoni.
+
+```js
+assert(code.match(/-->/));
+```
+
+Msibo wako haupaswi kuwa na vibambo vya ziada vya kufungua/kufunga maoni. Una `` ya ziada inayoonyeshwa kwenye kivinjari.
+
+```js
+const noSpaces = code.replace(/\s/g, '');
+assert(noSpaces.match(//g).length < 2);
+```
+
+Maoni yako yanapaswa kuwa na maandishi `TODO: Add link to cat photos`.
+
+```js
+assert(code.match(//i));
+```
+
+Maoni yako yanapaswa kuwa juu ya kipengele cha `p`. Unazo katika mpangilio mbaya.
+
+```js
+assert(
+ code
+ .replace(/\s/g, '')
+ .match(
+ /seemorecatphotosinourgallery\.?<\/p>/i
+ )
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+ CatPhotoApp
+ Cat Photos
+--fcc-editable-region--
+
+ See more cat photos in our gallery.
+
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc2385ff86c76b9248c6eb7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc2385ff86c76b9248c6eb7.md
new file mode 100644
index 00000000000..74ed666d136
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc2385ff86c76b9248c6eb7.md
@@ -0,0 +1,73 @@
+---
+id: 5dc2385ff86c76b9248c6eb7
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+HTML5 ina baadhi ya vipengele vinavyotambulisha maeneo tofauti ya maudhui. Vipengele hivi hurahisisha kusoma HTML yako na kusaidia kwa Uboreshaji wa Injini ya Utafutaji (SEO) na ufikivu.
+
+Tambua sehemu kuu ya ukurasa huu kwa kuongeza tagi ya ufunguzi ya `` kabla ya kipengele cha `h1`, natagi ya kufunga ya ` ` baada ya kipengele cha `p`.
+
+# --hints--
+
+Kipengee chako cha `main` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('main'));
+```
+
+Kipengele chako cha `main` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/main\>/));
+```
+
+Tagi ya ufunguzi ya kipengele chako cha `main` inapaswa kuwa chini ya tagi ya ufunguzi ya kipengele cha `body`. Unazo katika mpangilio mbaya.
+
+```js
+const main = document.querySelector('main');
+assert.equal(main?.previousElementSibling, null);
+```
+
+Tagi ya ufunguzi ya kipengele chako cha `main` inapaswa kuwa juu ya kipengele cha `h1`. Unazo katika mpangilio mbaya.
+
+```js
+const collection = [...document.querySelectorAll('main,h1')].map(
+ (node) => node.nodeName
+);
+assert(collection.indexOf('MAIN') < collection.indexOf('H1'));
+```
+
+Tagi ya kufunga ya kipengele chako cha `main` inapaswa kuwa chini ya kipengele cha `p`. Unazo katika mpangilio mbaya.
+
+```js
+const mainNode = document.querySelector('main');
+const pNode = document.querySelector('p');
+assert(
+ mainNode.contains(pNode) &&
+ pNode.textContent.toLowerCase().match(/see more cat photos in our gallery/)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+--fcc-editable-region--
+
+ CatPhotoApp
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc23991f86c76b9248c6eb8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc23991f86c76b9248c6eb8.md
new file mode 100644
index 00000000000..5a980944b6a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc23991f86c76b9248c6eb8.md
@@ -0,0 +1,103 @@
+---
+id: 5dc23991f86c76b9248c6eb8
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Katika hatua iliyotangulia, unaweka vipengele vya `h1`, `h2`, maoni na `p` ndani ya kipengele cha `main`. Hii inaitwa *nesting*. Vipengee vilivyokua nested vinapaswa kuwekwa nafasi mbili zaidi upande wa kulia wa kipengee ambacho kimewekwa ndani. Nafasi hii inaitwa indentation na inatumika kurahisisha kusoma HTML.
+
+Kipengele cha `h1`, kipengele cha `h2` na maoni yamejiingiza katika nafasi mbili zaidi ya kipengele cha `main` katika msimbo ulio hapa chini. Tumia upau wa nafasi (spacebar) kwenye kibodi yako ili kuongeza nafasi mbili zaidi mbele ya kipengele cha `p` ili kiwe vizuri pia.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha `h2` chenye maandishi `Cat Photos`. Huenda umeifuta kwa bahati mbaya, inakosa tagi za kufungua na kufunga, au maandishi yamebadilika.
+
+```js
+assert(
+ document.querySelector('h2') &&
+ code.match(/<\/h2\>/) &&
+ document.querySelector('h2').innerText.toLowerCase() === 'cat photos'
+);
+```
+
+Haupaswi kuongeza vipengele vya `ul` au `li` kutoka kwa mfano.
+
+```js
+assert(
+ !document.querySelector('ul') && !document.querySelector('li')
+);
+```
+
+Hupaswi kubadilisha identation kwenye mstari kwa kipengele chako cha `h2`. Tagi yake ya ufunguzi inapaswa kuanza nafasi 6 kutoka mwanzo wa mstari. Unaweza kuanzisha upya hatua ili kurejesha indentation ya asili.
+
+```js
+assert(code.toLowerCase().match(/<\/h1\>\s*\n\s{6}/));
+```
+
+Msimbo wako unapaswa kuwa na maoni. Uliondoa maoni kutoka hatua ya awali.
+
+```js
+assert(code.match(//));
+```
+
+Maoni yako yanapaswa kuwa na maandishi `TODO: Add link to cat photos`. Usibadilishe maandishi au nafasi ya maoni.
+
+```js
+assert(code.match(//i));
+```
+
+Haupaswi kubadilisha indentation kwenye mstari na kipengele chako cha maoni. Tagi yake ya ufunguzi inapaswa kuanza nafasi 6 kutoka mwanzo wa mstari. Unaweza kuanzisha upya hatua ili kurejesha indentation ya asili.
+
+```js
+assert(
+ code
+ .toLowerCase()
+ .match(/<\/h2>\s*\n\s{6}/)
+);
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `p`. Umeondoa kipengele cha `p` kutoka hatua ya awali.
+
+```js
+assert(document.querySelector('p'));
+```
+
+Maandishi ya kipengele cha `p` yanapaswa kuwa `See more cat photos in our gallery.` Usibadilishe maandishi, nafasi, au uakifishaji wa kipengele cha `p`.
+
+```js
+assert(
+ document
+ .querySelector('p')
+ .innerText.toLowerCase()
+ .match(/see\s+more\s+cat\s+photos\s+in\s+our\s+gallery\.?$/)
+);
+```
+
+Tagi ya kufungua ya `p` inapaswa kuwa na indentation inayolingana na `h2` yako na vipengele vya maoni. Tagi yake ya ufunguzi inapaswa kuanza nafasi 6 kutoka mwanzo wa mstari.
+
+```js
+assert(code.toLowerCase().match(/-->\s*\n\s{6} /));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+ --fcc-editable-region--
+
+ CatPhotoApp
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc23f9bf86c76b9248c6eba.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc23f9bf86c76b9248c6eba.md
new file mode 100644
index 00000000000..cee065c90d0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc23f9bf86c76b9248c6eba.md
@@ -0,0 +1,62 @@
+---
+id: 5dc23f9bf86c76b9248c6eba
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Unaweza kuongeza picha kwenye tovuti yako kwa kutumia kipengele cha `img`. Vipengele vya `img` vina tagi inayofungua bila tagi ya kufunga. Tagi ya kipengele bila tagi ya kufunga inajulikana kama self-closing tag .
+
+Ongeza kipengele cha `img` chini ya kipengele cha `p`. Katika hatua hii, hakuna picha itaonyeshwa kwenye kivinjari.
+
+# --hints--
+
+Kipengele chako cha `img` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('img'));
+```
+
+Kipengele chako cha `img` hakipaswi kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(!code.match(/<\/img\>/));
+```
+
+Unapaswa kuwa na kipengele kimoja tu cha `img`. Ondoa ziada yoyote.
+
+```js
+assert(document.querySelectorAll('img').length === 1);
+```
+
+Kipengele chako cha `img` kinapaswa kuwa chini ya kipengele cha `p`. Unazo katika mpangilio mbaya.
+
+```js
+const collection = [...document.querySelectorAll('p,img')].map(
+ (node) => node.nodeName
+);
+assert(collection.indexOf('P') < collection.indexOf('IMG'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+ Cat Photos
+
+--fcc-editable-region--
+ See more cat photos in our gallery.
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24073f86c76b9248c6ebb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24073f86c76b9248c6ebb.md
new file mode 100644
index 00000000000..b0b23b8e7f5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24073f86c76b9248c6ebb.md
@@ -0,0 +1,67 @@
+---
+id: 5dc24073f86c76b9248c6ebb
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+HTML attributes ni maneno maalum yanayotumika ndani ya tagi ya ufunguzi wa kipengele ili kudhibiti tabia ya kipengele. Sifa ya `src` katika kipengele cha `img` inabainisha URL ya picha (ambapo picha iko).
+
+Huu hapa ni mfano wa kipengele cha `img` chenye sifa ya `src` inayoelekeza kwenye nembo ya freeCodeCamp:
+
+```html
+
+```
+
+Ndani ya kipengele cha `img` kilichopo, ongeza sifa ya `src` na URL hii:
+
+`https://cdn.freecodecamp.org/curriculum/cat-photo-app/relaxing-cat.jpg`
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha `img`. Huenda umeondoa kipengele cha `img` au hujazingira sifa ya `src` kwa nukuu.
+
+```js
+assert(document.querySelector('img'));
+```
+
+Kipengele chako cha `img` kinafaa kuwa na sifa ya `src`. Aidha umesahau sifa au umeandika makosa. Hakikisha kuna nafasi kati ya jina la kipengele na jina la sifa.
+
+```js
+assert(document.querySelector('img').src);
+```
+
+Kipengele cha `img` cha sifa yako ya `src` inapaswa kuwekwa kuwa '`https://cdn.freecodecamp.org/curriculum/cat-photo-app/relaxing-cat.jpg`'. Aidha umesahau URL au umeandika makosa. Kesi ya URL ni muhimu.
+
+```js
+assert(document.querySelector('img').src === 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/relaxing-cat.jpg');
+```
+
+Ingawa umeweka kipengele `img` cha `src` kwa URL sahihi, inashauriwa kuzunguka thamani ya sifa kila wakati kwa alama za nukuu.
+
+```js
+assert(!/\
+
+
+ CatPhotoApp
+ Cat Photos
+
+ See more cat photos in our gallery.
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24165f86c76b9248c6ebc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24165f86c76b9248c6ebc.md
new file mode 100644
index 00000000000..56aaad9c7f3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24165f86c76b9248c6ebc.md
@@ -0,0 +1,59 @@
+---
+id: 5dc24165f86c76b9248c6ebc
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Vipengele vyote vya `img` vinapaswa kuwa na sifa ya `alt`. Maandishi ya sifa ya `alt` hutumika kwa visoma skrini ili kuboresha ufikivu na huonyeshwa picha ikishindwa kupakiwa. Kwa mfano, ` ` ina sifa ya `alt` yenye maandishi `A cat`.
+
+Ndani ya kipengele cha `img`, ongeza sifa ya `alt` yenye maandishi haya:
+
+`A cute orange cat lying on its back`
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha `img`. Uliondoa kipengele cha `img` kutoka hatua ya awali.
+
+```js
+assert(document.querySelector('img'));
+```
+
+Kipengele chako cha `img` hakina sifa ya `alt`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert(document.querySelector('img').hasAttribute('alt'));
+```
+
+Thamani ya sifa ya kipengele cha `img` ya `alt` imewekwa kuwa kitu kingine isipokuwa 'A cute orange cat lying on its back'. Hakikisha kuwa thamani ya sifa ya `alt` imezungukwa na alama za nukuu.
+
+```js
+const altText = document
+ .querySelector('img')
+ .alt.toLowerCase()
+ .replace(/\s+/g, ' ');
+assert(altText.match(/A cute orange cat lying on its back\.?$/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+ Cat Photos
+
+ See more cat photos in our gallery.
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24614f86c76b9248c6ebd.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24614f86c76b9248c6ebd.md
new file mode 100644
index 00000000000..baa7ac7f081
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24614f86c76b9248c6ebd.md
@@ -0,0 +1,80 @@
+---
+id: 5dc24614f86c76b9248c6ebd
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Unaweza kuunganisha kwa ukurasa mwingine na kipengele cha nanga (anchor) (`a`). Kwa mfano, ` ` ingeunganisha kwa `freecodecamp.org`.
+
+Ongeza kipengele cha nanga baada ya aya inayounganishwa na `https://freecatphotoapp.com`. Kwa hatua hii, kiungo hakitaonekana katika onyesho la kukagua.
+
+# --hints--
+
+Kipengele chako cha nanga (`a`) kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelector('a'));
+```
+
+Kipengele chako cha nanga (`a`) kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/a\>/));
+```
+
+Kipengele chako cha nanga (`a`) kinapaswa kuwa chini ya kipengele cha `p`. Unazo katika mpangilio mbaya.
+
+```js
+const collection = [...document.querySelectorAll('a, p')].map(
+ (node) => node.nodeName
+);
+assert(collection.indexOf('P') < collection.indexOf('A'));
+```
+
+Kipengele chako cha nanga (`a`) hakina sifa ya `href`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert(document.querySelector('a').hasAttribute('href'));
+```
+
+Kipengele chako cha nanga (`a`) kinapaswa kuunganishwa na `https://freecatphotoapp.com`. Aidha umesahau URL au umeandika makosa.
+
+```js
+assert(
+ document.querySelector('a').getAttribute('href') ===
+ 'https://freecatphotoapp.com'
+);
+```
+
+Ingawa umeweka sifa ya kipengele cha nanga ('a') cha `href` kwa kiungo sahihi, inashauriwa kuzunguka thamani ya sifa kila wakati kwa alama za nukuu.
+
+```js
+assert(
+ !/\
+
+
+ CatPhotoApp
+ Cat Photos
+
+--fcc-editable-region--
+ See more cat photos in our gallery.
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ddbd81294d8ddc1510a8e56.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ddbd81294d8ddc1510a8e56.md
new file mode 100644
index 00000000000..24818f0fa99
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ddbd81294d8ddc1510a8e56.md
@@ -0,0 +1,57 @@
+---
+id: 5ddbd81294d8ddc1510a8e56
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Maandishi ya kiungo lazima yawekwe kati ya vitambulisho vya kufungua na kufunga vya kipengele cha nanga (`a`). Kwa mfano, ` click here to go to freeCodeCamp.org ` ni kiungo chenye maandishi `click here to go to freeCodeCamp.org`.
+
+Ongeza maandishi ya nanga `link to cat pictures` kwa kipengele cha nanga. Haya yatakuwa maandishi ya kiungo.
+
+# --hints--
+
+Kipengele chako cha nanga (`a`) kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelector('a'));
+```
+
+Kipengele chako cha nanga (`a`) kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/a\>/));
+```
+
+Maandishi ya kipengele chako (`a`) yanafaa kuwa `link to cat pictures`. Hakikisha umeweka maandishi ya kiunganishi kati ya tagi ya ufunguzi ya kipengele (`a`) na tagi ya kufunga.
+
+```js
+assert(
+ document.querySelector('a').innerText.toLowerCase().replace(/\s+/g, ' ') ===
+ 'link to cat pictures'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+ Cat Photos
+
+ See more cat photos in our gallery.
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md
new file mode 100644
index 00000000000..fd93bfbd562
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md
@@ -0,0 +1,71 @@
+---
+id: 5dfa22d1b521be39a3de7be0
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Katika hatua ya awali, uligeuza maneno `link to cat pictures` kuwa kiungo kwa kuyaweka kati ya tagi za kufungua na kufunga (`a`). Unaweza kufanya vivyo hivyo kwa maneno ndani ya kipengele, kama vile kipengele cha `p`.
+
+Katika maandishi ya kipengele chako cha `p`, geuza maneno `cat photos` kuwa kiungo hadi `https://freecatphotoapp.com` kwa kuongeza nanga ya ufunguzi na kufunga ya tagi (`a`) karibu na maneno haya.
+
+
+# --hints--
+
+Unapaswa kuweka kipengee kipya cha (`a`) ndani ya kipengele cha `p`.
+
+```js
+assert($('p > a').length);
+```
+
+Thamani ya `href` ya kiungo inapaswa kuwa `https://freecatphotoapp.com`. Umeacha thamani ya `href` au umeandika makosa.
+
+```js
+const nestedAnchor = $('p > a')[0];
+assert(
+ nestedAnchor.getAttribute('href') === 'https://freecatphotoapp.com'
+);
+```
+
+Maandishi ya kiungo yanapaswa kuwa `cat photos`. Aidha umesahau maandishi, au kuna makosa ya herufi.
+
+```js
+const nestedAnchor = $('p > a')[0];
+assert(
+ nestedAnchor.innerText.toLowerCase().replace(/\s+/g, ' ') === 'cat photos'
+);
+```
+
+Baada ya kuweka kipengee cha nanga (`a`), kipengele pekee cha `p` kinachoonekana kwenye kivinjari kinapaswa kuwa `See more cat photos in our gallery.` Mara mbili angalia maandishi, nafasi, au uakifishaji wa `p` na kipengele cha nanga kilichowekwa.
+
+```js
+const pText = document
+ .querySelector('p')
+ .innerText.toLowerCase()
+ .replace(/\s+/g, ' ');
+assert(pText.match(/see more cat photos in our gallery\.?$/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+ Cat Photos
+
+--fcc-editable-region--
+ See more cat photos in our gallery.
+ link to cat pictures
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa2407b521be39a3de7be1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa2407b521be39a3de7be1.md
new file mode 100644
index 00000000000..a21f7e1c428
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa2407b521be39a3de7be1.md
@@ -0,0 +1,55 @@
+---
+id: 5dfa2407b521be39a3de7be1
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Ongeza sifa ya `target` yenye thamani `_blank` kwenye tagi ya ufunguzi ya kipengele (`a`), ili kiungo kifunguke katika kichupo kipya.
+
+# --hints--
+
+Kipengele chako cha `p` kinapaswa kuwa na kipengee cha nanga cha (`a`) chenye maandishi `cat photos`. Huenda umeifuta au kuna makosa ya kuandika.
+
+```js
+const anchor = $('p > a');
+assert(
+ anchor.length &&
+ anchor[0].innerText.toLowerCase().replace(/\s+/g, ' ') === 'cat photos'
+);
+```
+
+Kipengele chako cha nanga (`a`) hakina sifa ya `target`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert(document.querySelector('a').hasAttribute('target'));
+```
+
+Thamani ya sifa ya `target` inapaswa kuwa `_blank`. Umeacha thamani au umeandika makosa. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert(document.querySelector('a').getAttribute('target') === '_blank');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+ Cat Photos
+
+--fcc-editable-region--
+ See more cat photos in our gallery.
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa30b9eacea3f48c6300ad.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa30b9eacea3f48c6300ad.md
new file mode 100644
index 00000000000..7bbee6cc82f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa30b9eacea3f48c6300ad.md
@@ -0,0 +1,90 @@
+---
+id: 5dfa30b9eacea3f48c6300ad
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Katika hatua za awali ulitumia kipengele cha nanga kugeuza maandishi kuwa kiungo. Aina zingine za maudhui pia zinaweza kugeuzwa kuwa kiunga kwa kuifunga kwa tagi za nanga.
+
+Geuza picha kuwa kiungo kwa kuizunguka na tagi za vipengele zinazofaa. Tumia `https://freecatphotoapp.com` kama thamani ya sifa `href`.
+
+# --hints--
+
+Unapaswa kuwa na kipengele cha `img` chenye thamani ya `src` ya `https://cdn.freecodecamp.org/curriculum/cat-photo-app/relaxing-cat.jpg`. Huenda umeifuta kwa bahati mbaya.
+
+```js
+assert(
+ document.querySelector('img') &&
+ document.querySelector('img').getAttribute('src') ===
+ 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/relaxing-cat.jpg'
+);
+```
+
+Kipengele chako cha nanga (`a`) kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelectorAll('a').length >= 2);
+```
+
+Unapaswa kuongeza tu tagi moja ya ufunguzi ya (`a`). Tafadhali ondoa ziada yoyote.
+
+```js
+assert(document.querySelectorAll('a').length === 2);
+```
+
+Kipengele chako cha nanga (`a`) kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/a>/g).length >= 2);
+```
+
+Unapaswa kuongeza tu tagi moja ya kufunga ya (`a`). Tafadhali ondoa ziada yoyote.
+
+```js
+assert(code.match(/<\/a>/g).length === 2);
+```
+
+Kipengele chako cha nanga (`a`) hakina sifa ya `href`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert(document.querySelector('a').hasAttribute('href'));
+```
+
+Kipengele chako cha nanga (`a`) kinapaswa kuunganishwa na `https://freecatphotoapp.com`. Aidha umesahau URL au umeandika makosa.
+
+```js
+assert(
+ document.querySelectorAll('a')[1].getAttribute('href') ===
+ 'https://freecatphotoapp.com'
+);
+```
+
+Kipengee chako cha `img` kinapaswa kuwekwa ndani ya kipengele cha nanga `a`. Kipengele kizima cha `img` kinafaa kuwa ndani ya tagi za ufunguzi na za kufunga za kipengele cha nanga (`a`).
+
+```js
+assert(document.querySelector('img').parentNode.nodeName === 'A');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+ Cat Photos
+
+ See more cat photos in our gallery.
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa3589eacea3f48c6300ae.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa3589eacea3f48c6300ae.md
new file mode 100644
index 00000000000..b19844a43c6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa3589eacea3f48c6300ae.md
@@ -0,0 +1,76 @@
+---
+id: 5dfa3589eacea3f48c6300ae
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Ndani ya kipengele cha pili cha `section`, ongeza kipengee kipya cha `h2` chenye maandishi `Cat Lists`.
+
+# --hints--
+
+Kipengee chako cha `section` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(
+ document.querySelectorAll('section').length === 2 &&
+ code.match(/<\/section>/g).length === 2
+);
+```
+
+Kipengele chako cha `h2` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelectorAll('h2').length === 2);
+```
+
+Kipengele chako cha `h2` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/h2\>/g).length === 2);
+```
+
+Kipengele chako cha pili cha `h2` kinafaa kuwa juu ya tagi ya kufunga ya kipengele cha pili cha `section`. Haiko katika nafasi sahihi.
+
+```js
+const secondSection = document.querySelectorAll('section')[1];
+assert(secondSection.lastElementChild.nodeName === 'H2');
+```
+
+Kipengele chako cha pili cha `h2` kinapaswa kuwa na maandishi `Cat Lists`. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+assert(
+ document
+ .querySelectorAll('main > section')[1]
+ .lastElementChild.innerText.toLowerCase() === 'cat lists'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa371beacea3f48c6300af.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa371beacea3f48c6300af.md
new file mode 100644
index 00000000000..60dbe5c14e4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa371beacea3f48c6300af.md
@@ -0,0 +1,85 @@
+---
+id: 5dfa371beacea3f48c6300af
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Unapoongeza kipengele cha kichwa cha cheo cha chini kwenye ukurasa, inadokezwa kuwa unaanza kifungu kipya.
+
+Baada ya kipengele cha `h2` cha mwisho cha kipengele cha `section` cha pili, ongeza kipengele cha `h3` na maandishi haya:
+
+`Things cats love:`
+
+# --hints--
+
+Kipengele cha pili cha `section` kinaonekana kukosa au hakina tagi ya kufungua na kufunga.
+
+```js
+assert(
+ document.querySelectorAll('main > section')[1] &&
+ code.match(/\<\/section>/g).length == 2
+);
+```
+
+Kunapaswa kuwa na kipengele cha `h3` juu ya tagi ya kufunga ya `section` ya pili.
+
+```js
+assert(
+ document.querySelectorAll('main > section')[1].lastElementChild.nodeName ===
+ 'H3'
+);
+```
+
+Kipengele cha `h3` kilicho juu ya tagi ya kufunga ya `section` ya pili kinapaswa kuwa na maandishi `Things cats love:`. Hakikisha umejumuisha koloni mwishoni mwa maandishi.
+
+```js
+assert(
+ document
+ .querySelectorAll('main > section')[1]
+ .lastElementChild.innerText.toLowerCase()
+ .replace(/\s+/g, ' ') === 'things cats love:'
+);
+```
+
+Kunapaswa kuwa na kipengele cha `h2` chenye maandishi `Cat Lists` juu ya kipengele cha mwisho cha `h3` ambacho kimewekwa katika kipengele cha mwisho cha `section`. Huenda umefuta kwa bahati mbaya kipengele cha `h2`.
+
+```js
+const secondSectionLastElemNode = document.querySelectorAll('main > section')[1]
+ .lastElementChild;
+assert(
+ secondSectionLastElemNode.nodeName === 'H3' &&
+ secondSectionLastElemNode.previousElementSibling.innerText
+ .toLowerCase()
+ .replace(/\s+/g, ' ') === 'cat lists'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa37b9eacea3f48c6300b0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa37b9eacea3f48c6300b0.md
new file mode 100644
index 00000000000..3f4f95385cc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa37b9eacea3f48c6300b0.md
@@ -0,0 +1,59 @@
+---
+id: 5dfa37b9eacea3f48c6300b0
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Baada ya kipengele cha `h3` chenye maandishi ya `Things cats love:`, ongeza orodha isiyopangwa ya kipengele (`ul`). Fahamu kuwa hakuna kitakachoonyeshwa kwa wakati huu.
+
+# --hints--
+
+Kipengele chako cha `ul` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelector('ul'));
+```
+
+Kipengele chako cha `ul` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/ul>/));
+```
+
+Kipengele cha `ul` kinafaa kuwa juu ya tagi ya kufunga ya kipengele cha pili cha `section`.
+
+```js
+const secondSectionLastElemNode = $('main > section')[1].lastElementChild;
+assert(secondSectionLastElemNode.nodeName === 'UL');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+--fcc-editable-region--
+ Cat Lists
+ Things cats love:
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb5ecbeacea3f48c6300b1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb5ecbeacea3f48c6300b1.md
new file mode 100644
index 00000000000..23fe9d2418e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb5ecbeacea3f48c6300b1.md
@@ -0,0 +1,80 @@
+---
+id: 5dfb5ecbeacea3f48c6300b1
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Tumia vipengele vya orodha (`li`) ili kuunda vitu katika orodha. Hapa kuna mfano wa vitu vya orodha katika orodha isiyopangwa:
+
+```html
+
+```
+
+Ndani ya kipengee cha `ul` ongeza orodha ya vitu tatu ili kuonyesha mambo matatu ambayo paka hupenda:
+
+`cat nip` `laser pointers` `lasagna`
+
+# --hints--
+
+Unapaswa kuwa na vipengele vitatu vya `li`. Kila kipengele cha `li` kinafaa kuwa na tagi yake ya kufungua na kufunga.
+
+```js
+assert($('li').length === 3 && code.match(/<\/li\>/g).length === 3);
+```
+
+Unapaswa kuwa na vipengele vitatu vya `li` vyenye maandishi `cat nip`, `laser pointers` na `lasagna` kwa mpangilio wowote. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+assert.deepStrictEqual(
+ [...document.querySelectorAll('li')]
+ .map((item) => item.innerText.toLowerCase())
+ .sort((a, b) => a.localeCompare(b)),
+ ['cat nip', 'lasagna', 'laser pointers']
+);
+```
+
+Vipengele vitatu vya `li` vinapaswa kupatikana kati ya tagi za kufungua na kufunga za kipengele `ul`.
+
+```js
+assert(
+ [...document.querySelectorAll('li')].filter(
+ (item) => item.parentNode.nodeName === 'UL'
+ ).length === 3
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md
new file mode 100644
index 00000000000..dd5a9c26abe
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md
@@ -0,0 +1,95 @@
+---
+id: 5dfb6250eacea3f48c6300b2
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Baada ya orodha isiyopangwa, ongeza picha mpya yenye thamani ya sifa ya `src` iliyowekwa kuwa:
+
+`https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg`
+
+Na thamani ya sifa ya `alt` kuwa:
+
+`A slice of lasagna on a plate.`
+
+# --hints--
+
+Lazima kuwe na kipengele `img` mara tu baada ya tagi ya kufunga ``.
+
+```js
+assert($('section')[1].lastElementChild.nodeName === 'IMG');
+```
+
+Picha mpya haina sifa ya `alt`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert($('section')[1].lastElementChild.hasAttribute('alt'));
+```
+
+Picha mpya inapaswa kuwa na thamani ya `alt` ya `A slice of lasagna on a plate.` Hakikisha kwamba thamani ya `alt` imezungukwa na alama za nukuu.
+
+```js
+assert(
+ $('section')[1]
+ .lastElementChild.getAttribute('alt')
+ .replace(/\s+/g, ' ')
+ .match(/^A slice of lasagna on a plate\.?$/i)
+);
+```
+
+Picha mpya haina sifa ya `src`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert($('section')[1].lastElementChild.hasAttribute('src'));
+```
+
+Picha mpya inapaswa kuwa na thamani ya `src` ya `https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg`. Hakikisha kuwa thamani ya `src` imezungukwa na alama za nukuu.
+
+```js
+assert(
+ $('section')[1].lastElementChild.getAttribute('src') ===
+ 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg'
+);
+```
+
+Ingawa umeweka `src` ya picha mpya kwenye URL sahihi, inashauriwa kuzunguka thamani ya sifa kila wakati kwa alama za nukuu.
+
+```js
+assert(!/\
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+--fcc-editable-region--
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md
new file mode 100644
index 00000000000..cbc70aad8f1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md
@@ -0,0 +1,78 @@
+---
+id: 5dfb655eeacea3f48c6300b3
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Kipengele cha `figure` kinawakilisha maudhui yanayojitosheleza na kitakuruhusu kuhusisha picha na maelezo mafupi.
+
+Weka picha uliyoongeza hivi punde ndani ya kipengele cha `figure`.
+
+# --hints--
+
+Kipengele chako cha `figure` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('figure'));
+```
+
+Kipengele chako cha `figure` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/figure\>/));
+```
+
+Kunapaswa kuwa na kipengele cha `figure` juu ya tagi ya kufunga ya kipengele cha pili cha `section`.
+
+```js
+assert($('section')[1].lastElementChild.nodeName === 'FIGURE');
+```
+
+Kipengee cha lasagna cha `img` kinapaswa kuwekwa katika kipengele cha `figure`.
+
+```js
+assert(
+ document.querySelector('figure > img') &&
+ document.querySelector('figure > img').getAttribute('src').toLowerCase() ===
+ 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6a35eacea3f48c6300b4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6a35eacea3f48c6300b4.md
new file mode 100644
index 00000000000..999340623d0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6a35eacea3f48c6300b4.md
@@ -0,0 +1,99 @@
+---
+id: 5dfb6a35eacea3f48c6300b4
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Kipengele cha manukuu ya kielelezo (`figcaption`) kinatumika kuongeza maelezo mafupi kuelezea picha iliyo ndani ya kipengele cha `figure`. Kwa mfano, `A cute cat ` huongeza maelezo `A cute cat`.
+
+Baada ya picha kuwekwa katika kipengele cha `figure`, ongeza kipengele cha `figcaption` chenye maandishi yaliyowekwa kuwa:
+
+`Cats love lasagna.`
+
+# --hints--
+
+Kipengee chako cha `figcaption` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('figcaption'));
+```
+
+Kipengee chako cha `figcaption` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/figcaption\>/));
+```
+
+Kipengee chako kipya cha `figcaption` kinapaswa kuwekwa katika kipengele cha `figure`.
+
+```js
+assert(
+ document.querySelector('figure > figcaption') &&
+ document.querySelector('figure > figcaption')
+);
+```
+
+Kipengee cha lasagna cha `img` kinapaswa kuwekwa katika kipengele cha `figure`.
+
+```js
+assert(
+ document.querySelector('figure > img') &&
+ document.querySelector('figure > img').getAttribute('src').toLowerCase() ===
+ 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg'
+);
+```
+
+Kipengele cha `figcaption` kilichowekwa katika kipengele cha `figure` lazima kiwe chini ya kipengele cha `img`. Unazo katika mpangilio mbaya.
+
+```js
+assert(
+ document.querySelector('figcaption').previousElementSibling.nodeName === 'IMG'
+);
+```
+
+Maandishi ya kipengele cha `figcaption` yanapaswa kuwa `Cats love lasagna.` Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+assert(
+ document.querySelector('figcaption').innerText.match(/Cats love lasagna.?$/i)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+--fcc-editable-region--
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d0.md
new file mode 100644
index 00000000000..e522d7987e6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d0.md
@@ -0,0 +1,85 @@
+---
+id: 5ef9b03c81a63668521804d0
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Sisitiza neno `love` katika kipengele cha `figcaption` kwa kukifunga katika kipengele cha msisitizo cha `em`.
+
+# --hints--
+
+Kipengele cha msisitizo chako cha `em` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelector('em'));
+```
+
+Kipengele cha msisitizo chako cha `em` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/em\>/));
+```
+
+Aidha umefuta kipengele cha `figcaption` au kinakosa tagi ya ufunguzi au ya kufunga.
+
+```js
+assert(document.querySelector('figcaption') && code.match(/<\/figcaption\>/));
+```
+
+Msisitizo wako wa kipengele cha `em` unapaswa kuzunguka maandishi `love`. Aidha umesahau maandishi, au kuna makosa ya herufi.
+
+```js
+assert(
+ document.querySelector('figcaption > em').innerText.toLowerCase() === 'love'
+);
+```
+
+Maandishi ya kipengele cha `figcaption` yanapaswa kuwa `Cats love lasagna`. Angalia kama kuna makosa ya kuandika na kwamba nafasi zinazohitajika zipo karibu na tagi za `em` za kufungua na kufunga za kipengele.
+
+```js
+assert(
+ document
+ .querySelector('figcaption')
+ .innerText.replace(/\s+/gi, ' ')
+ .match(/cats love lasagna\.?/i)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+--fcc-editable-region--
+ Cats love lasagna.
+--fcc-editable-region--
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d1.md
new file mode 100644
index 00000000000..e76c8f7e070
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d1.md
@@ -0,0 +1,82 @@
+---
+id: 5ef9b03c81a63668521804d1
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Baada ya kipengele cha `figure`, ongeza kipengele kingine cha `h3` na maandishi:
+
+`Top 3 things cats hate:`
+
+# --hints--
+
+Kunapaswa kuwa na kipengele cha `h3` juu ya tagi ya kufunga ya `section` ya pili. Hakikisha kuwa ina tagi ya kufungua na kufunga.
+
+```js
+assert(
+ document.querySelectorAll('main > section')[1].lastElementChild.nodeName ===
+ 'H3' && code.match(/<\/h3\>/g).length === 2
+);
+```
+
+Kipengele chako kipya cha `h3` kinapaswa kuwa na maandishi `Top 3 things cats hate:`. Hakikisha umejumuisha koloni mwishoni mwa maandishi.
+
+```js
+assert(
+ document
+ .querySelectorAll('main > section')[1]
+ .lastElementChild.innerText.toLowerCase()
+ .replace(/\s+/g, ' ') === 'top 3 things cats hate:'
+);
+```
+
+Lazima kuwe na `figure` juu ya kipengele kipya cha `h3`. Huenda umefuta kwa bahati mbaya kipengele cha `figure`.
+
+```js
+const secondSectionLastElemNode = document.querySelectorAll('main > section')[1]
+ .lastElementChild;
+assert(
+ secondSectionLastElemNode.nodeName === 'H3' &&
+ secondSectionLastElemNode.previousElementSibling.nodeName === 'FIGURE'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+--fcc-editable-region--
+
+
+ Cats love lasagna.
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d2.md
new file mode 100644
index 00000000000..265a3f44657
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d2.md
@@ -0,0 +1,101 @@
+---
+id: 5ef9b03c81a63668521804d2
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Msimbo wa orodha iliyoapangwa (`ol`) ni sawa na orodha isiyopangwa, lakini orodha ya vitu katika orodha iliyopangwa huwekwa nambari inapoonyeshwa.
+
+Baada ya kipengele cha pili cha `section` cha `h3` cha mwisho, ongeza orodha iliyopangwa na orodha hizi tatu:
+
+`flea treatment` `thunder` `other cats`
+
+# --hints--
+
+Kipengele chako cha `ol` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('ol'));
+```
+
+Kipengele chako cha `ol` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/ol>/));
+```
+
+Kipengele cha `ol` kinafaa kuwa juu ya tagi ya kufunga ya kipengele cha pili cha `section`. Unazo katika mpangilio mbaya.
+
+```js
+assert($('main > section')[1].lastElementChild.nodeName === 'OL');
+```
+
+Vipengee vitatu vya `li` lazima viwekwe ndani ya kipengele cha `ol`.
+
+```js
+assert(
+ [...document.querySelectorAll('li')].filter(
+ (item) => item.parentNode.nodeName === 'OL'
+ ).length === 3
+);
+```
+
+Unapaswa kuwa na vipengele vitatu vya `li` vyenye maandishi `flea treatment`, `thunder` na `other cats` kwa mpangilio wowote.
+
+```js
+assert.deepStrictEqual(
+ [...document.querySelectorAll('li')]
+ .filter((item) => item.parentNode.nodeName === 'OL')
+ .map((item) => item.innerText.toLowerCase())
+ .sort((a, b) => a.localeCompare(b)),
+ ['flea treatment', 'other cats', 'thunder']
+);
+```
+
+Unapaswa kuwa na kipengele kimoja cha `ol`.
+
+```js
+assert([...document.querySelectorAll('ol')].length == 1);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+--fcc-editable-region--
+ Top 3 things cats hate:
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d3.md
new file mode 100644
index 00000000000..85bdd3ccd67
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d3.md
@@ -0,0 +1,73 @@
+---
+id: 5ef9b03c81a63668521804d3
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Baada ya orodha iliyopangwa, ongeza kipengele kingine cha `figure`.
+
+# --hints--
+
+Kipengele chako cha `figure` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelectorAll('figure').length === 2);
+```
+
+Kipengele chako cha `figure` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/figure>/g).length === 2);
+```
+
+Kunapaswa kuwa na kipengele cha `figure` juu ya tagi ya kufunga ya kipengele cha pili cha `section`.
+
+```js
+assert($('main > section')[1].lastElementChild.nodeName === 'FIGURE');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+--fcc-editable-region--
+
+ flea treatment
+ thunder
+ other cats
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d4.md
new file mode 100644
index 00000000000..c5ff6454e86
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d4.md
@@ -0,0 +1,98 @@
+---
+id: 5ef9b03c81a63668521804d4
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Kipengele cha `strong` kinatumika kuonyesha kwamba maandishi fulani ni ya umuhimu mkubwa au ya dharura.
+
+Katika `figcaption` uliyoongeza hivi punde, onyesha kuwa `hate` ni ya umuhimu mkubwa kwa kuifunga katika kipengele cha `strong`.
+
+# --hints--
+
+Kipengee chako cha `strong` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelector('strong'));
+```
+
+Kipengee chako cha `strong` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/strong\>/));
+```
+
+Kipengele chako cha `strong` kinapaswa kuzunguka neno `hate` katika maandishi `Cats hate other cats.` Aidha umesahau maandishi, au kuna makosa ya herufi.
+
+```js
+assert(
+ document
+ .querySelectorAll('figcaption')[1]
+ .querySelector('strong')
+ .innerText.toLowerCase() === 'hate'
+);
+```
+
+Maandishi ya kipengele cha `figcaption` yanapaswa kuwa `Cats hate other cats.` Angalia kama kuna makosa ya kuandika na kwamba nafasi zinazohitajika zipo karibu na kipengele cha `strong` katika tagi za kufungua na kufunga.
+
+```js
+const secondFigCaption = document.querySelectorAll('figcaption')[1];
+assert(
+ secondFigCaption &&
+ secondFigCaption.innerText
+ .replace(/\s+/gi, ' ')
+ .trim()
+ .match(/cats hate other cats\.?/i)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+--fcc-editable-region--
+
+ Cats hate other cats.
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d5.md
new file mode 100644
index 00000000000..c41e64f48e7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d5.md
@@ -0,0 +1,106 @@
+---
+id: 5ef9b03c81a63668521804d5
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Ndani ya kipengele cha tatu cha `section`, ongeza kipengele cha `h2` chenye maandishi haya:
+
+`Cat Form`
+
+# --hints--
+
+Haujaweza kupata kipengele cha tatu cha `section`. Huenda umeifuta kimakosa au tagi ya ufunguzi au tagi ya kufunga.
+
+```js
+assert(
+ document.querySelectorAll('section').length === 3 &&
+ code.match(/<\/section>/g).length === 3
+);
+```
+
+Kipengele chako cha `h2` kinafaa kuwa na tagi ya kufungua na tagi ya kufunga. Huenda unakosa tagi moja au zote mbili zinazohitajika.
+
+```js
+assert(
+ document.querySelectorAll('h2').length >= 3 &&
+ code.match(/<\/h2>/g).length >= 3
+);
+```
+
+Unapaswa kuongeza kipengele kimoja tu cha `h2`. Tafadhali ondoa ziada yoyote.
+
+```js
+assert(document.querySelectorAll('h2').length === 3);
+```
+
+Kipengele kipya cha `h2` kinapaswa kupatikana juu kabisa ya tagi ya kufunga ya kipengele cha tatu cha `section`.
+
+```js
+const thirdSection = document.querySelectorAll('section')[2];
+assert(thirdSection.lastElementChild.nodeName === 'H2');
+```
+
+Maandishi ya kipengele cha `h2` yanapaswa kuwa `Cat Form`.
+
+```js
+const thirdSection = document.querySelectorAll('section')[2];
+assert(
+ thirdSection
+ .querySelector('h2')
+ .innerText.toLowerCase()
+ .replace(/\s+/g, ' ') === 'cat form'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d6.md
new file mode 100644
index 00000000000..7309ffb8d20
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d6.md
@@ -0,0 +1,89 @@
+---
+id: 5ef9b03c81a63668521804d6
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Sasa utaongeza fomu ya wavuti ili kukusanya taarifa kutoka kwa watumiaji.
+
+Baada ya kichwa cha `Cat Form`, ongeza kipengele cha `form`.
+
+# --hints--
+
+Kipengele chako cha `form` kinafaa kuwa na tagi ya kufungua na tagi ya kufunga. Huenda unakosa tagi moja au zote mbili zinazohitajika, au kuwa nazo katika mpangilio usio sahihi.
+
+```js
+assert(document.querySelector('form') && code.match(/<\/form>/g));
+```
+
+Tagi zako za vipengee vya `form` haziko katika mpangilio sahihi.
+
+```js
+const noSpaces = code.replace(/\s/g, '');
+assert(noSpaces.indexOf(''));
+```
+
+Kipengele cha `form` kilichowekwa katika `section` ya mwisho lazima kiwe chini ya kipengele cha `h2`. Una kipengele cha `h2` na kipengele cha `form` katika mpangilio usio sahihi.
+
+```js
+assert(document.querySelector('form').previousElementSibling.nodeName === 'H2');
+```
+
+Kipengele cha `form` hakipaswi kuwa na maudhui. Ondoa vipengele au maandishi yoyote ya HTML kati ya tagi za kipengele cha `form`.
+
+```js
+assert($('form')[0].innerHTML.trim().length === 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+--fcc-editable-region--
+ Cat Form
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d7.md
new file mode 100644
index 00000000000..335be125317
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d7.md
@@ -0,0 +1,116 @@
+---
+id: 5ef9b03c81a63668521804d7
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Sifa ya `action` inaonyesha ambapo data ya fomu inapaswa kutumwa. Kwa mfano, `` huambia kivinjari kwamba data ya fomu inapaswa kutumwa kwa njia `/submit-url`.
+
+Ongeza sifa ya `action` yenye thamani `https://freecatphotoapp.com/submit-cat-photo` kwenye kipengele cha `form`.
+
+# --hints--
+
+Kipengele chako cha `form` kinapaswa kuwa na tagi ya ufunguzi na tagi ya kufunga kwa mpangilio sahihi. Huenda unakosa tagi moja au zote mbili zinazohitajika, au kuwa nazo katika mpangilio usio sahihi.
+
+```js
+const noSpaces = code.replace(/\s/g, '');
+assert(
+ document.querySelector('form') &&
+ code.match(/<\/form>/g) &&
+ noSpaces.indexOf('')
+);
+```
+
+Tagi ya ufunguzi ya kipengele chako cha `form` inapaswa kuwa na sifa ya `action` pekee. Ondoa kitu kingine chochote ambacho unaweza kuwa umeandika ndani yake.
+
+```js
+assert([...document.querySelector('form').attributes].length < 2);
+```
+
+Unapaswa kuunda kipengele cha `input`. Angalia sintaksia.
+
+```js
+assert(document.querySelector('input'));
+```
+
+Kipengele chako cha `input` kinafaa kuwa na tagi ya kufungua na tagi ya kufunga.
+
+```js
+assert(document.querySelector('input') && !code.match(/<\/input\>/g));
+```
+
+Kipengele cha `input` kinafaa kuwa ndani ya kipengele cha `form`.
+
+```js
+assert(document.querySelector('form > input'));
+```
+
+`form` yako inapaswa kuwa na kipengele cha `input` pekee. Ondoa vipengele au maandishi yoyote ya HTML kati ya tagi za kipengele cha `form`.
+
+```js
+assert(
+ $('form')[0].children.length === 1 &&
+ $('form')[0].innerText.trim().length === 0
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+ Cat Form
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d9.md
new file mode 100644
index 00000000000..00428859aab
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d9.md
@@ -0,0 +1,104 @@
+---
+id: 5ef9b03c81a63668521804d9
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Maandishi ya placeholder hutumika kuwapa watu dokezo kuhusu aina gani ya taarifa ya kuingiza kwenye ingizo. Kwa mfano, ` `.
+
+Ongeza maandishi ya placeholder `cat photo URL` kwenye kipengele chako cha `input`.
+
+# --hints--
+
+Umefuta kipengele chako cha `input` au kina sintaksia batili. Thamani zote za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert($('input').length);
+```
+
+`form` yako inapaswa kuwa na kipengele cha `input` pekee. Ondoa vipengele au maandishi yoyote ya HTML kati ya tagi za kipengele cha `form`.
+
+```js
+assert(
+ $('form')[0].children.length === 1 &&
+ $('form')[0].innerText.trim().length === 0
+);
+```
+
+Kipengele chako cha `input` hakina sifa ya `placeholder`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert($('input')[0].hasAttribute('placeholder'));
+```
+
+Kipengele chako cha `input` kinapaswa kuwa na sifa ya `placeholder` yenye thamani ya `cat photo URL`. Umeacha thamani au umeandika makosa. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert(
+ $('input')[0]
+ .getAttribute('placeholder')
+ .replace(/\s+/g, ' ')
+ .match(/^cat photo URL$/i)
+);
+```
+
+Ingawa umeweka kipengele cha `input` cha sifa ya `placeholder` kuwa `cat photo URL`, inashauriwa kuzunguka thamani ya sifa kwa alama za nukuu kila wakati.
+
+```js
+assert(!/\<\s*input\s+placeholder\s*=\s*cat\s+photo\s+url/i.test(code));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804da.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804da.md
new file mode 100644
index 00000000000..19bb1ee1d8b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804da.md
@@ -0,0 +1,94 @@
+---
+id: 5ef9b03c81a63668521804da
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Tumia kipengele cha `button` ili kuunda kitufe cha kubofya. Kwa mfano, `Click Here ` huunda kitufe chenye maandishi `Click Here`.
+
+Ongeza kipengele cha `button` chenye maandishi `Submit` chini ya kipengele cha `input`. Tabia chaguomsingi ya kubofya kitufe cha fomu bila sifa zozote huwasilisha fomu kwenye eneo lililobainishwa katika sifa ya fomu ya `action`.
+
+# --hints--
+
+Kipengee chako cha `button` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelector('button'));
+```
+
+Kipengee chako cha `button` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/button\>/));
+```
+
+Maandishi ya kipengele cha `button` yanapaswa kuwa `Submit`. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+assert(document.querySelector('button').innerText.toLowerCase() === 'submit');
+```
+
+Kipengele chako cha `button` kinapaswa kuwa chini ya kipengele cha `input`. Unazo katika mpangilio mbaya.
+
+```js
+const collection = [...document.querySelectorAll('input, button')].map(
+ (node) => node.nodeName
+);
+assert(collection.indexOf('INPUT') < collection.indexOf('BUTTON'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804db.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804db.md
new file mode 100644
index 00000000000..f5b219c3d22
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804db.md
@@ -0,0 +1,91 @@
+---
+id: 5ef9b03c81a63668521804db
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Ili kuzuia mtumiaji kuwasilisha fomu yako wakati maelezo yanayohitajika hayapo, unahitaji kuongeza sifa ya `required` kwa kipengele cha `input`. Hakuna haja ya kuweka thamani kwa sifa ya `required`. Badala yake, ongeza tu neno `required` kwa kipengele cha `input`, kuhakikisha kuna nafasi kati yake na sifa nyingine.
+
+# --hints--
+
+Umefuta kipengele chako cha `input` au kina sintaksia batili. Thamani zote za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert($('input').length);
+```
+
+`form` yako inapaswa kuwa na kipengele cha `input` pekee. Ondoa vipengele au maandishi yoyote ya HTML kati ya tagi za kipengele cha `form`.
+
+```js
+assert(
+ $('form')[0].children.length === 1 &&
+ $('form')[0].innerText.trim().length === 0
+);
+```
+
+Kipengele chako cha `input` kinafaa kuwa na sifa ya `required`. Kumbuka, unaongeza tu neno `required` ndani ya tagi ya kipengele cha `input`.
+
+```js
+assert($('input')[0].hasAttribute('required'));
+```
+
+Thamani haipaswi kutolewa kwa sifa ya `required`.
+
+```js
+assert($('input')[0].getAttribute('required') === '');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dc.md
new file mode 100644
index 00000000000..ba822020046
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dc.md
@@ -0,0 +1,148 @@
+---
+id: 5ef9b03c81a63668521804dc
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Unaweza kutumia vitufe vya redio (radio buttons) kwa maswali ambapo unataka jibu moja tu kati ya chaguo nyingi.
+
+Huu hapa ni mfano wa kitufe cha redio chenye chaguo la `cat`: ` cat`. Kumbuka kwamba vipengele vya `input` vinajifunga.
+
+Kabla ya kuingiza maandishi, ongeza kitufe cha redio na chaguo limewekwa kama:
+
+`Indoor`
+
+# --hints--
+
+Unapaswa kuunda kipengele cha `input` kwa ajili ya kitufe chako cha redio. Angalia sintaksia.
+
+```js
+assert($('form > input').length >= 2);
+```
+
+Kipengele chako cha `input` kinafaa kuwa na tagi ya kufungua na tagi ya kufunga.
+
+```js
+assert($('form > input') && !code.match(/<\/input\>/g));
+```
+
+Unapaswa kuwa umeongeza kipengele kimoja tu cha `input` kwa kitufe chako cha redio. Ondoa ziada yoyote.
+
+```js
+assert($('form > input').length === 2);
+```
+
+Kipengele chako kipya cha `input` lazima kiwe juu ya `input` iliyopo na sifa ya `type` iliyowekwa kuwa `text`. Unazo katika mpangilio mbaya.
+
+```js
+const existingInputElem = document.querySelector('form > input[type="text"]');
+assert(
+ existingInputElem &&
+ existingInputElem.previousElementSibling.nodeName === 'INPUT'
+);
+```
+
+Kipengele chako cha kipya cha `input` hakina sifa ya `type`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua.
+
+```js
+assert($('input')[0].hasAttribute('type'));
+```
+
+Kipengele chako kipya cha `input` kinapaswa kua na sifa moja pekee ya `type`. Ondoa ziada yoyote.
+
+```js
+assert($('input')[0]
+ .getAttributeNames()
+ .filter(attr => attr === 'type')
+ .length === 1
+);
+```
+
+Kipengele chako kipya cha `input` kinafaa kuwa na sifa ya `type` yenye thamani ya`radio`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert(
+ $('input')[0]
+ .getAttribute('type')
+ .match(/^radio$/i)
+);
+```
+
+Ingawa umeweka sifa mpya ya kipengele cha `input` ya `type` kuwa `radio`, inashauriwa kuzunguka thamani ya sifa kwa alama za nukuu kila wakati.
+
+```js
+assert(!/\<\s*input\s+type\s*=\s*radio/i.test(code));
+```
+
+Maandishi ya kitufe cha `radio` ya `Indoor` yanapaswa kupatikana baada yake badala ya kabla yake.
+
+```js
+const radioInputElem = $('input')[0];
+assert(!radioInputElem.previousSibling.nodeValue.match(/Indoor/i));
+```
+
+Maandishi `Indoor` yanapaswa kupatikana moja kwa moja upande wa kulia wa kitufe chako cha `radio`. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+const radioInputElem = $('input')[0];
+assert(
+ radioInputElem.nextSibling.nodeValue.replace(/\s+/g, ' ').match(/\s*Indoor/i)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dd.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dd.md
new file mode 100644
index 00000000000..e522099ef72
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dd.md
@@ -0,0 +1,104 @@
+---
+id: 5ef9b03c81a63668521804dd
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Vipengele vya `label` hutumika kusaidia kuhusisha maandishi ya kipengele cha `input` na kipengele chenyewe cha `input` (hasa kwa teknolojia saidizi kama vile visoma skrini). Kwa mfano, ` cat ` hufanya hivyo kubofya neno `cat` pia kuchagua kitufe cha redio sambamba.
+
+Weka kitufe chako cha `radio` ndani ya kipengele cha `label`.
+
+# --hints--
+
+Unapaswa kuhakikisha kuwa kitufe cha redio bado kipo.
+
+```js
+assert($('input[type="radio"]')[0]);
+```
+
+Maandishi `Indoor` yanapaswa kupatikana moja kwa moja upande wa kulia wa kitufe chako cha `radio`. Hakikisha kuna nafasi kati ya jina la kipengele na jina la sifa. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+const radioInputElem = $('input')[0];
+assert(
+ radioInputElem.nextSibling.nodeValue.replace(/\s+/g, ' ').match(/ Indoor/i)
+);
+```
+
+Kipengele chako cha `label` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelector('label'));
+```
+
+Kipengele chako cha `label` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/label\>/));
+```
+
+Kitufe chako cha redio na maandishi yake yote yanapaswa kupatikana kati ya tagi za kufungua na kufunga za kipengele cha `label`.
+
+```js
+const labelChildNodes = [...$('form > label')[0].childNodes];
+assert(
+ labelChildNodes.filter((childNode) => childNode.nodeName === 'INPUT').length
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804de.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804de.md
new file mode 100644
index 00000000000..6d7df6570c8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804de.md
@@ -0,0 +1,105 @@
+---
+id: 5ef9b03c81a63668521804de
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Fahamu kwamba vitufe vyote viwili vya redio vinaweza kuchaguliwa kwa wakati mmoja. Ili kufanya hivyo, kuchagua kitufe kimoja cha redio kutaondoa kiotomatiki kingine, vitufe vyote viwili lazima viwe na sifa ya `name` yenye thamani sawa.
+
+Ongeza sifa ya `name` yenye thamani `indoor-outdoor` kwa vitufe vyote viwili vya redio.
+
+# --hints--
+
+Vitufe vyote viwili vya redio bado vinapaswa kupatikana kati ya tagi za kufungua na kufunga za vipengee vya `label`.
+
+```js
+const labelChildNodes = [...document.querySelectorAll('form > label')].map(
+ (node) => node.childNodes
+);
+assert(
+ labelChildNodes.filter((childNode) => childNode[0].nodeName === 'INPUT')
+ .length === 2
+);
+```
+
+Vitufe vyako vyote vya redio vinapaswa kuwa na sifa ya `name`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+const radioButtons = [...document.querySelectorAll('input[type="radio"]')];
+assert(radioButtons.every((btn) => btn.hasAttribute('name')));
+```
+
+Vitufe vyako vyote vya redio vinapaswa kuwa na sifa ya `type`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+const radioButtons = [...document.querySelectorAll('input')];
+assert(radioButtons.every((btn) => btn.hasAttribute('type')));
+```
+
+Vitufe vyote viwili vya redio vinapaswa kuwa na sifa ya `name` yenye thamani `indoor-outdoor`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+const radioButtons = [...$('input[type="radio"]')];
+assert(
+ radioButtons.every((btn) =>
+ btn.getAttribute('name').match(/^indoor-outdoor$/)
+ )
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804df.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804df.md
new file mode 100644
index 00000000000..8c71c05d83d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804df.md
@@ -0,0 +1,95 @@
+---
+id: 5ef9b03c81a63668521804df
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Sifa ya `id` inatumika kutambua vipengele mahususi vya HTML. Kila thamani ya `id` lazima iwe ya kipekee kutoka kwa thamani zingine zote za `id` kwa ukurasa mzima.
+
+Ongeza sifa ya `id` yenye thamani `indoor` kwenye kitufe cha redio. Wakati vipengele vina sifa nyingi, mpangilio wa sifa haujalishi.
+
+# --hints--
+
+Kitufe chako cha redio bado kinafaa kuwa kati ya tagi za kufungua na kufunga za kipengele cha `label`.
+
+```js
+const labelChildNodes = [...$('form > label')[0].childNodes];
+assert(
+ labelChildNodes.filter((childNode) => childNode.nodeName === 'INPUT').length
+);
+```
+
+Kitufe chako cha redio kinafaa kuwa na sifa ya `id`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert($('input')[0].hasAttribute('id'));
+```
+
+Kitufe chako cha redio kinafaa kuwa na sifa ya `type`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert($('input')[0].hasAttribute('type'));
+```
+
+Kitufe chako cha redio kinafaa kuwa na sifa ya `id` yenye thamani ya `indoor`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert($('input')[0].id.match(/^indoor$/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e1.md
new file mode 100644
index 00000000000..bb3b1e5c6ca
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e1.md
@@ -0,0 +1,104 @@
+---
+id: 5ef9b03c81a63668521804e1
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Kipengele cha `fieldset` kinatumika kuweka pamoja ingizo na lebo zinazohusiana katika fomu ya wavuti. Vipengele vya `fieldset` ni block-level elements , kumaanisha kuwa vinaonekana kwenye mstari mpya.
+
+Weka vitufe vya redio vya `Indoor` na `Outdoor` ndani ya kipengele cha `fieldset`, na usisahau kujongeza vitufe vya redio.
+
+# --hints--
+
+Vitufe vyote viwili vya redio bado vinapaswa kupatikana kati ya tagi za kufungua na kufunga za vipengee vya `label`.
+
+```js
+const labelChildNodes = [...$('label')].map((node) => [...node.childNodes]);
+assert(
+ labelChildNodes.filter(
+ childNodes =>
+ childNodes.filter(node => node.nodeName === 'INPUT').length === 1
+ ).length === 2
+);
+```
+
+Kipengele chako cha `fieldset` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('fieldset'));
+```
+
+Kipengele chako cha `fieldset` kinafaa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/fieldset\>/));
+```
+
+Kitufe cha redio na lebo zinazohusiana zinapaswa kuwa kati ya tagi za kufungua na kufunga za kipengele cha `fieldset`.
+
+```js
+const radioButtons = [...$('input[type="radio"]')];
+assert(
+ radioButtons.every((btn) => btn.parentNode.parentNode.nodeName === 'FIELDSET')
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e2.md
new file mode 100644
index 00000000000..9891825f4f4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e2.md
@@ -0,0 +1,131 @@
+---
+id: 5ef9b03c81a63668521804e2
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Fomu kwa kawaida hutumia visanduku vya kuteua (checkboxes) kwa maswali ambayo yanaweza kuwa na jibu zaidi ya moja. Kwa mfano, hapa kuna kisanduku cha kuteua chenye chaguo la `tacos`: ` tacos`.
+
+Chini ya kipengele cha `legend` ulichoongeza hivi punde, ongeza `input` yenye sifa yake ya `type` iliyowekwa kuwa `checkbox` na uipe chaguo la:
+
+`Loving`
+
+# --hints--
+
+Kipengele cha `input` cha kisanduku chako cha kuteua kinapaswa kuwa na tagi ya ufunguzi, lakini si tagi ya kufunga.
+
+```js
+assert($('fieldset > input') && !code.match(/<\/input\>/g));
+```
+
+Unapaswa kuwa umeongeza kipengele kimoja tu cha ingizo kwa kisanduku chako cha kuteua. Ondoa ziada yoyote.
+
+```js
+assert($('fieldset > input').length === 1);
+```
+
+Kipengele chako kipya cha `input` lazima kiwe chini ya kipengele cha `legend` chenye maandishi `What's your cat's personality?`. Unazo katika mpangilio mbaya.
+
+```js
+const existingLegendElem = $('fieldset > legend')[1];
+assert(
+ existingLegendElem &&
+ existingLegendElem.nextElementSibling.nodeName === 'INPUT'
+);
+```
+
+Kipengele chako cha kipya cha `input` hakina sifa ya `type`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua.
+
+```js
+assert($('fieldset > input')[0].hasAttribute('type'));
+```
+
+Kipengele chako kipya cha `input` kinafaa kuwa na sifa ya `type` yenye thamani ya`checkbox`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert(
+ $('fieldset > input')[0]
+ .getAttribute('type')
+ .match(/^checkbox$/i)
+);
+```
+
+Ingawa umeweka sifa mpya ya kipengele cha `input` ya `type` kuwa `checkbox`, inashauriwa kuzunguka thamani ya sifa kwa alama za nukuu kila wakati.
+
+```js
+assert(!/\<\s*input\s+type\s*=\s*checkbox/i.test(code));
+```
+
+Maandishi `Loving` yanapaswa kupatikana moja kwa moja upande wa kulia wa kisanduku chako cha kuteua. Hakikisha kuna nafasi kati ya jina la kipengele na maandishi. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+const checkboxInputElem = $('input[type="checkbox"]')[0];
+assert(
+ checkboxInputElem.nextSibling.nodeValue.replace(/\s+/g, ' ').match(/ Loving/i)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e3.md
new file mode 100644
index 00000000000..a9e6800835c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e3.md
@@ -0,0 +1,122 @@
+---
+id: 5ef9b03c81a63668521804e3
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Ongeza kisanduku kingine cha kuteua baada ya kile ulichoongeza hivi punde. Sifa ya `id` inapaswa kuwa `lazy` na thamani ya sifa ya `name` inapaswa kuwa sawa na kisanduku cah kuteua cha mwisho.
+
+Pia ongeza kipengele cha `label` upande wa kulia wa kisanduku kipya cha kuteua chenye maandishi `Lazy`. Hakikisha kuwa umehusisha kipengele cha `label` na kisanduku cha kuteua kipya kwa kutumia sifa ya `for`.
+
+# --hints--
+
+Unahitaji kuongeza kisanduku cha kuteua kipya.
+
+```js
+assert($('input[type="checkbox"]').length === 2);
+```
+
+Kisanduku chako kipya cha kuteua kinapaswa kuwa na sifa ya `id` yenye thamani `lazy` na sifa ya `name` yenye thamani `personality`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+const checkboxes = [...$('input[type="checkbox"]')];
+assert(
+ checkboxes.some(
+ (checkbox) =>
+ checkbox.id === 'lazy' && checkbox.getAttribute('name') === 'personality'
+ )
+);
+```
+
+Kisanduku chako kipya cha kuteua kinapaswa kuwa baada ya cha kwanza. Unazo katika mpangilio mbaya.
+
+```js
+const checkboxes = [...$('input[type="checkbox"]')].map(
+ (checkbox) => checkbox.id
+);
+assert(checkboxes.indexOf('loving') < checkboxes.indexOf('lazy'));
+```
+
+Katika upande wa kulia wa kisanduku chako kipya cha kuteua, kunapaswa kuwa na kipengele cha `label` chenye maandishi `Lazy`.
+
+```js
+const nextElementSibling = $('input[type="checkbox"]')[1].nextElementSibling;
+assert(
+ nextElementSibling.nodeName === 'LABEL' &&
+ nextElementSibling.innerText.replace(/\s+/g, '').match(/^Lazy$/i)
+);
+```
+
+`label` mpya inapaswa kuwa na sifa ya `for` yenye thamani sawa na sifa ya `id` ya kisanduku kipya cha kuteua. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+assert(
+ $('input[type="checkbox"]')[1].nextElementSibling.getAttribute('for') ===
+ 'lazy'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e5.md
new file mode 100644
index 00000000000..cf1dccef4e5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e5.md
@@ -0,0 +1,117 @@
+---
+id: 5ef9b03c81a63668521804e5
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Ili kufanya kisanduku cha kuteua au kitufe cha redio kilichochaguliwa kwa chaguomsingi, unahitaji kuongeza sifa ya `checked` kwayo. Hakuna haja ya kuweka thamani kwa sifa ya `checked`. Badala yake, ongeza tu neno `checked` kwa kipengele cha `input`, kuhakikisha kuna nafasi kati yake na sifa nyingine.
+
+Tengeneza kitufe cha kwanza cha redio na kisanduku cha kuteua cha kwanza kichaguliwe kwa chaguomsingi.
+
+# --hints--
+
+Hakikisha bado kuna vitufe viwili vya redio na visanduku vya kuteua vitatu vilivyowekwa katika vipengee husika vya `fieldset`.
+
+```js
+assert(
+ $('input[type="radio"]').length === 2 &&
+ $('fieldset > input[type="checkbox"]').length === 3
+);
+```
+
+Kitufe chako cha kwanza cha redio, chenye `id` iliyowekwa kuwa `indoor`, kinapaswa kuwa na sifa ya `checked`.
+
+```js
+assert($('input[type="radio"]')[0].hasAttribute('checked'));
+```
+
+Kitufe cha pili cha redio hakipaswi kuwa na sifa ya `checked`.
+
+```js
+assert(!$('input[type="radio"]')[1].hasAttribute('checked'));
+```
+
+Kisanduku cha kuteua cha kwanza hakina sifa ya `checked`.
+
+```js
+assert($('input[type="checkbox"]')[0].hasAttribute('checked'));
+```
+
+Kitufe cha pili cha redio hakipaswi kuwa na sifa ya `checked`.
+
+```js
+assert(!$('input[type="checkbox"]')[1].hasAttribute('checked'));
+```
+
+Kisanduku cha kuteua cha tatu hakipaswi kuwa na sifa ya `checked`.
+
+```js
+assert(!$('input[type="checkbox"]')[2].hasAttribute('checked'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e7.md
new file mode 100644
index 00000000000..17c07c8b3b6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e7.md
@@ -0,0 +1,103 @@
+---
+id: 5ef9b03c81a63668521804e7
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Sasa utaongeza sehemu ya footer kwenye ukurasa.
+
+Baada tu ya kipengele cha `main`, ongeza kipengele cha `footer`.
+
+# --hints--
+
+Aidha umefuta kipengele cha `main` au kinakosa tagi ya ufunguzi au ya kufunga.
+
+```js
+assert(document.querySelector('main') && code.match(/<\/main>/));
+```
+
+Kipengele chako cha `footer` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('footer'));
+```
+
+Kipengele chako cha `footer` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/footer\>/));
+```
+
+Kipengele chako cha `footer` kinapaswa kuwa chini ya tagi ya kufunga ya kipengele cha `main`. Umeiweka mahali pengine.
+
+```js
+assert(document.querySelector('main').nextElementSibling.nodeName === 'FOOTER');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e8.md
new file mode 100644
index 00000000000..92bfdab8ea4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e8.md
@@ -0,0 +1,105 @@
+---
+id: 5ef9b03c81a63668521804e8
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Weka kipengele cha `p` chenye maandishi `No Copyright - freeCodeCamp.org` ndani ya kipengele cha `footer`.
+
+# --hints--
+
+Aidha umefuta kipengele cha `footer` au kinakosa tagi ya ufunguzi au ya kufunga.
+
+```js
+assert(document.querySelector('footer') && code.match(/<\/footer>/));
+```
+
+Kipengele chako cha `footer` kinapaswa kuwa na kipengele cha `p`. Hakikisha umeongeza tagi ya ufunguzi na tagi ya kufunga kwa kipengele cha `p`.
+
+```js
+assert(document.querySelector('footer > p'));
+```
+
+Kipengele chako cha `footer` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+const pElemClosingTags = code.match(/<\/p\>/g);
+assert(pElemClosingTags && pElemClosingTags.length === 2);
+```
+
+Maandishi ya kipengele chako cha `p` yanapaswa kuwa `No Copyright - freeCodeCamp.org`. Aidha umeacha maandishi, umeandika makosa, au haiko kati ya tagi za kufungua na kufunga za kipengele cha `p`.
+
+```js
+const extraSpacesRemoved = $('footer > p')[0].innerText.replace(/\s+/g, ' ');
+assert(extraSpacesRemoved.match(/No Copyright - freeCodeCamp\.org$/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e9.md
new file mode 100644
index 00000000000..186d4ed414c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e9.md
@@ -0,0 +1,116 @@
+---
+id: 5ef9b03c81a63668521804e9
+title: Hatua ya 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+Turn the existing `freeCodeCamp.org` text into a link by enclosing it in an anchor (`a`) element. Sifa ya `href` inapaswa kuwekwa kuwa `https://www.freecodecamp.org`.
+
+# --hints--
+
+Your anchor (`a`) element should be nested within the `p` element inside the `footer`. Hakikisha umeongeza tagi ya ufunguzi na tagi ya kufunga kwa kipengele cha `a`.
+
+```js
+assert($('footer > p > a').length);
+```
+
+Kipengele chako cha nanga (`a`) kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+const aElemClosingTags = code.match(/<\/a\>/g);
+assert(aElemClosingTags && aElemClosingTags.length === 3);
+```
+
+Kipengele chako cha (`a`) kinafaa kuwa na sifa ya `href` yenye thamani `https://www.freecodecamp.org`. Aidha umesahau sifa au umeandika makosa.
+
+```js
+const nestedAnchor = $('footer > p > a')[0];
+assert(nestedAnchor.getAttribute('href').toLowerCase() === 'https://www.freecodecamp.org');
+```
+
+Maandishi ya kiungo yanapaswa kuwa `freeCodeCamp.org`. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+const nestedAnchor = $('footer > p > a')[0];
+assert(
+ nestedAnchor.innerText.toLowerCase().replace(/\s+/g, ' ') ===
+ 'freecodecamp.org'
+);
+```
+
+Baada ya kuweka kipengele cha nanga (`a`), kipengele pekee cha `p` kinachoonekana kwenye kivinjari kinapaswa kuwa `No Copyright - freeCodeCamp.org`. Angalia mara mbili maandishi, nafasi, au uakifishaji wa `p` na kipengele cha nanga kilichowekwa.
+
+```js
+const pText = $('footer > p')[0].innerText.toLowerCase().replace(/\s+/g, ' ');
+assert(pText.match(/^no copyright - freecodecamp.org$/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ea.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ea.md
new file mode 100644
index 00000000000..bf9a33f1613
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ea.md
@@ -0,0 +1,109 @@
+---
+id: 5ef9b03c81a63668521804ea
+title: Hatua ya 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Kumbuka kuwa kila kitu ambacho umeongeza kwenye ukurasa kufikia sasa kiko ndani ya kipengele cha `body`. Vipengele vyote vya maudhui ya ukurasa ambavyo vinapaswa kutolewa kwa ukurasa huenda ndani ya kipengele cha `body`. Hata hivyo, taarifa nyingine muhimu huenda ndani ya kipengele cha `head`.
+
+Ongeza kipengele cha `head` juu ya kipengele chako cha `body`.
+
+# --hints--
+
+Aidha umefuta kipengele cha `body` au kinakosa tagi ya ufunguzi au ya kufunga.
+
+```js
+assert(document.querySelector('body') && code.match(/<\/body>/));
+```
+
+Kipengele chako cha `head` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(code.match(/\/));
+```
+
+Kipengele chako cha `head` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/\<\/head\>/));
+```
+
+Kipengele chako cha `head` kinapaswa kuwa juu ya tagi ya kufungua ya kipengele cha `body`. Umeiweka mahali pengine.
+
+```js
+const noSpaces = code.replace(/\s/g, '');
+assert(noSpaces.match(/\<\/head\>\/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804eb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804eb.md
new file mode 100644
index 00000000000..cf33d732177
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804eb.md
@@ -0,0 +1,113 @@
+---
+id: 5ef9b03c81a63668521804eb
+title: Hatua ya 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Kipengele cha `title` huamua vivinjari vinaonyesha nini kwenye upau wa kichwa au kichupo cha ukurasa.
+
+Ongeza kipengele cha `title` ndani ya kipengele cha `head` kwa kutumia maandishi yaliyo hapa chini:
+
+`CatPhotoApp`
+
+# --hints--
+
+Aidha umefuta kipengele cha `head` au kinakosa tagi ya ufunguzi au ya kufunga.
+
+```js
+assert(code.match(/\/) && code.match(/\<\/head\>/));
+```
+
+Kipengee chako cha `title` kinapaswa kuwekwa ndani ya kipengele cha `head`. Hakikisha umeongeza tagi ya ufunguzi na tagi ya kufunga kwa kipengele cha `title`.
+
+```js
+const noSpaces = code.replace(/\s/g, '');
+assert(noSpaces.match(/\\.*\<\/title\>\<\/head\>/));
+```
+
+Kipengele chako cha `title` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/\<\/title\>/));
+```
+
+Maandishi ya kipengele cha `title` yanapaswa kuwa `CatPhotoApp`. Aidha umesahau maandishi, au kuna makosa ya herufi.
+
+```js
+assert(document.title && document.title.toLowerCase() === 'catphotoapp');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ec.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ec.md
new file mode 100644
index 00000000000..63b8dfdf7d0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ec.md
@@ -0,0 +1,99 @@
+---
+id: 5ef9b03c81a63668521804ec
+title: Hatua ya 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Fahamu kwamba maudhui yote ya ukurasa yamewekwa ndani ya kipengele cha `html`. Vipengele vingine vyote lazima viwe vizazi vya kipengele hiki cha `html`.
+
+Ongeza sifa ya `lang` yenye thamani `en` kwenye tagi ya `html` ya kufungua ili kubainisha kuwa lugha ya ukurasa ni Kiingereza.
+
+# --hints--
+
+Aidha umefuta kipengele cha `html` au kinakosa tagi ya ufunguzi au ya kufunga.
+
+```js
+assert(code.match(/\/) && code.match(/\<\/html\>/));
+```
+
+Kipengele chako cha `html` kinafaa kuwa na sifa ya `lang` yenye thamani `en`. Aidha umesahau sifa au umeandika makosa.
+
+```js
+const extraSpacesRemoved = code.replace(/\s+/g, " ");
+assert(extraSpacesRemoved.match(/\/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+ CatPhotoApp
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ee.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ee.md
new file mode 100644
index 00000000000..8eb12202848
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ee.md
@@ -0,0 +1,100 @@
+---
+id: 5ef9b03c81a63668521804ee
+title: Hatua ya 68
+challengeType: 0
+dashedName: step-68
+---
+
+# --description--
+
+Kurasa zote zinapaswa kuanza na ``. Mfuatano huu maalum unajulikana kama declaration na huhakikisha kuwa kivinjari kinajaribu kukidhi vipimo vya sekta nzima.
+
+Ongeza tamko hili kama mstari wa kwanza wa msimbo.
+
+# --hints--
+
+Msimbo wako unapaswa kuanza na tamko ``. Huenda umeacha tamko, umeandika makosa, au sio mstari wa kwanza wa msimbo.
+
+```js
+assert(code.match(/\<\s*!DOCTYPE\s+html\s*\>/));
+```
+
+Ni lazima `` iwe iko juu ya hati.
+
+```js
+const noSpaces = code.replace(/\s/g, '');
+assert(noSpaces.match(/^\<\!DOCTYPEhtml\>\
+--fcc-editable-region--
+
+ CatPhotoApp
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efada803cbd2bbdab94e332.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efada803cbd2bbdab94e332.md
new file mode 100644
index 00000000000..8f2ec948fb2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efada803cbd2bbdab94e332.md
@@ -0,0 +1,100 @@
+---
+id: 5efada803cbd2bbdab94e332
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Ndani ya kipengele cha `figure` ulichoongeza hivi punde, weka kipengele cha `img` chenye sifa ya `src` iliyowekwa `https://cdn.freecodecamp.org/curriculum/cat-photo-app/cats.jpg`.
+
+# --hints--
+
+Kipengele chako cha pili cha `figure` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelectorAll('figure').length >= 2);
+```
+
+Kipengele chako cha pili cha `figure` kinafaa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/figure>/g).length >= 2);
+```
+
+Kunapaswa kuwa na kipengele cha pili cha `figure` juu ya tagi ya kufunga ya kipengele cha pili cha `section`. Unazo katika mpangilio mbaya.
+
+```js
+assert($('main > section')[1].lastElementChild.nodeName === 'FIGURE');
+```
+
+Unapaswa kuwa na kipengele cha tatu cha `img` kilichowekwa katika kipengele cha `figure`.
+
+```js
+const catsImg = document.querySelectorAll('figure > img')[1];
+assert(
+ catsImg
+);
+```
+
+Picha ya tatu inapaswa kuwa na sifa ya `src` iliyowekwa kuwa `https://cdn.freecodecamp.org/curriculum/cat-photo-app/cats.jpg`.
+
+```js
+const catsImg = document.querySelectorAll('figure > img')[1];
+assert(
+ catsImg &&
+ catsImg.getAttribute('src').toLowerCase() === 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/cats.jpg'
+);
+```
+
+Ingawa umeweka `src` ya picha mpya kwenye URL sahihi, inashauriwa kuzunguka thamani ya sifa kila wakati kwa alama za nukuu.
+
+```js
+assert(!/\
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae0543cbd2bbdab94e333.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae0543cbd2bbdab94e333.md
new file mode 100644
index 00000000000..be55445755b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae0543cbd2bbdab94e333.md
@@ -0,0 +1,99 @@
+---
+id: 5efae0543cbd2bbdab94e333
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Ili kuboresha ufikiaji wa picha uliyoongeza, ongeza sifa ya `alt` pamoja na maandishi:
+
+`Five cats looking around a field.`
+
+# --hints--
+
+Kipengele chako cha `figure` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelectorAll('figure').length === 2);
+```
+
+Kipengele chako cha `figure` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/figure>/g).length === 2);
+```
+
+Kunapaswa kuwa na kipengele cha `figure` juu ya tagi ya mwisho ya kufunga ya kipengele cha pili cha `section`.
+
+```js
+assert($('main > section')[1].lastElementChild.nodeName === 'FIGURE');
+```
+
+Kipengee cha Cats cha `img` kinapaswa kuwekwa katika kipengee cha `figure`.
+
+```js
+const catsImg = document.querySelectorAll('figure > img')[1];
+assert(
+ catsImg &&
+ catsImg.getAttribute('src').toLowerCase() === 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/cats.jpg'
+);
+```
+
+Kipengele cha Cats cha `img` kinapaswa kuwa na sifa ya `alt` yenye thamani `Five cats looking around a field.`
+
+```js
+const catsImg = document.querySelectorAll('figure > img')[1];
+assert(
+ catsImg
+ .getAttribute('alt')
+ .replace(/\s+/g, ' ')
+ .match(/^Five cats looking around a field\.?$/i)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae16e3cbd2bbdab94e334.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae16e3cbd2bbdab94e334.md
new file mode 100644
index 00000000000..0f9bd01a62c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae16e3cbd2bbdab94e334.md
@@ -0,0 +1,124 @@
+---
+id: 5efae16e3cbd2bbdab94e334
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Baada ya kipengele cha mwisho cha `img`, ongeza kipengele cha `figcaption` chenye maandishi `Cats hate other cats.`
+
+# --hints--
+
+Kipengee chako cha `figcaption` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelectorAll('figcaption').length === 2);
+```
+
+Kipengee chako cha `figcaption` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/figcaption\>/g).length === 2);
+```
+
+Kunapaswa kuwa na kipengele cha `figure` juu ya tagi ya kufunga ya kipengele cha pili cha `section`.
+
+```js
+assert($('main > section')[1].lastElementChild.nodeName === 'FIGURE');
+```
+
+Kipengele cha mwisho cha `img` kinafaa kuwekwa kwenye kipengee cha `figure`.
+
+```js
+const catsImg = document.querySelectorAll('figure > img')[1];
+assert(
+ catsImg &&
+ catsImg.getAttribute('src').toLowerCase() === 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/cats.jpg'
+);
+```
+
+Kipengele chako cha `figure` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelectorAll('figure').length === 2);
+```
+
+Kipengele chako cha `figure` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/figure\>/g).length === 2);
+```
+
+Kipengee chako kipya cha `figcaption` kinapaswa kuwekwa katika kipengele cha `figure`.
+
+```js
+assert(document.querySelectorAll('figure > figcaption').length === 2);
+```
+
+Kipengele cha `figcaption` kilichowekwa katika kipengele cha `figure` lazima kiwe chini ya kipengele cha `img`. Una kipengele cha `img` na kipengele cha `figcaption` katika mpangilio usio sahihi.
+
+```js
+assert(
+ document.querySelectorAll('figcaption')[1].previousElementSibling.nodeName ===
+ 'IMG'
+);
+```
+
+Maandishi ya kipengele cha `figcaption` yanapaswa kuwa `Cats hate other cats.` Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+assert(
+ document
+ .querySelectorAll('figcaption')[1]
+ .innerText.toLowerCase()
+ .match(/Cats hate other cats\.?$/i)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+--fcc-editable-region--
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb23e70dc218d6c85f89b1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb23e70dc218d6c85f89b1.md
new file mode 100644
index 00000000000..0eaa2e965fc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb23e70dc218d6c85f89b1.md
@@ -0,0 +1,104 @@
+---
+id: 5efb23e70dc218d6c85f89b1
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Kuna aina nyingi za ingizo unazoweza kuunda kwa kutumia sifa ya `type`. Unaweza kuunda sehemu ya nenosiri kwa urahisi, kitufe cha kuweka upya au kidhibiti ili kuwaruhusu watumiaji kuchagua faili kutoka kwa kompyuta zao.
+
+Unda sehemu ya maandishi ili kupata maandishi kutoka kwa mtumiaji kwa kuongeza sifa ya `type` yenye thamani `text` kwenye kipengele cha `input`.
+
+# --hints--
+
+Umefuta kipengele chako cha `input` au kina sintaksia batili. Ikiwa umeongeza sifa, hakikisha thamani zao zimezungukwa na alama za nukuu.
+
+```js
+assert($('input').length);
+```
+
+`form` yako inapaswa kuwa na kipengele cha `input` pekee. Ondoa vipengele au maandishi yoyote ya HTML kati ya tagi za kipengele cha `form`.
+
+```js
+assert(
+ $('form')[0].children.length === 1 &&
+ $('form')[0].innerText.trim().length === 0
+);
+```
+
+Kipengele chako cha `input` hakina sifa ya `type` yenye thamani ya`text`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert($('input')[0].hasAttribute('type'));
+```
+
+Kipengele chako kipya cha `input` kinafaa kuwa na sifa ya `type` yenye thamani ya`text`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert(
+ $('input')[0]
+ .getAttribute('type')
+ .replace(/\s+/g, ' ')
+ .match(/^text$/i)
+);
+```
+
+Ingawa umeweka sifa mpya ya kipengele cha `input` ya `type` kuwa `text`, inashauriwa kuzunguka thamani ya sifa kwa alama za nukuu kila wakati.
+
+```js
+assert(!/\
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb2c990dc218d6c85f89b2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb2c990dc218d6c85f89b2.md
new file mode 100644
index 00000000000..5dc14b21e48
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb2c990dc218d6c85f89b2.md
@@ -0,0 +1,101 @@
+---
+id: 5efb2c990dc218d6c85f89b2
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Ingawa uliongeza kitufe chako chini ya maandishi, yanaonekana karibu na kila moja kwenye ukurasa. Hiyo ni kwa sababu vipengele vyote viwili vya `input` na `button` ni inline elements , ambavyo havionekani kwenye laini mpya.
+
+Kitufe ulichoongeza kitawasilisha fomu kwa chaguomsingi. Walakini, kutegemea tabia chaguo-msingi kunaweza kusababisha mkanganyiko. Ongeza sifa ya `type` yenye thamani `submit` kwenye `button` ili kuweka wazi kuwa ni kitufe cha kuwasilisha.
+
+# --hints--
+
+Kipengee chako cha `button` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelector('button'));
+```
+
+Kipengee chako cha `button` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/button\>/));
+```
+
+Kipengele chako cha `button` hakina sifa ya `type`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua.
+
+```js
+assert($('button')[0].hasAttribute('type'));
+```
+
+Kipengele chako cha `button` kinafaa kuwa na sifa ya `type` yenye thamani ya`submit`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert(
+ $('button')[0]
+ .getAttribute('type')
+ .match(/^submit$/i)
+);
+```
+
+Ingawa umeweka sifa mpya ya kipengele cha `button` ya `type` kuwa `submit`, inashauriwa kuzunguka thamani ya sifa kwa alama za nukuu kila wakati.
+
+```js
+assert(!/\<\s*button\s+type\s*=\s*submit/i.test(code));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc4f528d6a74d05e68af74.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc4f528d6a74d05e68af74.md
new file mode 100644
index 00000000000..0b463fed86f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc4f528d6a74d05e68af74.md
@@ -0,0 +1,140 @@
+---
+id: 5efc4f528d6a74d05e68af74
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Kuna njia nyingine ya kuhusisha maandishi ya kipengele cha `input` na kipengele chenyewe. Unaweza kuweka maandishi ndani ya `label` na kuongeza sifa ya `for` yenye thamani sawa na kipengele cha `input` cha sifa ya `id`.
+
+Husianisha maandishi `Loving` na kisanduku cha kuteua kwa kuweka tu maandishi `Loving` katika `label` na kukipa sifa sahihi ya `for`.
+
+# --hints--
+
+Unapaswa kuhakikisha kuwa kitufe cha kuteua bado kipo.
+
+```js
+assert($('input[type="checkbox"]')[0]);
+```
+
+Kitufe chako cha kuteua kinafaa kuwa na sifa ya `id` yenye thamani ya `loving`. `--fcc-expected--` inatarajiwalakini inayopatikana ni `--fcc-actual--`.
+
+```js
+assert.equal($('input[type="checkbox"]')[0].id, 'loving');
+```
+
+Maandishi `Loving` yanapaswa kufungwa katika kipengele cha `label`.
+
+```js
+const checkboxInputElem = $('input[type="checkbox"]')[0];
+assert(
+ /Loving/i.test(checkboxInputElem.nextElementSibling.innerText.replace(/\s+/g, ' '))
+);
+```
+
+Utahitaji kuongeza kipengele kipya cha `label` ili kuweka maandishi `Loving`. Hakikisha kuwa ina tagi ya kufungua na kufunga.
+
+```js
+assert(
+ document.querySelectorAll('label').length === 3 &&
+ code.match(/<\/label\>/g).length === 3
+);
+```
+
+Kipengele kipya cha `label` kinapaswa kupatikana moja kwa moja upande wa kulia wa kisanduku chako cha kuteua. Hakikisha kuna nafasi kati ya vipengele viwili.
+
+```js
+const checkboxInputElem = $('input[type="checkbox"]')[0];
+assert(checkboxInputElem.nextElementSibling.nodeName === 'LABEL');
+```
+
+Kipengele kipya cha `label` hakina sifa ya `for`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua.
+
+```js
+const labelElem = $('input[type="checkbox"]')[0].nextElementSibling;
+assert(labelElem.hasAttribute('for'));
+```
+
+Kipengele kipya cha `label` kinafaa kuwa na sifa ya `for` yenye thamani ya`loving`. `--fcc-expected--` inatarajiwa lakini inayopatikana ni `--fcc-actual--`.
+
+```js
+const labelElem = $('input[type="checkbox"]')[0].nextElementSibling;
+assert.equal(labelElem.getAttribute('for'), 'loving');
+```
+
+Maandishi `Loving` yanapaswa kufungwa katika kipengele cha `label`. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+const labelElem = document.querySelector('label[for="loving"]');
+assert(labelElem.textContent.replace(/\s/g, '').match(/Loving/i));
+```
+
+Kunapaswa kuwa na nafasi kati ya kisanduku chako cha kuteua na kipengele chako kipya cha `label`.
+
+```js
+assert.match(code, />\s+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc518e8d6a74d05e68af75.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc518e8d6a74d05e68af75.md
new file mode 100644
index 00000000000..913142a8b83
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc518e8d6a74d05e68af75.md
@@ -0,0 +1,98 @@
+---
+id: 5efc518e8d6a74d05e68af75
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Ongeza sifa ya `name` yenye thamani `personality` kwenye kisanduku cha kuteua cha kipengele cha `input`.
+
+Ingawa hutagundua hili kwenye kivinjari, kufanya hivi hurahisisha seva kuchakata fomu yako ya wavuti, haswa wakati kuna visanduku vya kuteua vingi.
+
+# --hints--
+
+Unapaswa kuhakikisha kuwa kisanduku cha kuteua bado kipo.
+
+```js
+assert($('input[type="checkbox"]')[0]);
+```
+
+Kipengele cha kuteua cha `input` hakina sifa ya `name`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua.
+
+```js
+assert($('input[type="checkbox"]')[0].hasAttribute('name'));
+```
+
+Kipengele cha kisanduku cha kuteua cha `input` kinafaa kuwa na sifa ya `name` yenye thamani `personality`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert(
+ $('input[type="checkbox"]')[0]
+ .getAttribute('name')
+ .match(/^personality$/)
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc54138d6a74d05e68af76.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc54138d6a74d05e68af76.md
new file mode 100644
index 00000000000..eb677590b41
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc54138d6a74d05e68af76.md
@@ -0,0 +1,86 @@
+---
+id: 5efc54138d6a74d05e68af76
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Ongeza sifa ya `id` yenye thamani `loving` kwenye ingizo la kisanduku cha kuteua.
+
+# --hints--
+
+Kisanduku chako cha kuteua kinapaswa kuwa na sifa ya `id`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert($('input[type="checkbox"]')[0].hasAttribute('id'));
+```
+
+Kisanduku chako cha kuteua kinapaswa kuwa na sifa ya `id` yenye thamani ya `loving`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert($('input[type="checkbox"]')[0].id.match(/^loving$/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc575c8d6a74d05e68af77.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc575c8d6a74d05e68af77.md
new file mode 100644
index 00000000000..a8dff8d86e5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc575c8d6a74d05e68af77.md
@@ -0,0 +1,124 @@
+---
+id: 5efc575c8d6a74d05e68af77
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Ongeza kisanduku cha kuteua cha mwisho baada ya kile cha awali chenye thamani ya sifa ya `id` ya `energetic`. Sifa ya `name` inapaswa kuwa sawa na kisanduku cha kuteua cha awali.
+
+Pia ongeza kipengele cha `label` upande wa kulia wa kisanduku kipya cha kuteua chenye maandishi `Energetic`. Hakikisha kuwa umehusisha kipengele cha `label` na kisanduku cha kuteua kipya.
+
+# --hints--
+
+Unahitaji kuongeza kisanduku cha kuteua kipya.
+
+```js
+assert($('input[type="checkbox"]').length === 3);
+```
+
+Kisanduku chako kipya cha kuteua kinapaswa kuwa na sifa ya `id` yenye thamani `energetic` na sifa ya `name` yenye thamani `personality`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+const checkboxes = [...$('input[type="checkbox"]')];
+assert(
+ checkboxes.some(
+ (checkbox) =>
+ checkbox.id === 'energetic' &&
+ checkbox.getAttribute('name') === 'personality'
+ )
+);
+```
+
+Kisanduku chako kipya cha kuteua kinapaswa kuwa baada ya cha pili. Unazo katika mpangilio mbaya.
+
+```js
+const checkboxes = [...$('input[type="checkbox"]')].map(
+ (checkbox) => checkbox.id
+);
+assert(checkboxes.indexOf('lazy') < checkboxes.indexOf('energetic'));
+```
+
+Katika upande wa kulia wa kisanduku chako kipya cha kuteua, kunapaswa kuwa na kipengele cha `label` chenye maandishi `Energetic`.
+
+```js
+const nextElementSibling = $('input[type="checkbox"]')[2].nextElementSibling;
+assert(
+ nextElementSibling.nodeName === 'LABEL' &&
+ nextElementSibling.innerText.replace(/\s+/g, '').match(/^Energetic$/i)
+);
+```
+
+`label` mpya inapaswa kuwa na sifa ya `for` yenye thamani sawa na sifa ya `id` ya kisanduku kipya cha kuteua. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+assert(
+ $('input[type="checkbox"]')[2].nextElementSibling.getAttribute('for') ===
+ 'energetic'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f05a1d8e233dff4a68508d8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f05a1d8e233dff4a68508d8.md
new file mode 100644
index 00000000000..173500e9e97
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f05a1d8e233dff4a68508d8.md
@@ -0,0 +1,137 @@
+---
+id: 5f05a1d8e233dff4a68508d8
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Unda kitufe kingine cha redio chini ya cha kwanza. Iweke ndani ya kipengele cha `label` chenye `Outdoor` kama maandishi ya `label`. Ipe kitufe cha redio sifa ya `id` iliyo na `outdoor` kama thamani.
+
+# --hints--
+
+Kitufe asili cha redio cha`input` pekee `Indoor` ndio kinapaswa kuwa na `id` iliyowekwa `indoor`. Unaweza kuanzisha upya hatua ili kurudisha HTML asili ikihitajika.
+
+```js
+assert(document.querySelectorAll('#indoor').length < 2);
+```
+
+Hupaswi kufanya mabadiliko yoyote kwenye kitufe cha redio cha `Indoor`. Unaweza kuanzisha upya hatua ili kurudisha HTML asili ikihitajika.
+
+```js
+const indoorInput = document.querySelectorAll('#indoor');
+assert(
+ indoorInput.length == 1 &&
+ indoorInput[0]?.nodeName?.toUpperCase() === 'INPUT' &&
+ indoorInput[0]?.type === 'radio' &&
+ code.match(/\s* ]*(id=["']?indoor["']?)[^>]*>\s*Indoor\s*<\/label>/)
+);
+```
+
+Unapaswa kuongeza kipengele kimoja kipya cha `input` kilichowekwa katika kipengele kipya cha `label`. Hakikisha `label` yako mpya ina tagi ya kufungua na kufunga.
+
+```js
+assert(document.querySelectorAll('label input').length === 2);
+```
+
+Hupaswi kuongeza sifa zozote kwenye tagi ya kufungua ya `label`.
+
+```js
+assert(code.match(//g).length === 2);
+```
+
+`input` yako mpya inapaswa kuwa na sifa ya `id` yenye thamani `outdoor`.
+
+```js
+assert(document.querySelector('label input[id="outdoor"]'));
+```
+
+`input` yako mpya inapaswa kuwa na sifa ya `type` yenye thamani `radio`.
+
+```js
+assert(document.querySelector('label input[id="outdoor"][type="radio"]'));
+```
+
+Hupaswi kuongeza vipengele vyovyote vipya isipokuwa `input` iliyowekwa katika `label`.
+
+```js
+assert(document.querySelector('label input[id="outdoor"]:only-child'));
+```
+
+Kusiwe na maandishi upande wa kushoto wa `input` yako mpya.
+
+```js
+const outdoorBtn = document.querySelector('label input[id="outdoor"]');
+assert(
+ outdoorBtn?.previousSibling?.nodeName !== '#text' ||
+ outdoorBtn?.previousSibling?.nodeValue?.replace(/\s/g, '') === ''
+);
+```
+
+Maandishi ya lebo ya kitufe chako kipya cha redio lazima yawe `Outdoor`. Hii ni pamoja na herufi kubwa.
+
+```js
+assert(document.querySelector('label > input[id="outdoor"]')?.nextSibling?.nodeValue?.replace(/^\s+|\s+$/g, '') === 'Outdoor');
+```
+
+Kitufe na lebo yako mpya ya redio inapaswa kuwa mara moja chini/baada ya kitufe cha redio na lebo ya `Indoor`. Kusiwe na tagi zingine kati yao.
+
+```js
+assert(code.match(/<\/label>\s*\s* ]+>\s*Outdoor/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07be6ef7412fbad0c5626b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07be6ef7412fbad0c5626b.md
new file mode 100644
index 00000000000..14d145f9441
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07be6ef7412fbad0c5626b.md
@@ -0,0 +1,73 @@
+---
+id: 5f07be6ef7412fbad0c5626b
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Kabla ya kuongeza maudhui yoyote mapya, unapaswa kutumia kipengele cha `section` ili kutenganisha maudhui ya picha za paka na maudhui ya baadaye.
+
+Chukua vipengele vyako vya `h2`, maoni, `p` na tia nanga (`a`) na uviweke kwenye kipengele cha `section`.
+
+# --hints--
+
+Kipengee chako cha `section` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('section'));
+```
+
+Kipengee chako cha `section` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/section\s*>/i));
+```
+
+Kipengele kizima cha `section` kinafaa kuwa ndani ya tagi za ufunguzi na za kufunga za kipengele cha `main`.
+
+```js
+assert(document.querySelector('section').parentNode.nodeName === 'MAIN');
+```
+
+Kipengele kilichopo cha `h2`, maoni, `p`, na nanga (`a`) kinapaswa kuwa kati ya tagi za kufungua na kufunga za kipengele cha `section`.
+
+```js
+const childrenOfSection = [...document.querySelector('section').childNodes];
+const foundElements = childrenOfSection.filter((child) => {
+ return ['H2', 'A', 'P'].includes(child.nodeName);
+});
+assert(foundElements.length === 3);
+```
+
+Kipengee chako cha `h1` hakipaswi kuwekwa kwenye kipengee chako cha `section`.
+
+```js
+const childrenOfSection = [...document.querySelector('section').childNodes];
+const includesH1 = childrenOfSection.some((child) => child.nodeName === 'H1');
+assert.isFalse(includesH1);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+ --fcc-editable-region--
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07c98cdb9413cbd4b16750.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07c98cdb9413cbd4b16750.md
new file mode 100644
index 00000000000..24237bcb949
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07c98cdb9413cbd4b16750.md
@@ -0,0 +1,82 @@
+---
+id: 5f07c98cdb9413cbd4b16750
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Ni wakati wa kuongeza sehemu mpya. Ongeza kipengele cha pili cha `section` chini ya kipengele cha `section` kilichopo.
+
+# --hints--
+
+Kipengee chako cha `section` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelectorAll('section').length >= 2);
+```
+
+Unapaswa kuongeza tu tagi moja ya ufunguzi ya `section`. Tafadhali ondoa ziada yoyote.
+
+```js
+assert(document.querySelectorAll('section').length === 2);
+```
+
+Kipengee chako cha `section` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/section>/g).length >= 2);
+```
+
+Unapaswa kuongeza tu tagi moja ya kufunga ya `section`. Tafadhali ondoa ziada yoyote.
+
+```js
+assert(code.match(/<\/section>/g).length === 2);
+```
+
+Kipengele cha pili cha `section` hakipaswi kuwekwa ndani ya kipengee cha kwanza cha `section`.
+
+```js
+const childrenOf1stSection = [
+ ...document.querySelector('main > section').children
+];
+const foundElems = childrenOf1stSection.filter((child) => {
+ return child.nodeName === 'SECTION';
+});
+assert(foundElems.length === 0);
+```
+
+Vipengele vyote viwili vya `section` vinapaswa kuwa kati ya tagi za kufungua na kufunga za kipengele cha `main`.
+
+```js
+const childrenOfMain = [...document.querySelector('main').children];
+const foundElems = childrenOfMain.filter((child) => {
+ return child.nodeName === 'SECTION';
+});
+assert(foundElems.length === 2);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+--fcc-editable-region--
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07fb1579dc934717801375.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07fb1579dc934717801375.md
new file mode 100644
index 00000000000..52663a63065
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07fb1579dc934717801375.md
@@ -0,0 +1,99 @@
+---
+id: 5f07fb1579dc934717801375
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Ni wakati wa kuongeza sehemu mpya. Ongeza kipengele cha tatu cha `section` chini ya kipengele cha pili cha `section`.
+
+# --hints--
+
+Kipengee chako cha `section` kinapaswa kuwa na tagi ya ufunguzi. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelectorAll('section').length >= 3);
+```
+
+Unapaswa kuongeza tu tagi moja ya ufunguzi ya `section`. Tafadhali ondoa ziada yoyote.
+
+```js
+assert(document.querySelectorAll('section').length === 3);
+```
+
+Kipengee chako cha `section` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/section>/g).length >= 3);
+```
+
+Unapaswa kuongeza tu tagi moja ya kufunga ya `section`. Tafadhali ondoa ziada yoyote.
+
+```js
+assert(code.match(/<\/section>/g).length === 3);
+```
+
+Vipengele vyote vya `section` vinapaswa kuwa kati ya tagi za kufungua na kufunga za kipengele cha `main`.
+
+```js
+const childrenOfMain = [...document.querySelector('main').children];
+const sectionElemsFound = childrenOfMain.filter((child) => {
+ return child.nodeName === 'SECTION';
+});
+assert(sectionElemsFound.length === 3);
+```
+
+Kipengele cha mwisho cha `section` hakipaswi kuwa na maudhui. Ondoa vipengele au maandishi yoyote ya HTML kati kipengele cha `section`.
+
+```js
+assert($('main > section')[2].children.length === 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+--fcc-editable-region--
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md
new file mode 100644
index 00000000000..7f5ee51ce1b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md
@@ -0,0 +1,106 @@
+---
+id: 5f0d48e7b435f13ab6550051
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Kipengele cha `legend` hufanya kazi kama maelezo mafupi kwa maudhui katika kipengele cha `fieldset`. Huwapa watumiaji muktadha kuhusu kile wanachopaswa kuingiza katika sehemu hiyo ya fomu.
+
+Ongeza kipengele cha `legend` chenye maandishi `Is your cat an indoor or outdoor cat?` juu ya vitufe vyote viwili vya redio.
+
+# --hints--
+
+Kipengele chako cha `legend` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia ifuatayo: ``.
+
+```js
+assert(document.querySelector('legend'));
+```
+
+Kipengele chako cha `legend` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/legend\>/));
+```
+
+Kipengele chako cha `legend` lazima kiwe kipengele cha kwanza chini ya tagi ya ufunguzi ya kipengele cha `fieldset` na kabla ya kitufe cha kwanza cha redio kufungua tagi ya `label`. Haiko katika nafasi sahihi.
+
+```js
+const fieldsetElem = document.querySelector('fieldset');
+const fieldsetElemChildren = fieldsetElem.children;
+assert(
+ fieldsetElem.firstElementChild.nodeName === 'LEGEND' &&
+ fieldsetElemChildren[1].nodeName === 'LABEL' &&
+ fieldsetElemChildren[1].children[0].nodeName === 'INPUT' &&
+ fieldsetElemChildren[1].children[0].id === 'indoor'
+);
+```
+
+Maandishi ya kipengele chako cha `legend` yanapaswa kuwa `Is your cat an indoor or outdoor cat?`. Aidha umeacha maandishi, umeandika makosa, au haiko kati ya tagi za kufungua na kufunga za kipengele cha `legend`.
+
+```js
+const extraSpacesRemoved = document
+ .querySelector('legend')
+ .innerText.replace(/\s+/g, ' ');
+assert(extraSpacesRemoved.match(/Is your cat an indoor or outdoor cat\??$/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4ab1b435f13ab6550052.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4ab1b435f13ab6550052.md
new file mode 100644
index 00000000000..a35d11c9dd5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4ab1b435f13ab6550052.md
@@ -0,0 +1,129 @@
+---
+id: 5f0d4ab1b435f13ab6550052
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Kisha, utaongeza vipengee vingine vya fomu mpya ya `input`, kwa hivyo ongeza kipengee kingine cha `fieldset` moja kwa moja chini ya kipengele cha sasa cha `fieldset`.
+
+# --hints--
+
+Kipengele chako kipya cha `fieldset` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+assert(document.querySelectorAll('fieldset').length >= 2);
+```
+
+Unapaswa kuongeza tu tagi moja ya ufunguzi ya `fieldset`. Tafadhali ondoa ziada yoyote.
+
+```js
+assert(document.querySelectorAll('fieldset').length === 2);
+```
+
+Kipengele chako cha `fieldset` kinafaa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/fieldset>/g).length >= 2);
+```
+
+Unapaswa kuongeza tu tagi moja ya kufunga ya `fieldset`. Tafadhali ondoa ziada yoyote.
+
+```js
+assert(code.match(/<\/fieldset>/g).length === 2);
+```
+
+Kipengele cha pili cha `fieldset` hakipaswi kuwekwa katika kipengee cha kwanza cha `fieldset`.
+
+```js
+const childrenOf1stFieldset = [
+ ...document.querySelector('form > fieldset').children
+];
+const foundElems = childrenOf1stFieldset.filter((child) => {
+ return child.nodeName === 'FIELDSET';
+});
+assert(foundElems.length === 0);
+```
+
+Vipengele vyote viwili vya `fieldset` vinapaswa kuwa juu ya sehemu ya maandishi. Viko nje ya utaratibu.
+
+```js
+const formChildren = $('form')[0].children;
+assert(
+ formChildren[0].nodeName === 'FIELDSET' &&
+ formChildren[1].nodeName === 'FIELDSET' &&
+ formChildren[2] &&
+ formChildren[2].nodeName === 'INPUT' &&
+ formChildren[2].getAttribute('type') === 'text'
+);
+```
+
+Kipengele chako kipya cha `fieldset` lazima kiwe chini ya kipengele cha `fieldset` kilichopo. Unazo katika mpangilio mbaya.
+
+```js
+const fieldsetChildren = [...document.querySelectorAll('fieldset')].map(
+ (elem) => elem.children
+);
+assert(fieldsetChildren[0].length > fieldsetChildren[1].length);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md
new file mode 100644
index 00000000000..c11dc36216e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md
@@ -0,0 +1,115 @@
+---
+id: 5f0d4d04b435f13ab6550053
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Ongeza kipengele cha `legend` chenye maandishi `What's your cat's personality?` ndani ya kipengele cha pili cha `fieldset`.
+
+# --hints--
+
+Aidha umefuta kipengele cha pili cha `fieldset` au kinakosa tagi ya ufunguzi au ya kufunga.
+
+```js
+assert(
+ document.querySelectorAll('fieldset').length === 2 &&
+ code.match(/<\/fieldset>/g).length === 2
+);
+```
+
+Kipengele chako cha `legend` kinafaa kuwa na tagi ya kufungua. Tagi za ufunguzi zina sintaksia hii: ``.
+
+```js
+const secondFieldset = $('fieldset')[1];
+assert(
+ secondFieldset &&
+ [...secondFieldset.children].filter((child) => child.nodeName === 'LEGEND')
+ .length
+);
+```
+
+Kipengele chako cha `legend` kinapaswa kuwa na tagi ya kufunga. Tagi za kufunga zina `/` mara baada ya herufi ya `<`.
+
+```js
+assert(code.match(/<\/legend\>/g).length === 2);
+```
+
+Kipengele cha `legend` kinapaswa kuwa na maandishi `What's your cat's personality?`. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+const secondFieldset = $('fieldset')[1];
+assert(
+ secondFieldset &&
+ [...secondFieldset.children].filter((child) => {
+ const extraSpacesRemoved = child.innerText.replace(/\s+/g, ' ');
+ return (
+ child.nodeName === 'LEGEND' &&
+ extraSpacesRemoved.match(/What's your cat's personality\??$/i)
+ );
+ }).length
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a80975fc4bcae0edb3497.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a80975fc4bcae0edb3497.md
new file mode 100644
index 00000000000..541c11001dd
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a80975fc4bcae0edb3497.md
@@ -0,0 +1,108 @@
+---
+id: 5f1a80975fc4bcae0edb3497
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Ukichagua kitufe cha redio cha `Indoor` na kuwasilisha fomu, data ya fomu ya kitufe inategemea sifa zake za `name` na `value`. Kwa kuwa vitufe vyako vya redio havina sifa ya `value`, data ya fomu itajumuisha `indoor-outdoor=on`, ambayo si muhimu ukiwa na vitufe vingi.
+
+Ongeza sifa ya `value` kwa vitufe vyote vya redio. Kwa urahisishaji, weka sifa ya `value` kwa kila kitufe na thamani sawa na sifa yake ya `id`.
+
+# --hints--
+
+Vitufe vyote vya redio bado vinapaswa kupatikana kati ya tagi za kufungua na kufunga za vipengee vya `label`.
+
+```js
+const labelChildNodes = [...document.querySelectorAll('form > label')].map(
+ (node) => node.childNodes
+);
+assert(
+ labelChildNodes.filter((childNode) => childNode[0].nodeName === 'INPUT')
+ .length === 2
+);
+```
+
+Vitufe vyote vya redio vinapaswa kuwa na sifa ya `value`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+const radioButtons = [...document.querySelectorAll('input[type="radio"]')];
+assert(radioButtons.every((btn) => btn.hasAttribute('value')));
+```
+
+Vitufe vyako vyote vya redio vinapaswa kuwa na sifa ya `type`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+const radioButtons = [...document.querySelectorAll('input')];
+assert(radioButtons.every((btn) => btn.hasAttribute('type')));
+```
+
+Kitufe cha redio cha `Indoor` cha sifa ya `value` inapaswa kuwekwa kuwa `indoor`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+const indoorRadioButton = document.querySelector('#indoor');
+assert(indoorRadioButton.getAttribute('value').match(/^indoor$/));
+```
+
+Kitufe cha redio cha `Outdoor` cha sifa ya `value` inapaswa kuwekwa kuwa `outdoor`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+const outdoorRadioButton = document.querySelector('#outdoor');
+assert(outdoorRadioButton.getAttribute('value').match(/^outdoor$/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md
new file mode 100644
index 00000000000..75b53b6fab4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md
@@ -0,0 +1,106 @@
+---
+id: 5f1a89f1190aff21ae42105a
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Kama vile vitufe vya redio, data ya fomu ya visanduku vya kuteua vilivyochaguliwa ni jozi za sifa za `name` / `value`. Ingawa sifa ya `value` ni ya hiari, ni bora kuijumuisha pamoja na visanduku vya kuteua au vitufe vya redio kwenye ukurasa.
+
+Ongeza sifa ya `value` kwa kila kisanduku cha kuteua. Kwa urahisishaji, weka sifa ya `value` kwa kila kisanduku cha kuteua sifa kama thamani sawa na sifa yake ya `id`.
+
+# --hints--
+
+Visanduku vya kuteua vyote vitatu vinapaswa kuwa na sifa ya `value`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+const checkboxes = [...document.querySelectorAll('input[type="checkbox"]')];
+assert(checkboxes.every((checkbox) => checkbox.hasAttribute('value')));
+```
+
+Sifa ya `value` ya kisanduku cha kuteua cha `Loving` inapaswa kuwekwa kuwa `loving`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+const lovingCheckbox = document.querySelector('#loving');
+assert(lovingCheckbox.getAttribute('value').match(/^loving$/));
+```
+
+Sifa ya `value` ya kisanduku cha kuteua cha `Lazy` inapaswa kuwekwa kuwa `lazy`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+const lazyCheckbox = document.querySelector('#lazy');
+assert(lazyCheckbox.getAttribute('value').match(/^lazy$/));
+```
+
+Sifa ya `value` ya kisanduku cha kuteua cha `Energetic` inapaswa kuwekwa kuwa `energetic`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+const energeticCheckbox = document.querySelector('#energetic');
+assert(energeticCheckbox.getAttribute('value').match(/^energetic$/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md
new file mode 100644
index 00000000000..e446d648ec5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md
@@ -0,0 +1,179 @@
+---
+id: 62bb4009e3458a128ff57d5d
+title: Hatua ya 69
+challengeType: 0
+dashedName: step-69
+---
+
+# --description--
+
+Unaweza kuweka tabia ya kivinjari kwa kuongeza vipengele vya kujifunga vya `meta` katika `head`. Hapa kuna mfano:
+
+```html
+
+```
+
+Kiambie kivinjari kichanganue alama katika lugha nyingi kwa kuunda kipengele cha `meta` kama mtoto wa kipengele cha `head`. Weka sifa yake ya `charset` kuwa `UTF-8`.
+
+# --hints--
+
+Unapaswa kuunda kipengele cha kujifunga cha `meta` ndani ya kipengele cha `head`.
+
+```js
+assert.exists(document.querySelector('head > meta'));
+```
+
+Unapaswa kukipa kipengele cha `meta` `charset` ya `UTF-8`.
+
+```js
+assert.equal(document.querySelector('head > meta')?.getAttribute('charset')?.toLowerCase(), 'utf-8');
+```
+
+Kipengele chako cha `meta` kinapaswa kuwa tagi ya kujifunga, huhitaji kuongeza ``.
+
+```js
+assert.notMatch(code, /<\/meta\s*>?/i);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+--fcc-editable-region--
+
+
+ CatPhotoApp
+
+--fcc-editable-region--
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+ CatPhotoApp
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md
new file mode 100644
index 00000000000..6f548c7dd46
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md
@@ -0,0 +1,84 @@
+---
+id: 62dabe2ef403a12d5d295273
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Kwa kuwa sasa umegeuza maandishi `cat photos` ndani ya kipengele cha `p` kuwa kiungo, huhitaji kiungo cha pili chini ya kipengele cha `p`. Futa kipengele kizima cha nanga chini ya kipengele cha `p`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengee kimoja tu cha nanga (`a`).
+
+```js
+assert(document.querySelectorAll('a').length === 1);
+```
+
+Kipengele cha `p` bado kinapaswa kuwa na kipengele cha nanga (`a`) ndani yake.
+
+```js
+assert($('p > a').length);
+```
+
+Thamani ya `href` ya kiungo inapaswa kuwa `https://freecatphotoapp.com`. Umeacha thamani ya `href` au umeandika makosa.
+
+```js
+const nestedAnchor = $('p > a')[0];
+assert(
+ nestedAnchor.getAttribute('href') === 'https://freecatphotoapp.com'
+);
+```
+
+Maandishi ya kiungo yanapaswa kuwa `cat photos`. Aidha umesahau maandishi, au kuna makosa ya maandishi.
+
+```js
+const nestedAnchor = $('p > a')[0];
+assert(
+ nestedAnchor.innerText.toLowerCase().replace(/\s+/g, ' ') === 'cat photos'
+);
+```
+
+Maudhui ya kipengele cha `p` yanayoonekana kwenye kivinjari yanapaswa kuwa `See more cat photos in our gallery.` Angalia tena maandishi, nafasi, au uakifishaji wa kipengee cha `p` na nanga iliyowekwa.
+
+```js
+const pText = document
+ .querySelector('p')
+ .innerText.toLowerCase()
+ .replace(/\s+/g, ' ');
+assert(pText.match(/see more cat photos in our gallery\.?$/));
+```
+
+Haipaswi kuwa na maandishi ya `cat photos` chini ya kipengele cha `p`.
+
+```js
+const pNextSibling = document.querySelector('p').nextSibling;
+assert(
+ pNextSibling.nodeName === '#text' && !/cat\s*photos/.test(pNextSibling.nodeValue) ||
+ pNextSibling.nodeName === 'IMG'
+);
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+ Cat Photos
+
+--fcc-editable-region--
+ See more cat photos in our gallery.
+ link to cat pictures
+--fcc-editable-region--
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md
new file mode 100644
index 00000000000..a8bc87a2543
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md
@@ -0,0 +1,103 @@
+---
+id: 7cf9b03d81a65668421804c3
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Ili data ya fomu iweze kufikiwa na eneo lililobainishwa katika sifa ya `action`, lazima upe sehemu ya maandishi sifa ya `name` na uikabidhi thamani ili kuwakilisha data inayowasilishwa. Kwa mfano, unaweza kutumia sintaksia ifuatayo kwa uga wa maandishi wa anwani ya barua pepe: ` `.
+
+Ongeza sifa ya `name` yenye thamani `catphotourl` kwenye sehemu yako ya maandishi.
+
+# --hints--
+
+Umefuta kipengele chako cha `input` au kina sintaksia batili. Thamani zote za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert($('input').length);
+```
+
+`form` yako inapaswa kuwa na kipengele cha `input` pekee. Ondoa vipengele au maandishi yoyote ya HTML kati ya kipengele cha `form`.
+
+```js
+assert(
+ $('form')[0].children.length === 1 &&
+ $('form')[0].innerText.trim().length === 0
+);
+```
+
+Kipengele chako cha kipya cha `input` hakina sifa ya `name`. Hakikisha kuwa kuna nafasi baada ya jina la tagi inayofungua na/au kuna nafasi kabla ya majina yote ya sifa.
+
+```js
+assert($('input')[0].hasAttribute('name'));
+```
+
+Kipengele chako kipya cha `input` kinafaa kuwa na sifa ya `name` yenye thamani ya`catphotourl`. Aidha umesahau maandishi, au kuna makosa ya maandishi. Kumbuka kwamba thamani za sifa zinapaswa kuzungukwa na alama za nukuu.
+
+```js
+assert(
+ $('input')[0]
+ .getAttribute('name')
+ .match(/^catphotourl$/i)
+);
+```
+
+Ingawa umeweka kipengele cha `input` cha sifa ya `name` kuwa `catphotourl`, inashauriwa kuzunguka thamani ya sifa kwa alama za nukuu kila wakati.
+
+```js
+assert(!/\<\s*input\s+.*\s*=\s*catphotourl/.test(code));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ CatPhotoApp
+
+ Cat Photos
+
+ See more cat photos in our gallery.
+
+
+
+ Cat Lists
+ Things cats love:
+
+ cat nip
+ laser pointers
+ lasagna
+
+
+
+ Cats love lasagna.
+
+ Top 3 things cats hate:
+
+ flea treatment
+ thunder
+ other cats
+
+
+
+ Cats hate other cats.
+
+
+
+
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60eebd07ea685b0e777b5583.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60eebd07ea685b0e777b5583.md
new file mode 100644
index 00000000000..1d81f975de6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60eebd07ea685b0e777b5583.md
@@ -0,0 +1,52 @@
+---
+id: 60eebd07ea685b0e777b5583
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Karibu kwenye mradi wa Fomu ya Usajili! Anza kwa kuongeza tamko la `!DOCTYPE html` juu ya hati ili kivinjari kijue ni aina gani ya hati inayosoma.
+
+# --hints--
+
+Code yako inapaswa kuwa na rejeleo la `DOCTYPE`.
+
+```js
+assert(code.match(/` baada ya aina.
+
+```js
+assert(code.match(/html\s*>/gi));
+```
+
+Tamko lako la `DOCTYPE` linapaswa kuwa mwanzoni mwa HTML yako.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027099a15b00485563dd2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027099a15b00485563dd2.md
new file mode 100644
index 00000000000..e22d17f0808
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027099a15b00485563dd2.md
@@ -0,0 +1,54 @@
+---
+id: 60f027099a15b00485563dd2
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Chini ya `DOCTYPE`, ongeza kipengele cha `html` chenye sifa ya `lang` iliyowekwa kuwa `en`, ili upate nafasi kuanza kuweka msimbo.
+
+# --hints--
+
+Tamko lako la `DOCTYPE` linapaswa kuwa mwanzoni mwa HTML yako.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+Kipengele chako cha `html` kinafaa kuwa na tagi ya ufunguzi yenye sifa ya `lang` iliyo na thamani ya `en`.
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufunga.
+
+```js
+assert(code.match(/<\/html\s*>/));
+```
+
+Tagi zako `html` zinapaswa kuwa katika mpangilio sahihi.
+
+```js
+assert(code.match(/\s*<\/html\s*>/));
+```
+
+Unapaswa kuwa na kipengele kimoja cha `html` tu.
+
+```js
+// Possibly a redundant test, as browser fixes this
+assert(document.querySelectorAll('html').length === 1);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027c87bc98f050395c139.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027c87bc98f050395c139.md
new file mode 100644
index 00000000000..0f23ead10fb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027c87bc98f050395c139.md
@@ -0,0 +1,67 @@
+---
+id: 60f027c87bc98f050395c139
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Kisha, ongeza tagi za kufungua na kufunga za `head` na `body` ndani ya kipengele cha `html`.
+
+# --hints--
+
+Unapaswa kuwa na tagi ya kufungua ya `head`.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `head`.
+
+```js
+assert(code.match(/<\/head\s*>/i));
+```
+
+Unapaswa kuwa na tagi ya kufungua ya `body`.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `body`.
+
+```js
+assert(code.match(/<\/body\s*>/i));
+```
+
+Vipengele vya `head` na `body` vinapaswa kuwa ndugu.
+
+```js
+assert(document.querySelector('head')?.nextElementSibling.localName === 'body');
+```
+
+Kipengele cha `head` kinapaswa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'head'));
+```
+
+Kipengele cha `body` kinapaswa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'body'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f0286404aefb0562a4fdf9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f0286404aefb0562a4fdf9.md
new file mode 100644
index 00000000000..14cf2d95df4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f0286404aefb0562a4fdf9.md
@@ -0,0 +1,56 @@
+---
+id: 60f0286404aefb0562a4fdf9
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Unapaswa kuongeza kipengele cha `title` na `meta` kwenye `head`. Upe mradi wako jina la `Registration Form`, na ipe sifa ya `charset` yenye thamani ya `UTF-8` kwa kipengele cha `meta`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha `title`.
+
+```js
+const title = document.querySelector('title');
+assert.exists(title);
+```
+
+Kipengele cha `title` kinapaswa kuwa ndani ya kipengele cha `head`.
+
+```js
+assert.exists(document.querySelector('head > title'));
+```
+
+Mradi wako unapaswa kuwa na kichwa cha `Registration Form`.
+
+```js
+const title = document.querySelector('title');
+assert.equal(title.text.toLowerCase(), 'registration form')
+```
+
+Kumbuka, ukubwa wa herufi na tahajia ni jambo la muhimu katika kichwa.
+
+```js
+const title = document.querySelector('title');
+assert.equal(title.text, 'Registration Form');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+ --fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f02e7361b68405e27b62a5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f02e7361b68405e27b62a5.md
new file mode 100644
index 00000000000..ad2153d3baf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f02e7361b68405e27b62a5.md
@@ -0,0 +1,44 @@
+---
+id: 60f02e7361b68405e27b62a5
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Ndani ya `body`, toa muktadha wa kichwa cha maudhui, kwa kuongeza `h1` yenye maandishi `Registration Form`.
+
+# --hints--
+
+Unapaswa kuongeza `h1` ndani ya `body`.
+
+```js
+assert.exists(document.querySelector('body > h1'));
+```
+
+Unapaswa kuipa `h1` maandishi `Registration Form`.
+
+```js
+assert.equal(document.querySelector('body > h1')?.textContent, 'Registration Form');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f030d388cb74067cf291c3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f030d388cb74067cf291c3.md
new file mode 100644
index 00000000000..5bf201aee11
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f030d388cb74067cf291c3.md
@@ -0,0 +1,55 @@
+---
+id: 60f030d388cb74067cf291c3
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Chini ya kichwa, tumia maandishi yafuatayo ndani ya kipengele cha aya ili kuwahimiza watumiaji kujisajili:
+
+```md
+Please fill out this form with the required information
+```
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `p` kwenye `body`.
+
+```js
+assert.exists(document.querySelector('body > p'));
+```
+
+Unapaswa kuweka kipengele cha `p` chini ya kipengele cha `h1`.
+
+```js
+assert.exists(document.querySelector('h1 + p'));
+```
+
+Unapaswa kukipa kipengele cha `p` maandishi ya `Please fill out this form with the required information`.
+
+```js
+assert.equal(document.querySelector('p')?.innerText, 'Please fill out this form with the required information');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+--fcc-editable-region--
+
+ Registration Form
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1922fcbd2410527b3bd89.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1922fcbd2410527b3bd89.md
new file mode 100644
index 00000000000..9151158b5a1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1922fcbd2410527b3bd89.md
@@ -0,0 +1,56 @@
+---
+id: 60f1922fcbd2410527b3bd89
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+Sehemu ya `vh` inasimamia viewport height, na inalingana na 1% ya `height` ya viewport.
+
+Ni wakati wa kuboresha mradi na CSS. Anza kwa kuipa `body` `width` ya `100%`, na `height` ya `100vh`.
+
+# --hints--
+
+Unapaswa kutumia kipengele kichaguzi cha `body`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+Unapaswa kuipa `body` `width` ya `100%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.width, '100%');
+```
+
+Unapaswa kuipa `body` `height` ya `100vh`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.height, '100vh');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a5e2d2c23707a4f9a660.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a5e2d2c23707a4f9a660.md
new file mode 100644
index 00000000000..af9ebb83b52
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a5e2d2c23707a4f9a660.md
@@ -0,0 +1,52 @@
+---
+id: 60f1a5e2d2c23707a4f9a660
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Sasa, ondoa upau wa kusogeza ulio mlalo, kwa kuweka `body` chaguo-msingi `margin` ulioongezwa na baadhi ya vivinjari hadi `0`.
+
+# --hints--
+
+Unapaswa kuongeza `margin` ndani ya kichaguzi cha kipengele `body`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('body')?.margin);
+```
+
+Unapaswa kuipa thamani `margin` ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.margin, '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+```
+
+```css
+--fcc-editable-region--
+body {
+ width: 100%;
+ height: 100vh;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a9cbd23023082e149fee.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a9cbd23023082e149fee.md
new file mode 100644
index 00000000000..842cb7e18b9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a9cbd23023082e149fee.md
@@ -0,0 +1,65 @@
+---
+id: 60f1a9cbd23023082e149fee
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Hiyo inaonekana bora zaidi. Sasa, fanya mandharinyuma kuwa rahisi machoni, kwa kubadilisha `body` `background-color` hadi `#1b1b32`. Kisha, ili kuona maandishi, badilisha `color` hadi `#f5f6f7`.
+
+# --hints--
+
+Unapaswa kuongeza `background-color` ndani ya kichaguzi cha kipengele `body`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('body')?.backgroundColor);
+```
+
+Unapaswa kuipa `background-color` thamani ya `#1b1b32`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.backgroundColor, 'rgb(27, 27, 50)');
+```
+
+Unapaswa kuongeza `color` ndani ya kichaguzi cha kipengele `body`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('body')?.color);
+```
+
+Unapaswa kuipa `color` thamani ya `#f5f6f7`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.color, 'rgb(245, 246, 247)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+```
+
+```css
+--fcc-editable-region--
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5c3e399ff1a05629964e4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5c3e399ff1a05629964e4.md
new file mode 100644
index 00000000000..621da984985
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5c3e399ff1a05629964e4.md
@@ -0,0 +1,63 @@
+---
+id: 60f5c3e399ff1a05629964e4
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Kama inavyopendekezwa na kichwa, unaunda fomu. Kwa hivyo, baada ya kipengele cha `p`, weka `form` yenye sifa ya `action` inayolenga `https://register-demo.freecodecamp.org`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `form` karibu na kipengele cha `p`.
+
+```js
+assert.exists(document.querySelector('p + form'));
+```
+
+Unapaswa kuipa `form` sifa ya `action`.
+
+```js
+// Default action points to window location
+assert.notEqual(document.querySelector('form')?.action, window?.location?.href);
+```
+
+Unapaswa kuipa `action` thamani ya `https://register-demo.freecodecamp.org`.
+
+```js
+assert.equal(document.querySelector('form')?.action, 'https://register-demo.freecodecamp.org/');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+--fcc-editable-region--
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5cb8875ab6a0610f05071.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5cb8875ab6a0610f05071.md
new file mode 100644
index 00000000000..4bb6e44728b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5cb8875ab6a0610f05071.md
@@ -0,0 +1,64 @@
+---
+id: 60f5cb8875ab6a0610f05071
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Kwa vile fomu itakuwa na sehemu tatu tofauti, ongeza vipengele vitatu vya `fieldset` ndani ya kipengele cha `form`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele vitatu vya `fieldset`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset')?.length, 3);
+```
+
+Vipengele vitatu vya `fieldset` vinapaswa kuwa ndani ya `form`.
+
+```js
+assert.equal(document.querySelectorAll('form > fieldset')?.length, 3);
+```
+
+Vipengele vitatu vya `fieldset` vinapaswa kuwa ndugu.
+
+```js
+assert.exists(document.querySelector('fieldset + fieldset + fieldset'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+--fcc-editable-region--
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5d2776c854e069560fbe6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5d2776c854e069560fbe6.md
new file mode 100644
index 00000000000..9c837f776f9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5d2776c854e069560fbe6.md
@@ -0,0 +1,62 @@
+---
+id: 60f5d2776c854e069560fbe6
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+`fieldset` ya kwanza itashikilia sehemu za jina, barua pepe na nenosiri. Anza kwa kuongeza vipengele vinne vya `label` kwenye `fieldset` ya kwanza.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vinne vya `label`.
+
+```js
+assert.equal(document.querySelectorAll('label')?.length, 4);
+```
+
+Unapaswa kuongeza vipengele vya `label` kwenye `fieldset` ya kwanza.
+
+```js
+assert.equal(document.querySelector('fieldset')?.querySelectorAll('label')?.length, 4);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+--fcc-editable-region--
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5dc35c07ac1078f140916.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5dc35c07ac1078f140916.md
new file mode 100644
index 00000000000..c44dfcd60e6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5dc35c07ac1078f140916.md
@@ -0,0 +1,82 @@
+---
+id: 60f5dc35c07ac1078f140916
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Ongeza maandishi yafuatayo kwa vipengele vya `label`:
+
+- `Enter Your First Name:`
+- `Enter Your Last Name:`
+- `Enter Your Email:`
+- `Create a New Password:`
+
+# --hints--
+
+`label` ya kwanza inapaswa kuwa na maandishi `Enter Your First Name:`.
+
+```js
+assert.match(document.querySelector('label')?.innerHTML, /Enter Your First Name:/i);
+```
+
+`label` ya pili inapaswa kuwa na maandishi `Enter Your Last Name:`.
+
+```js
+assert.match(document.querySelector('fieldset > label:nth-child(2)')?.innerHTML, /Enter Your Last Name:/i);
+```
+
+`label` ya tatu inapaswa kuwa na maandishi `Enter Your Email:`.
+
+```js
+assert.match(document.querySelector('fieldset > label:nth-child(3)')?.innerHTML, /Enter Your Email:/i);
+```
+
+`label` ya nne inapaswa kuwa na maandishi `Create a New Password:`.
+
+```js
+assert.match(document.querySelector('fieldset > label:nth-child(4)')?.innerHTML, /Create a New Password:/i);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+--fcc-editable-region--
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f803d5241e6a0433a523a1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f803d5241e6a0433a523a1.md
new file mode 100644
index 00000000000..b48b82306d0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f803d5241e6a0433a523a1.md
@@ -0,0 +1,74 @@
+---
+id: 60f803d5241e6a0433a523a1
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+Kitengo cha `rem` kinasimamia root `em`, na kinahusiana na saizi ya fonti ya kipengele cha `html`.
+
+Kwa vile vipengee vya `label` viko katika mstari kwa chaguo-msingi, vyote huonyeshwa kando kwenye mstari mmoja, na kufanya maandishi yako kuwa magumu kusoma. Ili kuzifanya zionekane kwenye mistari tofauti, ongeza `display: block` kwenye kipengele cha `label`, na uongeze `margin` ya `0.5rem 0`, kuzitenganisha kutoka kwa kila moja.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `label`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('label'));
+```
+
+Unapaswa kuongeza sifa ya `display` yenye thamani ya `block`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('label')?.display, 'block');
+```
+
+Unapaswa kuongeza sifa ya `margin` yenye thamani ya `0.5rem 0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('label')?.margin, '0.5rem 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f805f813eaf2049bc2ceea.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f805f813eaf2049bc2ceea.md
new file mode 100644
index 00000000000..1c58ee9b5dd
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f805f813eaf2049bc2ceea.md
@@ -0,0 +1,99 @@
+---
+id: 60f805f813eaf2049bc2ceea
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Weka kipengele cha `input` ndani ya kila `label`. Hakikisha kuwa umeongeza kila `input` baada ya maandishi ya `label`, na ujumuishe nafasi baada ya koloni.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vinne vya `input` kwenye kipengele cha `fieldset`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset input')?.length, 4);
+```
+
+Unapaswa kuweka vipengele vya `input` ndani ya vipengele vya `label`.
+
+```js
+assert.equal(document.querySelectorAll('label input')?.length, 4);
+```
+
+Unapaswa kuongeza `input` ya kwanza baada ya maandishi ya `label` `Enter Your First Name:`, na ujumuishe nafasi baada ya koloni.
+
+```js
+const query = /^Enter Your First Name:\s+ /
+assert.match(document.querySelectorAll('label')?.[0]?.innerHTML.trim(), query);
+```
+
+Unapaswa kuongeza `input` ya pili baada ya maandishi ya `label` `Enter Your Last Name:`, na ujumuishe nafasi baada ya koloni.
+
+```js
+const query = /^Enter Your Last Name:\s+ /
+assert.match(document.querySelectorAll('label')?.[1]?.innerHTML.trim(), query);
+```
+
+Unapaswa kuongeza `input` ya tatu baada ya maandishi ya `label` `Enter Your Email:`, na ujumuishe nafasi baada ya koloni.
+
+```js
+const query = /^Enter Your Email:\s+ /
+assert.match(document.querySelectorAll('label')?.[2]?.innerHTML.trim(), query);
+```
+
+Unapaswa kuongeza `input` ya nne baada ya maandishi ya `label` `Create a New Password:`, na ujumuishe nafasi baada ya koloni.
+
+```js
+const query = /^Create a New Password:\s+ /
+assert.match(document.querySelectorAll('label')?.[3]?.innerHTML.trim(), query);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+ --fcc-editable-region--
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md
new file mode 100644
index 00000000000..603dfc7492a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md
@@ -0,0 +1,87 @@
+---
+id: 60f80e0081e0f2052ae5b505
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Kubainisha sifa ya `type` ya kipengele cha fomu ni muhimu kwa kivinjari kujua ni aina gani ya data inapaswa kutarajia. Ikiwa `type` haijabainishwa, kivinjari kitakuwa chaguomsingi ya `text`.
+
+Vipe vipengele viwili vya kwanza `input` ya sifa `type` ya `text`, cha tatu sifa ya `type` ya `email`, na ya nne sifa ya `type` ya `password`.
+
+Aina ya `email` inaruhusu barua pepe zilizo na `@` pekee na `.` kwenye kikoa. Aina ya `password` huficha ingizo, na kuonya ikiwa tovuti haitumii HTTPS.
+
+# --hints--
+
+Unapaswa kukipa kipengele cha kwanza cha `input` sifa ya `type` ya `text`.
+
+```js
+assert.equal(document.querySelector('input')?.type, 'text');
+```
+
+Unapaswa kukipa kipengele cha pili cha `input` sifa ya `type` ya `text`.
+
+```js
+assert.equal(document.querySelectorAll('input')?.[1]?.type, 'text');
+```
+
+Unapaswa kukipa kipengele cha tatu cha `input` sifa ya `type` ya `email`.
+
+```js
+assert.equal(document.querySelectorAll('input')?.[2]?.type, 'email');
+```
+
+Unapaswa kukipa kipengele cha nne cha `input` sifa ya `type` ya `password`.
+
+```js
+assert.equal(document.querySelectorAll('input')?.[3]?.type, 'password');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+--fcc-editable-region--
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md
new file mode 100644
index 00000000000..0cc41d5c607
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md
@@ -0,0 +1,80 @@
+---
+id: 60f81167d0d4910809f88945
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Kipengele cha kwanza cha `input` chenye `type` ya `submit` kinawekwa kiotomatiki ili kuwasilisha kipengee cha mzazi cha karibu zaidi cha `form`.
+
+Ili kushughulikia uwasilishaji wa fomu, baada ya kipengele cha mwisho cha `fieldset` ongeza kipengele cha `input` chenye sifa ya `type` iliyowekwa kuwa `submit` na sifa ya `value` iliyowekwa kuwa `Submit`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `input` baada ya kipengele cha mwisho cha `fieldset`.
+
+```js
+assert.exists(document.querySelectorAll('fieldset')?.[2]?.nextElementSibling?.tagName, 'input');
+```
+
+Unapaswa kukipa kipengele cha `input` sifa ya `type` ya `submit`.
+
+```js
+assert.exists(document.querySelector('fieldset + input[type="submit"]'));
+```
+
+Unapaswa kukipa kipengele cha `input` sifa ya `value` ya `Submit`.
+
+```js
+assert.exists(document.querySelector('fieldset + input[value="Submit"]'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+--fcc-editable-region--
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md
new file mode 100644
index 00000000000..69f13c1b355
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md
@@ -0,0 +1,94 @@
+---
+id: 60f81616cff80508badf9ad5
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Katika hatua hii, unapaswa kuwa na uwezo wa kuwasilisha fomu. Walakini, unaweza kugundua sio mengi yanatendeka.
+
+Ili kufanya fomu ishirikiane zaidi, ongeza sifa ya `required` kwa vipengele vya `input` katika `fieldset` ya kwanza.
+
+Sasa, ukijaribu kuwasilisha fomu bila kujaza sehemu zinazohitajika, utaona ujumbe wa hitilafu.
+
+# --hints--
+
+Unapaswa kukipa kipengele cha kwanza cha `input` sifa ya `required`.
+
+```js
+assert.equal(document.querySelector('input')?.required, true);
+```
+
+Unapaswa kukipa kipengele cha pili cha `input` sifa ya `required`.
+
+```js
+assert.equal(document.querySelectorAll('input')?.[1]?.required, true);
+```
+
+Unapaswa kukipa kipengele cha tatu cha `input` sifa ya `required`.
+
+```js
+assert.equal(document.querySelectorAll('input')?.[2]?.required, true);
+```
+
+Unapaswa kukipa kipengele cha nne cha `input` sifa ya `required`.
+
+```js
+assert.equal(document.querySelectorAll('input')?.[3]?.required, true);
+```
+
+Hupaswi kuzipa `submit` `input` sifa ya `required`.
+
+```js
+assert.equal(document.querySelector('input[type="submit"]')?.required, false);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+--fcc-editable-region--
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md
new file mode 100644
index 00000000000..a6ea8e9cb86
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md
@@ -0,0 +1,74 @@
+---
+id: 60f83e7bfc09900959f41e20
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Thamani fulani za sifa za `type` huja na uthibitishaji wa fomu iliyojumuishwa. Kwa mfano, `type="email"` inahitaji kwamba thamani iwe barua pepe halali.
+
+Ongeza uthibitishaji maalum kwa kipengele cha `input` cha nenosiri, kwa kuongeza sifa ya `minlength` yenye thamani ya `8`. Kufanya hivyo huzuia ingizo la chini ya herufi 8 kuwasilishwa.
+
+# --hints--
+
+Unapaswa kukipa kipengele cha `input` cha nenosiri sifa ya`minlength`.
+
+```js
+assert.notEqual(document.querySelector('input[type="password"]')?.minLength, -1);
+```
+
+Unapaswa kuipa sifa ya `minlength` thamani ya `8`.
+
+```js
+assert.equal(document.querySelector('input[type="password"]')?.minLength, 8);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+--fcc-editable-region--
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md
new file mode 100644
index 00000000000..f38dbcd4b94
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md
@@ -0,0 +1,82 @@
+---
+id: 60f84ec41116b209c280ba91
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Ukiwa na `type="password"` unaweza kutumia sifa ya `pattern` kufafanua usemi wa kawaida ambao nenosiri lazima lilingane ili kuchukuliwa kuwa halali.
+
+Ongeza sifa ya `pattern` kwa kipengele cha `input` cha nenosiri ili kuhitaji ingizo linalolingana: `[a-z0-5]{8,}`
+
+Ya hapo juu ni usemi wa kawaida unaolingana na herufi ndogo nane au zaidi au tarakimu `0` hadi `5`. Kisha, ondoa sifa ya `minlength`, na uijaribu.
+
+# --hints--
+
+Unapaswa kukipa kipengele cha `input` cha nenosiri sifa ya`pattern`.
+
+```js
+assert.isNotEmpty(document.querySelector('input[type="password"]')?.pattern);
+```
+
+Unapaswa kuipa sifa ya `pattern` thamani ya `[a-z0-5]{8,}`.
+
+```js
+assert.equal(document.querySelector('input[type="password"]')?.pattern, '[a-z0-5]{8,}');
+```
+
+Unapaswa kuondoa sifa ya `minlength` kutoka kwa kipengele cha `input` cha nenosiri.
+
+```js
+assert.equal(document.querySelector('input[type="password"]')?.minLength, -1);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+--fcc-editable-region--
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md
new file mode 100644
index 00000000000..d1d45b880d1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md
@@ -0,0 +1,76 @@
+---
+id: 60f852f645b5310a8264f555
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Wacha tuende kwenye sehemu inayofuata ya fomu ya usajili. Sehemu hii itauliza aina ya akaunti ambayo mtumiaji anafungua, na itathibitisha kuwa mtumiaji amesoma sheria na masharti.
+
+Anza kwa kuongeza vipengele vitatu vya `label` kwenye `fieldset` ya pili.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vitatu vya `label` kwenye `fieldset` ya pili.
+
+```js
+assert.equal(document.querySelectorAll('fieldset')?.[1]?.querySelectorAll('label')?.length, 3);
+```
+
+Vipengele vya `label` vinapaswa kuwa ndugu.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(2)')?.querySelector('label + label + label'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md
new file mode 100644
index 00000000000..0cac30c1ec9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md
@@ -0,0 +1,85 @@
+---
+id: 60f85a62fb30c80bcea0cedb
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Watumiaji wataruhusiwa kuchagua kati ya `Personal Account` au `Business Account`.
+
+Ili kufanya hivyo, ndani ya kila moja ya vipengele viwili vya kwanza vya `label`, ongeza kipengele kimoja cha `input` chenye`type="radio"`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele viwili vya `input`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(2) input')?.length, 2);
+```
+
+Unapaswa kuongeza `input` moja kwa kila moja ya vipengele viwili vya kwanza vya `label`.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(2) > label:nth-child(1) > input'));
+assert.exists(document.querySelector('fieldset:nth-child(2) > label:nth-child(2) > input'));
+```
+
+Unapaswa kuvipa vipengele vyote viwili vya `input` `type` ya `radio`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(2) input[type="radio"]')?.length, 2);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md
new file mode 100644
index 00000000000..ad19c42655e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md
@@ -0,0 +1,82 @@
+---
+id: 60f8604682407e0d017bbf7f
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Kwa sheria na masharti, ongeza `input` yenye `type` ya `checkbox` kwa kipengele cha `label` cha tatu. Fanya kipengele cha `input` kuwa `required` kwa sababu watumiaji hawapaswi kujisajili bila kusoma sheria na masharti.
+
+# --hints--
+
+Unapaswa kuongeza `input` ndani ya kipengele cha tatu cha `label`.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(2) label:nth-child(3) input'));
+```
+
+Unapaswa kuongeza sifa ya `type` ya thamani `checkbox` kwenye kipengele cha `input`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(3) input')?.type, 'checkbox');
+```
+
+Unapaswa kuongeza sifa `required` kwa kipengele cha `input`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(3) input')?.required, true);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md
new file mode 100644
index 00000000000..6360f2f0fff
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md
@@ -0,0 +1,106 @@
+---
+id: 60f8618d191b940d62038513
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Ndani ya kila kipengele sambamba cha `label`, na mara tu baada ya kipengele cha `input`, ongeza nafasi na uongeze maandishi yafuatayo:
+
+```md
+Personal Account
+Business Account
+I accept the terms and conditions
+```
+
+# --hints--
+
+Unapaswa kuipa `label` ya kwanza maandishi ya `Personal Account`.
+
+```js
+assert.include(document.querySelector('fieldset:nth-child(2) > label')?.innerText, 'Personal Account');
+```
+
+Unapaswa kuipa `label` ya pili maandishi ya `Business Account`.
+
+```js
+assert.include(document.querySelector('fieldset:nth-child(2) > label:nth-child(2)')?.innerText, 'Business Account');
+```
+
+Unapaswa kuipa `label` ya tatu maandishi ya `I accept the terms and conditions`.
+
+```js
+assert.include(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)')?.innerText, 'I accept the terms and conditions');
+```
+
+Unapaswa kuipa `label` ya kwanza nafasi moja mbele.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(2) > label')?.innerText?.[0], ' ');
+```
+
+Unapaswa kuipa `label` ya pili nafasi moja mbele.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(2)')?.innerText?.[0], ' ');
+```
+
+Unapaswa kuipa `label` ya tatu nafasi moja mbele.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)')?.innerText?.[0], ' ');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md
new file mode 100644
index 00000000000..9a4f2fe9774
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md
@@ -0,0 +1,84 @@
+---
+id: 60fab4a123ce4b04526b082b
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Unataka tu ingizo moja la redio liweze kuchaguliwa kwa wakati mmoja. Hata hivyo, fomu haijui ingizio za redio zinahusiana.
+
+Ili kuhusisha ingizo za redio, zipe sifa za `name` sawa na thamani ya `account-type`. Sasa, haiwezekani kuchagua ingizio zote mbili za redio kwa wakati mmoja.
+
+# --hints--
+
+Unapaswa kuipa ingizo la kwanza la redio sifa ya `name` yenye thamani ya `account-type`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(1) input[type="radio"]')?.name, 'account-type');
+```
+
+Unapaswa kuipa ingizo la pili la redio sifa ya `name` yenye thamani ya `account-type`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(2) input[type="radio"]')?.name, 'account-type');
+```
+
+Hupaswi kuipa `checkbox` sifa ya `name`.
+
+```js
+assert.isEmpty(document.querySelector('fieldset:nth-child(2) label:nth-child(3) input[type="checkbox"]')?.name);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+ Personal Account
+ Business Account
+ I accept the terms and conditions
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md
new file mode 100644
index 00000000000..7deb31111b3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md
@@ -0,0 +1,86 @@
+---
+id: 60fab8367d35de04e5cb7929
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Ili kukamilisha `fieldset`, unganisha maandishi `terms and conditions` katika `label` ya tatu kwenye eneo lifuatalo:
+
+```md
+https://www.freecodecamp.org/news/terms-of-service/
+```
+
+# --hints--
+
+Unapaswa kutumia kipengele cha `a` kuunganisha kwa sheria na masharti.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(2) > label:nth-child(3) > input + a'));
+```
+
+Unapaswa kukipa kipengele cha `a` `href` ya `https://www.freecodecamp.org/news/terms-of-service/`.
+
+```js
+assert.match(document.querySelector('fieldset:nth-child(2) > label:nth-child(3) > input + a')?.href, /https:\/\/www\.freecodecamp\.org\/news\/terms-of-service\/?/);
+```
+
+Unapaswa kuweka kipengele cha `a` kwenye maandishi `terms and conditions`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3) > input + a')?.textContent, 'terms and conditions');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+ Personal Account
+ Business Account
+ I accept the terms and conditions
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md
new file mode 100644
index 00000000000..6859b4cdfa7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md
@@ -0,0 +1,88 @@
+---
+id: 60fab9f17fa294054b74228c
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Tuendelee hadi kwenye `fieldset` ya mwisho. Je, ikiwa ungetaka kuruhusu mtumiaji kupakia picha ya wasifu?
+
+Kweli, `input` ya aina ya `file` inaruhusu hayo tu. Ongeza `label` yenye maandishi `Upload a profile picture:`, na uweke `input` ikikubali upakiaji wa faili.
+
+# --hints--
+
+Unapaswa kuongeza `label` yenye maandishi `Upload a profile picture:`.
+
+```js
+assert.match(document.querySelector('fieldset:nth-child(3) > label')?.innerText, /Upload a profile picture:/i);
+```
+
+Unapaswa kuweka kipengele cha `input` ndani ya kipengele cha `label`.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(3) > label > input'));
+```
+
+Unapaswa kukipa kipengele cha `input` `type` ya `file`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(3) > label > input')?.type, 'file');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md
new file mode 100644
index 00000000000..7beefc8e905
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md
@@ -0,0 +1,103 @@
+---
+id: 60fabf0dd4959805dbae09e6
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Ongeza `label` nyingine baada ya ya kwanza, yenye maandishi `Input your age (years):`. Kisha, weka `input` na `type` ya `number`.
+
+Kisha, ongeza sifa ya `min` kwenye `input` yenye thamani ya `13` kwa sababu watumiaji walio na umri wa chini ya miaka 13 hawafai kujisajili. Pia, watumiaji pengine hawatakuwa na zaidi ya umri wa miaka 120; ongeza sifa ya `max` yenye thamani ya `120`.
+
+Sasa, mtu akijaribu kuwasilisha fomu iliyo na thamani nje ya masafa, onyo litaonekana, na fomu haitawasilishwa. Jaribu.
+
+# --hints--
+
+Unapaswa kuongeza `label` kwa `fieldset` ya tatu, baada ya `label` iliyopo.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(3) > label + label'));
+```
+
+Unapaswa kuipa `label` maandishi ya `Input your age (years):`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(2)')?.textContent?.trim(), 'Input your age (years):');
+```
+
+Unapaswa kuipa `label` `input` yenye `type` ya `number`.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(3) > label:nth-child(2) > input[type="number"]'));
+```
+
+Unapaswa kuipa `input` sifa ya `min` yenye thamani ya `13`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(2) > input[type="number"]')?.min, '13');
+```
+
+Unapaswa kuipa `input` sifa ya `max` yenye thamani ya `120`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(2) > input[type="number"]')?.max, '120');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md
new file mode 100644
index 00000000000..b1adf9205bb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md
@@ -0,0 +1,84 @@
+---
+id: 60fac4095512d3066053d73c
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Kuongeza menyu ya kushuka kwa fomu ni rahisi kwa kutumia kipendele cha `select`. Kipengele cha `select` ni chombo cha kikundi cha vipengele vya `option`, na kipengele cha `option` hufanya kama lebo kwa kila chaguo la kushuka. Vipengele vyote viwili vinahitaji tagi za kufunga.
+
+Anza kwa kuongeza kipengele cha `select` chini ya vipengele viwili vya `label`. Kisha weka vipengele 5 vya `option` ndani ya kipengele cha `select`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `select` kwenye `fieldset` ya tatu.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(3) > select'));
+```
+
+Unapaswa kuweka vipengele 5 vya `option` ndani ya kipengele cha `select`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > select > option')?.length, 5);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md
new file mode 100644
index 00000000000..ad214daa580
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md
@@ -0,0 +1,100 @@
+---
+id: 60fac56271087806def55b33
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Weka kipengele cha `select` (pamoja na vipengele vyake vya `option`) ndani ya kipengele cha `label` chenye maandishi `How did you hear about us?`. Maandishi yanapaswa kuja kabla ya kipengele cha `select`.
+
+# --hints--
+
+Unapaswa kuweka kipengee cha `select` pekee ndani ya kipengele cha `label`.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(3) > label:nth-child(3) > select'));
+```
+
+Unapaswa kukipa kipengele cha `label` maandishi `How did you hear about us?`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(3)')?.innerText?.trim(), 'How did you hear about us?');
+```
+
+Unapaswa kuweka maandishi kabla ya kipengele cha `select`.
+
+```js
+assert.match(document.querySelector('fieldset:nth-child(3) > label:nth-child(3)')?.innerHTML?.trim().replace(/[\t\n]+/g, ''), /^How did you hear about us\?/);
+```
+
+Unapaswa kuwa na vipengele 5 vya `option` ndani ya kipengele cha `select`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset > label > select > option')?.length, 5);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac8d7fdfaee0796934f20.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac8d7fdfaee0796934f20.md
new file mode 100644
index 00000000000..2ac7019fd8e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac8d7fdfaee0796934f20.md
@@ -0,0 +1,116 @@
+---
+id: 60fac8d7fdfaee0796934f20
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Chaguo la kushuka chini kwa sasa halina chaguo lolote. Ili kulipa maudhui, ongeza maandishi yafuatayo kwa kila kipengele cha `option` kinachofuata:
+
+```md
+(select one)
+freeCodeCamp News
+freeCodeCamp YouTube Channel
+freeCodeCamp Forum
+Other
+```
+
+# --hints--
+
+Unapaswa kukipa kipengele cha kwanza cha `option` maandishi ya `(select one)`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[0]?.textContent, '(select one)');
+```
+
+Unapaswa kukipa kipengele cha pili cha `option` maandishi ya `freeCodeCamp News`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[1]?.textContent, 'freeCodeCamp News');
+```
+
+Unapaswa kukipa kipengele cha tatu cha `option` maandishi ya `freeCodeCamp YouTube Channel`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[2]?.textContent, 'freeCodeCamp YouTube Channel');
+```
+
+Unapaswa kukipa kipengele cha nne cha `option` maandishi ya `freeCodeCamp Forum`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[3]?.textContent, 'freeCodeCamp Forum');
+```
+
+Unapaswa kukipa kipengele cha tano cha `option` maandishi ya `Other`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[4]?.textContent, 'Other');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60faca286cb48b07f6482970.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60faca286cb48b07f6482970.md
new file mode 100644
index 00000000000..4c9fb879927
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60faca286cb48b07f6482970.md
@@ -0,0 +1,110 @@
+---
+id: 60faca286cb48b07f6482970
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Kuwasilisha fomu na chaguo lililochaguliwa hakutatuma thamani muhimu kwa seva. Kwa hivyo, kila `option` inahitaji kupewa sifa ya `value`. Bila hili, maudhui ya maandishi ya `option` yatawasilishwa kwa seva.
+
+Ipe `option` ya kwanza `value` ya `""`, na vipengele vifuatavyo vya `option` sifa ya `value` kutoka `1` hadi `4`.
+
+# --hints--
+
+Unapaswa kuipa `option` ya kwanza `value` ya `""`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[0]?.value, '');
+```
+
+Unapaswa kuipa `option` ya pili `value` ya `1`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[1]?.value, '1');
+```
+
+Unapaswa kuipa `option` ya tatu `value` ya `2`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[2]?.value, '2');
+```
+
+Unapaswa kuipa `option` ya nne `value` ya `3`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[3]?.value, '3');
+```
+
+Unapaswa kuipa `option` ya tano `value` ya `4`.
+
+```js
+assert.equal(document.querySelectorAll('fieldset:nth-child(3) > label:nth-child(3) option')?.[4]?.value, '4');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60facde2d0dc61085b41063f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60facde2d0dc61085b41063f.md
new file mode 100644
index 00000000000..34a45ae0e04
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60facde2d0dc61085b41063f.md
@@ -0,0 +1,105 @@
+---
+id: 60facde2d0dc61085b41063f
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Kipengele cha `textarea` hufanya kazi kama kipengele cha `input` cha aina ya `text`, lakini huja na manufaa ya ziada ya kuweza kupokea maandishi ya mistari mingi, na idadi ya awali ya safu mlalo na safu wima.
+
+Watumiaji wataweza kujiandikisha na wasifu. Ongeza `label` yenye maandishi `Provide a bio:` mwishoni mwa `fieldset`. Ongeza kipengele cha `textarea` ndani ya kipengele cha `label`. Kumbuka kuwa `textarea` inahitaji tagi ya kufunga.
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha `label` mwishoni mwa `fieldset` ya tatu, baada ya vipengele vilivyopo vya `label`.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(3) > label:nth-child(4)'));
+```
+
+Unapaswa kuipa `label` maandishi ya `Provide a bio:`.
+
+```js
+assert.match(document.querySelector('fieldset:nth-child(3) > label:nth-child(4)')?.innerText, /Provide a bio/);
+```
+
+Unapaswa kuweka kipengele cha `textarea` ndani ya `label`.
+
+```js
+assert.exists(document.querySelector('fieldset:nth-child(3) > label:nth-child(4) > textarea'));
+```
+
+Unapaswa kukipa kipengele cha `textarea` tagi za kufungua na kufunga.
+
+```js
+assert.match(code, /[\s\S]*<\/textarea\s*>/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60facf914c7b9b08d7510c2c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60facf914c7b9b08d7510c2c.md
new file mode 100644
index 00000000000..2995d6836a8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60facf914c7b9b08d7510c2c.md
@@ -0,0 +1,95 @@
+---
+id: 60facf914c7b9b08d7510c2c
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+`textarea` inaonekana ndogo sana. Ili kuipa ukubwa wa awali, unaweza kuongeza sifa za `rows` na `cols`.
+
+Ongeza ukubwa wa awali wa safu mlalo (rows) `3` na safu wima (columns) `30`.
+
+# --hints--
+
+Unapaswa kuipa `textarea` sifa ya `rows` yenye thamani ya `3`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(4) > textarea')?.rows, 3);
+```
+
+Unapaswa kuipa `textarea` sifa ya `cols` yenye thamani ya `30`.
+
+```js
+assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(4) > textarea')?.cols, 30);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md
new file mode 100644
index 00000000000..57edde08bf6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md
@@ -0,0 +1,95 @@
+---
+id: 60fad0a812d9890938524f50
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Ili kuwapa Wanakambi wazo la nini cha kuweka katika wasifu wao, sifa ya `placeholder` hutumika. `placeholder` hukubali thamani ya maandishi, ambayo huonyeshwa hadi mtumiaji aanze kuandika.
+
+Ipe `textarea` `placeholder` ya `I like coding on the beach...`.
+
+# --hints--
+
+Unapaswa kuipa `textarea` sifa ya `placeholder`.
+
+```js
+assert.isNotEmpty(document.querySelector('fieldset:nth-child(3) > label:nth-child(4) > textarea')?.placeholder);
+```
+
+Unapaswa kuipa `placeholder` thamani ya `I like coding on the beach...`.
+
+```js
+assert.match(document.querySelector('fieldset:nth-child(3) > label:nth-child(4) > textarea')?.placeholder, /^I like coding on the beach\.{3,4}$/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md
new file mode 100644
index 00000000000..237b77b8f73
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md
@@ -0,0 +1,155 @@
+---
+id: 60fad1cafcde010995e15306
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Pamoja na mawasilisho ya fomu, ni muhimu, na mazoezi mazuri, kutoa kila kipengele kinachoweza kuwasilishwa na sifa ya `name`. Sifa hii hutumiwa kutambua kipengele katika uwasilishaji wa fomu.
+
+Kipe kila kipengele kinachoweza kuwasilishwa sifa ya kipekee ya `name` ya chaguo lako, isipokuwa ingizo mbili za `radio`.
+
+# --hints--
+
+Unapaswa kuipa `input` ukitarajia jina la kwanza la sifa `name`. _PS Ningechagua `first-name`_
+
+```js
+assert.isNotEmpty(document.querySelector('fieldset:nth-child(1) > label:nth-child(1) > input')?.name);
+```
+
+Unapaswa kuipa `input` ukitarajia jina la mwisho la sifa `name`. _PS Ningechagua `last-name`_
+
+```js
+assert.isNotEmpty(document.querySelector('fieldset:nth-child(1) > label:nth-child(2) > input')?.name);
+```
+
+Unapaswa kuipa `email` sifa ya `name`. _PS Ningechagua `email`_
+
+```js
+assert.isNotEmpty(document.querySelector('input[type="email"]')?.name);
+```
+
+Unapaswa kuipa `password` sifa ya `name`. _PS Ningechagua `password`_
+
+```js
+assert.isNotEmpty(document.querySelector('input[type="password"]')?.name);
+```
+
+Unapaswa kuipa `checkbox` sifa ya `name`. _PS Ningechagua `terms`_
+
+```js
+assert.isNotEmpty(document.querySelector('input[type="checkbox"]')?.name);
+```
+
+Unapaswa kuipa `file` sifa ya `name`. _PS Ningechagua `file`_
+
+```js
+assert.isNotEmpty(document.querySelector('input[type="file"]')?.name);
+```
+
+Unapaswa kuipa `number` sifa ya `name`. _PS Ningechagua `age`_
+
+```js
+assert.isNotEmpty(document.querySelector('input[type="number"]')?.name);
+```
+
+Unapaswa kukipa kipengele cha `select` sifa ya `name`. _PS Ningechagua `referrer`_
+
+```js
+assert.isNotEmpty(document.querySelector('select')?.name);
+```
+
+Unapaswa kukipa kipengele cha `textarea` sifa ya `name`. _PS Ningechagua `bio`_
+
+```js
+assert.isNotEmpty(document.querySelector('textarea')?.name);
+```
+
+Unapaswa kukipa kipengele cha `option` sifa ya `name`.
+
+```js
+[...document.querySelectorAll('option')]?.forEach(option => assert.isUndefined(option?.name));
+```
+
+Unapaswa kukipa kipengele cha `label` sifa ya `name`.
+
+```js
+[...document.querySelectorAll('label')]?.forEach(label => assert.isUndefined(label?.name));
+```
+
+Unapaswa kukipa kipengele cha `fieldset` sifa ya `name`.
+
+```js
+[...document.querySelectorAll('fieldset')]?.forEach(fieldset => assert.isEmpty(fieldset?.name));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+--fcc-editable-region--
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md
new file mode 100644
index 00000000000..fa9f97c63ac
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md
@@ -0,0 +1,102 @@
+---
+id: 60fad6dfcc0d930a59becf12
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+HTML ya fomu ya usajili imekamilika. Sasa, unaweza kuirembesha kidogo.
+
+Anza kwa kubadilisha fonti hadi `Tahoma`, na saizi ya fonti kuwa `16px` katika `body`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `font-family` kubadilisha fonti.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('body')?.fontFamily);
+```
+
+Unapaswa kuweka sifa ya `font-family` kuwa `Tahoma`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.fontFamily, 'Tahoma');
+```
+
+Unapaswa kuweka sifa ya `font-size` kuwa `16px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.fontSize, '16px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+
+}
+--fcc-editable-region--
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md
new file mode 100644
index 00000000000..d088727ff59
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md
@@ -0,0 +1,103 @@
+---
+id: 60fad8e6148f310bba7890b1
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Weka vipengele vya `h1` na `p` kwa kuvipa `margin` ya `1em auto`. Kisha, weka maandishi yao kuwa `center` pia.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi kilichotenganishwa kwa koma ili kutengeneza vipengele vya `h1` na `p`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('h1, p'));
+```
+
+Unapaswa kutumia `margin` ya `1em auto` ili kuweka kipengee cha `h1` na `p` katikati.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('h1, p')?.margin, '1em auto');
+```
+
+Unapaswa kutumia `text-align` ya `center` ili kuweka maandishi ya `h1` na `p` katikati.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('h1, p')?.textAlign, 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md
new file mode 100644
index 00000000000..4eaa26ce573
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md
@@ -0,0 +1,120 @@
+---
+id: 60fad99e09f9d30c1657e790
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Weka kipengee cha `form` kati, kwa kukipa `margin` ya `0 auto`. Kisha, rekebisha ukubwa wake hadi upeo wa upana (maximum width) wa `500px`, na upana wa chini (minimum width) wa `300px`. Katikati ya safu hiyo, iruhusu iwe na `width` ya `60vw`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `form` ili kuweka mtindo wa kipengele cha `form`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('form'));
+```
+
+Unapaswa kuipa `form` `margin` ya `0 auto`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.margin, '0px auto');
+```
+
+Unapaswa kuipa `form` `max-width` ya `500px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.maxWidth, '500px');
+```
+
+Unapaswa kuipa `form` `min-width` ya `300px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.minWidth, '300px');
+```
+
+Unapaswa kuipa `form` `width` ya `60vw`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.width, '60vw');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md
new file mode 100644
index 00000000000..e97a1f51daf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md
@@ -0,0 +1,121 @@
+---
+id: 60fadb18058e950c73925279
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Wakati wa usanidi, ni muhimu kuona mipaka chaguomsingi ya `fieldset`. Walakini, hufanya yaliyomo kuonekana kuwa yametenganishwa sana.
+
+Ondoa `border`, na uongeze `2rem` ya padding juu na chini ya kila `fieldset`. Hakikisha umeondoa `padding` kutoka kushoto na kulia.
+
+# --hints--
+
+Unaweza kutumia thamani ya `none` au `0` kuondoa `border`.
+
+```js
+assert.match(new __helpers.CSSHelp(document).getStyle('fieldset')?.border, /(none)|(0px)/);
+```
+
+Unapaswa kuongeza `padding` ya `2rem` juu na chini ya kila `fieldset`.
+
+```js
+const fieldset = new __helpers.CSSHelp(document).getStyle('fieldset')
+assert.equal(fieldset?.paddingTop, '2rem');
+assert.equal(fieldset?.paddingBottom, '2rem');
+```
+
+Unapaswa kuondoa `padding` kutoka kushoto na kulia kwa kila `fieldset`.
+
+```js
+const fieldset = new __helpers.CSSHelp(document).getStyle('fieldset')
+assert.equal(fieldset?.paddingLeft, '0px');
+assert.equal(fieldset?.paddingRight, '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md
new file mode 100644
index 00000000000..38f4eaffbdb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md
@@ -0,0 +1,106 @@
+---
+id: 60fadce90f85c50d0bb0dd4f
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Ili kuvipa vipengele vya `fieldset` utenganishaji kidogo, vichague na uvipe `border-bottom` ya `3px solid #3b3b4f`.
+
+# --hints--
+
+Unapaswa kuvipa vipengele vya `fieldset` `border-bottom` ya `3px solid #3b3b4f`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('fieldset')?.borderBottom, '3px solid rgb(59, 59, 79)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+--fcc-editable-region--
+fieldset {
+ border: none;
+ padding: 2rem 0;
+}
+--fcc-editable-region--
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md
new file mode 100644
index 00000000000..1fca53fe975
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md
@@ -0,0 +1,152 @@
+---
+id: 60fadd972e6ffe0d6858fa2d
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Ingekuwa vyema zaidi kuwa na maandishi ya `label` kuonekana juu ya vipengele vya fomu.
+
+Chagua vipengele vyote vya `input`, `textarea`, na `select`, na uzifanye kuchukua upana kamili wa vipengele vyao kuu.
+
+Pia, ongeza `10px` ya `margin` juu ya vipengele vilivyochaguliwa. Weka margins zingine kuwa `0`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha kipengele kilichotenganishwa kwa koma ili kuchagua vipengele vya `input`, `textarea` na `select`.
+
+```js
+assert.isTrue(['input, textarea, select', 'input, select, textarea', 'select, input, textarea', 'select, textarea, input', 'textarea, input, select', 'textarea, select, input'].some(selector => new __helpers.CSSHelp(document).getStyle(selector)));
+```
+
+Unapaswa kuweka sifa ya `width` kuwa `100%`.
+
+```js
+const selFunc = (selector) => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'select, input, textarea', 'select, textarea, input', 'textarea, input, select', 'textarea, select, input'].find(selFunc))?.width, '100%');
+```
+
+Unapaswa kuweka sifa ya `margin-top` kuwa `10px`.
+
+```js
+const selFunc = (selector) => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'select, input, textarea', 'select, textarea, input', 'textarea, input, select', 'textarea, select, input'].find(selFunc))?.marginTop, '10px');
+```
+
+Unapaswa kuweka sifa ya `margin-bottom` kuwa `0`.
+
+```js
+const selFunc = (selector) => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'select, input, textarea', 'select, textarea, input', 'textarea, input, select', 'textarea, select, input'].find(selFunc))?.marginBottom, '0px');
+```
+
+Unapaswa kuweka sifa ya `margin-left` kuwa `0`.
+
+```js
+const selFunc = (selector) => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'select, input, textarea', 'select, textarea, input', 'textarea, input, select', 'textarea, select, input'].find(selFunc))?.marginLeft, '0px');
+```
+
+Unapaswa kuweka sifa ya `margin-right` kuwa `0`.
+
+```js
+const selFunc = (selector) => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'select, input, textarea', 'select, textarea, input', 'textarea, input, select', 'textarea, select, input'].find(selFunc))?.marginRight, '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md
new file mode 100644
index 00000000000..25cc60f2d27
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md
@@ -0,0 +1,132 @@
+---
+id: 60fadfa2b540b70dcfa8b771
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Kwa `fieldset` ya pili, unataka maandishi ya `input` na `label` yaonekane kwenye mstari mmoja.
+
+Anza, kwa kutoa vipengele vya `input` katika `fieldset` ya pili ya class ya `inline`.
+
+# --hints--
+
+Unapaswa kuipa `input` ya kwanza class ya `inline`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-child(2) input')?.[0]?.classList?.contains('inline'));
+```
+
+Unapaswa kuipa `input` ya pili class ya `inline`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-child(2) input')?.[1]?.classList?.contains('inline'));
+```
+
+Unapaswa kuipa `input` ya tatu class ya `inline`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-child(2) input')?.[2]?.classList?.contains('inline'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md
new file mode 100644
index 00000000000..69f3c54d1c6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md
@@ -0,0 +1,126 @@
+---
+id: 60fc219d333e37046f474a6e
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Chagua vipengele vya `.inline` pekee, na uzipe `width` ya `unset`. Hii itaondoa sheria ya awali ambayo inaweka vipengele vyote vya `input` kuwa `width: 100%`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.inline`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('.inline'));
+```
+
+Unapaswa kuvipa vipengele vya `.inline` `width` ya `unset`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.width, 'unset');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md
new file mode 100644
index 00000000000..b6b19e4d7e2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md
@@ -0,0 +1,141 @@
+---
+id: 60fc22d1e64d1b04cdd4e602
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Ongeza nafasi kati ya vipengele vya `.inline` na maandishi ya `label`, kwa kutoa `margin` sahihi ya `0.5em`. Weka margins zingine kuwa `0`.
+
+# --hints--
+
+Unapaswa kuvipa vipengele vya `.inline` `margin-top` ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.marginTop, '0px');
+```
+
+Unapaswa kuvipa vipengele vya `.inline` `margin-right` ya `0.5em`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.marginRight, '0.5em');
+```
+
+Unapaswa kuvipa vipengele vya `.inline` `margin-bottom` ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.marginBottom, '0px');
+```
+
+Unapaswa kuvipa vipengele vya `.inline` `margin-left` ya `0`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.marginLeft, '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+}
+
+--fcc-editable-region--
+.inline {
+ width: unset;
+
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md
new file mode 100644
index 00000000000..f04276f4d6a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md
@@ -0,0 +1,126 @@
+---
+id: 60fc236dc04532052926fdac
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Ukiangalia kwa ukaribu, utaona vipengele vya `.inline` viko juu sana kwenye mstari.
+
+Ili kukabiliana na hili, weka kipengele cha `vertical-align` kuwa`middle`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `vertical-align` kuwa `middle` kwa vipengele vyote vya `.inline`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.verticalAlign, 'middle');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+}
+
+--fcc-editable-region--
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md
new file mode 100644
index 00000000000..1503691c1c9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md
@@ -0,0 +1,143 @@
+---
+id: 60ffe1bc30415f042faea936
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Ili kufanya vipengele vya `input` na `textarea` vichanganywe na mandharinyuma, weka `background-color` kuwa `#0a0a23`. Kisha, uvipe mpaka wa `1px`, `solid` wenye rangi ya `#0a0a23`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha kipengele kilichotenganishwa kwa koma ili kuchagua vipengele vya `input` na `textarea`.
+
+```js
+const selFunc = selector => new __helpers.CSSHelp(document).getStyle(selector);
+assert.isTrue(['input, textarea', 'textarea, input'].some(selFunc));
+```
+
+Unapaswa kuvipa vipengele vya `input` na `textarea` `background-color` ya `#0a0a23`.
+
+```js
+const selFunc = selector => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.backgroundColor, 'rgb(10, 10, 35)');
+```
+
+Unapaswa kuvipa vipengele vya `input` na `textarea` mpaka wa `1px`, `solid` wenye rangi ya `#0a0a23`.
+
+```js
+const selFunc = selector => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.borderWidth, '1px');
+assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.borderStyle, 'solid');
+assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.borderColor, 'rgb(10, 10, 35)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md
new file mode 100644
index 00000000000..283fbad9fd3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md
@@ -0,0 +1,140 @@
+---
+id: 60ffe3936796ac04959285a9
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Kwa sasa, ukiandika kwa vipengele vya `input` au `textarea`, hutaweza kuona maandishi. Pia, urefu wao ni mdogo sana kuwa rahisi kutumia.
+
+Rekebisha hili, kwa kuweka `color` kuwa `#ffffff`, na kuweka `min-height` yao kuwa `2em`.
+
+# --hints--
+
+Unapaswa kuweka `color` kuwa `#ffffff`.
+
+```js
+const selFunc = selector => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.color, 'rgb(255, 255, 255)');
+```
+
+Unapaswa kuweka `min-height` kuwa `2em`.
+
+```js
+const selFunc = selector => new __helpers.CSSHelp(document).getStyle(selector);
+assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.minHeight, '2em');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+}
+
+--fcc-editable-region--
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+
+}
+--fcc-editable-region--
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md
new file mode 100644
index 00000000000..ca38b9c7662
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md
@@ -0,0 +1,145 @@
+---
+id: 60ffe4f4ec18cd04dc470c56
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Unataka kipengele cha `select` kibaki na usuli mweupe, lakini sasa hakipati `min-height` sawa vipengele vya `input` na `textarea`.
+
+Hamisha sifa ya thamani ya `min-height` ili aina zote tatu za vipengele ziwe na thamani sawa ya `min-height`, na kipengele cha `select` bado kina usuli mweupe.
+
+# --hints--
+
+Unapaswa kuhamisha kipengele na thamani ya `min-height` hadi kwenye kichaguzi cha `input, textarea, select`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('input, textarea, select')?.minHeight);
+```
+
+Unapaswa kukipa kichaguzi cha `input, textarea, select` `min-height` ya `2em`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input, textarea, select')?.minHeight, '2em');
+```
+
+Unapaswa kuondoa tamko la `min-height` kutoka kwa kichaguzi cha `input, textarea`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input, textarea')?.minHeight);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+ min-height: 2em;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md
new file mode 100644
index 00000000000..a198276dc93
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md
@@ -0,0 +1,153 @@
+---
+id: 60ffe69ee377c6055e192a46
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Ili kuunda kitufe cha kuwasilisha, unaweza kutumia _kichaguzi cha sifa_, ambacho huchagua kipengele kulingana na thamani ya sifa iliyotolewa. Hapa kuna mfano:
+
+```css
+input[name="password"]
+```
+
+Yaliyo hapo juu huchagua vipengele vya `input` vyenye sifa ya `name` yenye thamani `password`.
+
+Sasa, tumia kichaguzi cha sifa kutengeneza kitufe cha kuwasilisha kwa `display` ya `block` na `width` ya `60%`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha sifa cha `input[type="submit"]` ili kuweka mtindo wa kitufe cha kuwasilisha.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('input[type="submit"]'));
+```
+
+Unapaswa kukipa kitufe cha kuwasilisha `display` ya `block`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.display, 'block');
+```
+
+Unapaswa kukipa kitufe cha kuwasilisha `width` ya `60%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.width, '60%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md
new file mode 100644
index 00000000000..3b0e149de7a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md
@@ -0,0 +1,146 @@
+---
+id: 60ffe7d8aae62c05bcc9e7eb
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Kwa `display` ya `block` kitufe cha kuwasilisha kinakaa kwenye ukingo wa kushoto wa mzazi wake.
+
+Tumia mbinu ile ile inayotumika kuweka `form` katikati ili kuweka kitufe cha kuwasilisha katikati.
+
+# --hints--
+
+Unapaswa kukipa kitufe cha kuwasilisha `margin` ya `0 auto`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.margin, '0px auto');
+```
+
+Unapaswa kukipa kitufe cha kuwasilisha `min-width` ya `max-width`.
+
+```js
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.minWidth);
+assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.maxWidth);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+--fcc-editable-region--
+input[type="submit"] {
+ display: block;
+ width: 60%;
+
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md
new file mode 100644
index 00000000000..a88078541e2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md
@@ -0,0 +1,144 @@
+---
+id: 60ffe8a5ceb0e90618db06d9
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Ili kufanya kitufe cha kuwasilisha kionekane zaidi kulingana na fomu iliyosalia, kipe `height` sawa na sehemu zingine (`2em`). Pia, ongeza `font-size` hadi `1.1rem`.
+
+# --hints--
+
+Unapaswa kukipa kitufe cha kuwasilisha `height` ya `2em`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.height, '2em');
+```
+
+Unapaswa kukipa kitufe cha kuwasilisha `font-size` ya `1.1rem`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.fontSize, '1.1rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+--fcc-editable-region--
+input[type="submit"] {
+ display: block;
+ width: 60%;
+ margin: 0 auto;
+
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md
new file mode 100644
index 00000000000..172a8d7c780
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md
@@ -0,0 +1,146 @@
+---
+id: 60ffe947a868ec068f7850f6
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Ili kufanya kitufe cha kuwasilisha kionekane tofauti zaidi, kipe `background-color` ya `#3b3b4f`, na `border-color` ya `white`.
+
+# --hints--
+
+Unapaswa kukipa kitufe cha kuwasilisha `background-color` ya `#3b3b4f`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.backgroundColor, 'rgb(59, 59, 79)');
+```
+
+Unapaswa kukipa kitufe cha kuwasilisha `border-color` ya `white`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.borderColor, 'white');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+--fcc-editable-region--
+input[type="submit"] {
+ display: block;
+ width: 60%;
+ margin: 0 auto;
+ height: 2em;
+ font-size: 1.1rem;
+
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md
new file mode 100644
index 00000000000..40616d02a56
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md
@@ -0,0 +1,151 @@
+---
+id: 60ffe9cb47809106eda2f2c9
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Hatimaye, kwa kitufe cha kuwasilisha, ungependa kukitenganisha na `fieldset` hapo juu, na urekebishe upana wake usiwe chini ya `300px`.
+
+Badilisha kipengele cha `margin` ili kujumuisha `1em` juu na chini, huku ukiacha pambizo za kulia na kushoto zimewekwa `auto`. Kisha kuweka upana kama ilivyoelezwa hapo juu.
+
+# --hints--
+
+Haupaswi kubadilisha sifa ya `width`. Tumia sifa ya `min-width`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.width, '60%');
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.minWidth);
+```
+
+Unapaswa kutumia kipengele cha `margin` kilichopo ili kujumuisha `1em` juu na chini.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.margin, '1em auto');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+--fcc-editable-region--
+input[type="submit"] {
+ display: block;
+ width: 60%;
+ margin: 0 auto;
+ height: 2em;
+ font-size: 1.1rem;
+ background-color: #3b3b4f;
+ border-color: white;
+
+}
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md
new file mode 100644
index 00000000000..26ff8f4e625
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md
@@ -0,0 +1,152 @@
+---
+id: 60ffec2825da1007509ddd06
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Vivinjari vingi huingiza sifa na thamani zao za CSS kwa vipengele tofauti. Ukichunguza kwa makini, unaweza kugundua kuwa `input` ya faili ni ndogo kuliko maandishi mengine ya vipengele vya `input`. Kwa chaguo-msingi, `padding` ya `1px 2px` inatolewa kwa vipengele vya `input` unavyoweza kuandika.
+
+Kwa kutumia kichaguzi kingine cha sifa, tengeneza mtindo wa `input` iliyo na `type` ya `file` ili kuwa padding sawa na `input` ya vipengele vingine.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha sifa kutengeneza kipengee cha `input`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('input[type="file"]'));
+```
+
+Unapaswa kuipa `input[type="file"]` `padding` ya `1px 2px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="file"]')?.padding, '1px 2px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+input[type="submit"] {
+ display: block;
+ width: 60%;
+ margin: 1em auto;
+ height: 2em;
+ font-size: 1.1rem;
+ background-color: #3b3b4f;
+ border-color: white;
+ min-width: 300px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md
new file mode 100644
index 00000000000..e0ff0b66a45
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md
@@ -0,0 +1,153 @@
+---
+id: 60ffecefac971607ae73c60f
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Tukizungumzia `padding`, kitufe cha kuwasilisha kimekaa chini ya kipengele cha `form`. Ongeza `2em` ya `padding` pekee chini ya `form`.
+
+# --hints--
+
+Unapaswa kutumia sifa ya `padding-bottom`.
+
+```js
+assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('form')?.paddingBottom);
+```
+
+Unapaswa kuipa `padding-bottom` thamani ya `2em`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.paddingBottom, '2em');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+--fcc-editable-region--
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+
+}
+--fcc-editable-region--
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+input[type="submit"] {
+ display: block;
+ width: 60%;
+ margin: 1em auto;
+ height: 2em;
+ font-size: 1.1rem;
+ background-color: #3b3b4f;
+ border-color: white;
+ min-width: 300px;
+}
+
+input[type="file"] {
+ padding: 1px 2px;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md
new file mode 100644
index 00000000000..0b8f31a4305
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md
@@ -0,0 +1,286 @@
+---
+id: 60ffefd6479a3d084fb77cbc
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Mwisho, badilisha rangi ya maandishi ya kiungo cha `terms and conditions` hadi `#dfdfe2`.
+
+Hongera! Umekamilisha sehemu ya mwisho ya mradi wa mazoezi ya _Registration Form_.
+
+# --hints--
+
+Unapaswa kutumia kipengele kichaguzi cha `a`.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('a'));
+```
+
+Unapaswa kuvipa kipengele cha `a` `color` ya `#dfdfe2`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('a')?.color, 'rgb(223, 223, 226)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+ padding-bottom: 2em;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+input[type="submit"] {
+ display: block;
+ width: 60%;
+ margin: 1em auto;
+ height: 2em;
+ font-size: 1.1rem;
+ background-color: #3b3b4f;
+ border-color: white;
+ min-width: 300px;
+}
+
+input[type="file"] {
+ padding: 1px 2px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+ padding-bottom: 2em;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid #3b3b4f;
+}
+
+fieldset:last-of-type {
+ border-bottom: none;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+input,
+textarea,
+select {
+ margin: 10px 0 0 0;
+ width: 100%;
+ min-height: 2em;
+}
+
+input, textarea {
+ background-color: #0a0a23;
+ border: 1px solid #0a0a23;
+ color: #ffffff;
+}
+
+.inline {
+ width: unset;
+ margin: 0 0.5em 0 0;
+ vertical-align: middle;
+}
+
+input[type="submit"] {
+ display: block;
+ width: 60%;
+ margin: 1em auto;
+ height: 2em;
+ font-size: 1.1rem;
+ background-color: #3b3b4f;
+ border-color: white;
+ min-width: 300px;
+}
+
+input[type="file"] {
+ padding: 1px 2px;
+}
+
+a {
+ color: #dfdfe2;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md
new file mode 100644
index 00000000000..05007b10723
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md
@@ -0,0 +1,122 @@
+---
+id: 62b30924c5e4ef0daba23b5e
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Mpaka wa kipengele cha mwisho cha `fieldset` inaonekana nje. Unaweza kuchagua kipengele cha mwisho cha aina mahususi kwa kutumia `last-of-type` CSS pseudo-class, kama hii:
+
+```css
+p:last-of-type { }
+```
+
+Hiyo itachagua kipengee cha mwisho cha `p`. Unda kichaguzi kipya ambacho kinalenga kipengele cha mwisho cha `fieldset` na uweke `border-bottom` kuwa `none`.
+
+# --hints--
+
+Unaweza kutumia `:last-of-type` pseudo-class kuchagua tu kipengele cha mwisho cha aina fulani.
+
+```js
+assert.exists(new __helpers.CSSHelp(document).getStyle('fieldset:last-of-type'));
+```
+
+`fieldset:last-of-type` yako inapaswa kupewa `border-bottom` ya `none`.
+
+```js
+const borderBottom = new __helpers.CSSHelp(document).getStyle('fieldset:last-of-type')?.borderBottom;
+assert(borderBottom === 'none' || borderBottom === 'medium none' || borderBottom === 'medium');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+ font-family: Tahoma;
+ font-size: 16px;
+}
+
+h1, p {
+ margin: 1em auto;
+ text-align: center;
+}
+
+form {
+ width: 60vw;
+ max-width: 500px;
+ min-width: 300px;
+ margin: 0 auto;
+}
+
+fieldset {
+ border: none;
+ padding: 2rem 0;
+ border-bottom: 3px solid rgb(59, 59, 79);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62cc5b1779e4d313466f73c5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62cc5b1779e4d313466f73c5.md
new file mode 100644
index 00000000000..64d6b21f4a8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62cc5b1779e4d313466f73c5.md
@@ -0,0 +1,70 @@
+---
+id: 62cc5b1779e4d313466f73c5
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Weka kipengee cha kujifunga cha `link` ndani ya kipengele cha `head`. Ipe sifa ya `rel` yenye thamani ya `stylesheet` na sifa ya `href` yenye thamani ya `styles.css`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha `link`.
+
+```js
+assert.exists(document.querySelector('link'));
+```
+
+Hupaswi kubadilisha tagi zako za `head` zilizopo. Hakikisha kuwa hukufuta tagi ya kufunga.
+
+```js
+const heads = document.querySelectorAll('head');
+assert.equal(heads?.length, 1);
+```
+
+Unapaswa kuwa na kipengele kimoja cha kujifunga cha `link`.
+
+```js
+assert(document.querySelectorAll('link').length === 1);
+```
+
+Kipengele chako cha `link` kinapaswa kuwa ndani ya kipengele chako cha `head`.
+
+```js
+assert.exists(document.querySelector('head > link'));
+```
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `rel` yenye thamani `stylesheet`.
+
+```js
+const link_element = document.querySelector('link');
+const rel = link_element.getAttribute("rel");
+assert.equal(rel, "stylesheet");
+```
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `href` yenye thamani `styles.css`.
+
+```js
+const link = document.querySelector('link');
+assert.equal(link.dataset.href, "styles.css");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+--fcc-editable-region--
+
+
+ Registration Form
+
+--fcc-editable-region--
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md
new file mode 100644
index 00000000000..b963260577b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md
@@ -0,0 +1,109 @@
+---
+id: 62ff8b9dab5ac88e4d3d43a3
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Kwa kufuata mbinu bora za ufikivu, unganisha vipengele vya `input` na vipengele vya `label` kwa kutumia sifa ya `for`.
+
+Tumia `first-name`, `last-name`, `email`, na `new-password` kama thamani husika za sifa ya `id`.
+
+# --hints--
+
+Kipengee chako cha kwanza cha `input` kinapaswa kuwa na `id` ya `first-name`.
+
+```js
+assert(document.querySelectorAll('input')?.[0]?.matches('#first-name'))
+```
+
+Kipengee chako cha pili cha `input` kinapaswa kuwa na `id` ya `last-name`.
+
+```js
+assert(document.querySelectorAll('input')?.[1]?.matches('#last-name'))
+```
+
+Kipengee chako cha tatu cha `input` kinapaswa kuwa na `id` ya `email`.
+
+```js
+assert(document.querySelectorAll('input')?.[2]?.matches('#email'))
+```
+
+Kipengee chako cha nne cha `input` kinapaswa kuwa na `id` ya `new-password`.
+
+```js
+assert(document.querySelectorAll('input')?.[3]?.matches('#new-password'))
+```
+
+Kipengele cha kwanza cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `first-name`.
+
+```js
+assert(document.querySelectorAll('label')?.[0]?.matches('label[for="first-name"]'))
+```
+
+Kipengele cha pili cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `last-name`.
+
+```js
+assert(document.querySelectorAll('label')?.[1]?.matches('label[for="last-name"]'))
+```
+
+Kipengele cha tatu cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `email`.
+
+```js
+assert(document.querySelectorAll('label')?.[2]?.matches('label[for="email"]'))
+```
+
+Kipengele cha nne cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `new-password`.
+
+```js
+assert(document.querySelectorAll('label')?.[3]?.matches('label[for="new-password"]'))
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+--fcc-editable-region--
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md
new file mode 100644
index 00000000000..eceafb34d07
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md
@@ -0,0 +1,102 @@
+---
+id: 62ff8e998d3e7eae14d6ae3b
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Fuata mbinu bora za ufikivu kwa kuunganisha vipengele vya `input` na vipengele vya `label` katika `fieldset` ya pili.
+
+Tumia `personal-account`, `business-account` na `terms-and-conditions` kama thamani za sifa husika za `id`.
+
+# --hints--
+
+Kipengee chako cha kwanza cha `input` kinapaswa kuwa na `id` ya `personal-account`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[0]?.matches('#personal-account'))
+```
+
+Kipengee chako cha pili cha `input` kinapaswa kuwa na `id` ya `business-account`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[1]?.matches('#business-account'))
+```
+
+Kipengee cha tatu cha `input` kinapaswa kuwa na `id` ya `terms-and-conditions`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[2]?.matches('#terms-and-conditions'))
+```
+
+Kipengele cha kwanza cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `personal-account`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[0]?.matches('label[for="personal-account"]'))
+```
+
+Kipengele cha pili cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `business-account`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[1]?.matches('label[for="business-account"]'))
+```
+
+Kipengele cha tatu cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `terms-and-conditions`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[2]?.matches('label[for="terms-and-conditions"]'))
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+--fcc-editable-region--
+
+ Personal Account
+ Business Account
+ I accept the terms and conditions
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md
new file mode 100644
index 00000000000..588d6922c8e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md
@@ -0,0 +1,131 @@
+---
+id: 62ff919a7b5612c0670923a5
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Unganisha vipengele vya fomu vinavyotumika na vipengele vyake vya `label` pamoja.
+
+Tumia `profile-picture`, `age`, `referrer` na `bio` kama thamani husika za sifa ya `id`.
+
+# --hints--
+
+Kipengee cha kwanza cha `input` kinapaswa kuwa na `id` ya `profile-picture`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[0]?.matches('#profile-picture'))
+```
+
+Kipengee cha pili cha `input` kinapaswa kuwa na `id` ya `age`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[1]?.matches('#age'))
+```
+
+Kipengele cha `select` kinapaswa kuwa na `id` ya `referrer`.
+
+```js
+assert(document.querySelector('fieldset:nth-of-type(3) select')?.matches('#referrer'))
+```
+
+Kipengele cha `textarea` kinapaswa kuwa na `id` ya `bio`.
+
+```js
+assert(document.querySelector('fieldset:nth-of-type(3) textarea')?.matches('#bio'))
+```
+
+Kipengele cha kwanza cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `profile-picture`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[0]?.matches('label[for="profile-picture"]'))
+```
+
+Kipengele cha pili cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `age`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[1]?.matches('label[for="age"]'))
+```
+
+Kipengele cha tatu cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `referrer`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[2]?.matches('label[for="referrer"]'))
+```
+
+Kipengele cha nne cha `label` kinafaa kuwa na sifa `for` yenye thamani ya `bio`.
+
+```js
+assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[3]?.matches('label[for="bio"]'))
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+
+
+ Enter Your First Name:
+ Enter Your Last Name:
+ Enter Your Email:
+ Create a New Password:
+
+
+ Personal Account
+ Business Account
+
+ I accept the terms and conditions
+
+
+--fcc-editable-region--
+
+ Upload a profile picture:
+ Input your age (years):
+ How did you hear about us?
+
+ (select one)
+ freeCodeCamp News
+ freeCodeCamp YouTube Channel
+ freeCodeCamp Forum
+ Other
+
+
+ Provide a bio:
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+
+label {
+ display: block;
+ margin: 0.5rem 0;
+}
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/63541ef4f96cd82e8e6c788a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/63541ef4f96cd82e8e6c788a.md
new file mode 100644
index 00000000000..7a86896d776
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/63541ef4f96cd82e8e6c788a.md
@@ -0,0 +1,64 @@
+---
+id: 63541ef4f96cd82e8e6c788a
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Sifa ya `method` inabainisha jinsi ya kutuma data ya fomu kwa URL iliyobainishwa katika sifa ya `action`. Data ya fomu inaweza kutumwa kupitia ombi la `GET` kama vigezo vya URL (na `method="get"`) au kupitia ombi la `POST` kama data. katika ombi (na `method="post"`).
+
+Weka sifa ya `method` itume data ya fomu yako kupitia ombi la `POST`.
+
+# --hints--
+
+Hupaswi kuongeza kipengele kipya cha `form`.
+
+```js
+assert.equal(document.querySelectorAll('form').length, 1 )
+```
+
+Kipengele chako cha `form` kinafaa kuwa na sifa ya `method`.
+
+```js
+assert.exists(document.querySelector('form')?.getAttribute('method'));
+```
+
+Sifa ya `method` yako inapaswa kuwekwa kuwa `post`.
+
+```js
+assert.equal(document.querySelector('form')?.getAttribute('method'), 'post');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Registration Form
+
+
+
+ Registration Form
+ Please fill out this form with the required information
+ --fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+body {
+ width: 100%;
+ height: 100vh;
+ margin: 0;
+ background-color: #1b1b32;
+ color: #f5f6f7;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51578.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51578.md
new file mode 100644
index 00000000000..fa15afa2c87
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51578.md
@@ -0,0 +1,112 @@
+---
+id: 60b69a66b6ddb80858c51578
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Anza kwa kuweka muundo wako wa HTML. Ongeza tamko la `` na kipengele cha `html` chenye sifa ya `lang` iliyowekwa kuwa `en`. Ndani ya kipengele cha `html`, ongeza kipengele cha `head` na kipengele cha `body`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na rejeleo la `DOCTYPE`.
+
+```js
+assert(code.match(/` baada ya aina.
+
+```js
+assert(code.match(/html\s*>/gi));
+```
+
+Tamko lako la `DOCTYPE` linapaswa kuwa mwanzoni mwa HTML yako.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+Kipengele chako cha `html` kinafaa kuwa na tagi ya ufunguzi yenye sifa ya `lang` ya `en`
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufunga.
+
+```js
+assert(code.match(/<\/html\s*>/));
+```
+
+Unapaswa kuwa na tagi ya kufungua ya `head`.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `head`.
+
+```js
+assert(code.match(/<\/head\s*>/i));
+```
+
+Unapaswa kuwa na tagi ya kufungua ya `body`.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `body`.
+
+```js
+assert(code.match(/<\/body\s*>/i));
+```
+
+Vipengele vya `head` na `body` vinapaswa kuwa ndugu.
+
+```js
+assert(document.querySelector('head')?.nextElementSibling?.localName === 'body');
+```
+
+Kipengele cha `head` kinapaswa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'head'));
+```
+
+Kipengele cha `body` kinapaswa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'body'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51579.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51579.md
new file mode 100644
index 00000000000..d0c5a8d7b8c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51579.md
@@ -0,0 +1,63 @@
+---
+id: 60b69a66b6ddb80858c51579
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `head`, ongeza tagi ya `meta` yenye sifa ya `charset` iliyowekwa kuwa `utf-8`. Pia, ongeza kipengele cha `title` chenye maandishi `Picasso Painting`.
+
+# --hints--
+
+Unapaswa kuwa na kipengele kimoja cha `meta`.
+
+```js
+assert(document.querySelectorAll('meta').length === 1);
+```
+
+Kipengele chako cha `meta` kinafaa kuwa na sifa ya `charset`.
+
+```js
+assert(document.querySelector('meta')?.getAttribute('charset'));
+```
+
+Sifa yako ya `charset` inapaswa kuwa na thamani ya `utf-8`.
+
+```js
+assert(document.querySelector('meta')?.getAttribute('charset')?.toLowerCase() === 'utf-8');
+```
+
+Unapaswa kuongeza kipengele kimoja cha `title`.
+
+```js
+assert(document.querySelectorAll('title').length === 1);
+```
+
+Kipengele chako cha `title` kinapaswa kuwa na maandishi `Picasso Painting`. Kumbuka kwamba tahajia na herufi ni muhimu.
+
+```js
+assert(document.querySelector('title')?.innerText === 'Picasso Painting');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157a.md
new file mode 100644
index 00000000000..ee2d7364a31
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157a.md
@@ -0,0 +1,56 @@
+---
+id: 60b69a66b6ddb80858c5157a
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+FontAwesome ni maktaba ya ikoni zinazoendeshwa na SVG, nyingi zinapatikana kwa matumizi bila malipo. Utakuwa ukitumia baadhi ya aikoni hizi katika mradi huu, kwa hivyo utahitaji kuunganisha laha ya nje ya mtindo kwenye HTML yako.
+
+Ongeza kipengele cha `link` kilicho na `rel` ya `stylesheet` na `href` ya `https://use.fontawesome.com/releases/v5.8.2/css/all.css`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele viwili vya `link`.
+
+```js
+assert(document.querySelectorAll('link').length === 2);
+```
+
+Kipengele chako cha `link` kinafaa kuwa na `rel` ya `stylesheet`.
+
+```js
+assert(document.querySelectorAll('link')?.[1]?.getAttribute('rel') === 'stylesheet');
+```
+
+Kipengele chako kipya cha `link` kinafaa kuwa na `href` ya `https://use.fontawesome.com/releases/v5.8.2/css/all.css`.
+
+```js
+assert(document.querySelectorAll('link')?.[1]?.getAttribute('href') === 'https://use.fontawesome.com/releases/v5.8.2/css/all.css')
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157b.md
new file mode 100644
index 00000000000..e213373ffad
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157b.md
@@ -0,0 +1,50 @@
+---
+id: 60b69a66b6ddb80858c5157b
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Ili uanze uchoraji wako, kipe kipengele cha `body` `background-color` ya `rgb(184, 132, 46)`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `body`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+Kichaguzi chako cha `body` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb (184, 132, 46)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.backgroundColor === 'rgb(184, 132, 46)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+```
+
+```css
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157c.md
new file mode 100644
index 00000000000..90ecd3d1cba
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157c.md
@@ -0,0 +1,51 @@
+---
+id: 60b69a66b6ddb80858c5157c
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Ndani ya tagi yako ya body, ongeza kipengele cha `div`. Ipe `id` ya `back-wall`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele 1 cha `div`.
+
+```js
+assert(document.querySelectorAll('div').length === 1);
+```
+
+Kipengee chako cha `div` kinapaswa kuwa na `id` ya `back-wall`.
+
+```js
+assert(document.querySelector('div')?.getAttribute('id') === 'back-wall');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157d.md
new file mode 100644
index 00000000000..b1cc26feefe
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157d.md
@@ -0,0 +1,54 @@
+---
+id: 60b69a66b6ddb80858c5157d
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Tumia kichaguzi cha id kukipa kipengele chenye id `back-wall` `background-color` ya `#8B4513`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `#back-wall`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#back-wall'));
+```
+
+Kipengele chako cha `#back-wall` kinafaa kuwa na `background-color` ya `#8B4513`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#back-wall')?.backgroundColor === 'rgb(139, 69, 19)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157e.md
new file mode 100644
index 00000000000..2c6fb1e49b1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157e.md
@@ -0,0 +1,56 @@
+---
+id: 60b69a66b6ddb80858c5157e
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Kipe kipengele cha `#back-wall` `width` ya `100%` na `height` ya `60%`.
+
+# --hints--
+
+Unapaswa kuweka `width` ya kichaguzi `#back-wall` kuwa `100%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#back-wall')?.width === '100%');
+```
+
+Unapaswa kuweka `height` ya kichaguzi `#back-wall` kuwa `60%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#back-wall')?.height === '60%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157f.md
new file mode 100644
index 00000000000..5415634eb60
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5157f.md
@@ -0,0 +1,69 @@
+---
+id: 60b69a66b6ddb80858c5157f
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Kwa kawaida, HTML hutolewa kwa namna ya juu-chini. Vipengele vilivyo juu ya msimbo vimewekwa juu ya ukurasa. Hata hivyo, mara nyingi unaweza kutaka kuhamisha vipengele kwenye nafasi tofauti. Unaweza kufanya hivi kwa sifa ya `position`.
+
+Weka `position` ya kipengele cha `#back-wall` kuwa `absolute`. Nafasi ya `absolute` huchukua kipengele kutoka kwenye mtiririko huo wa hati unaotoka juu chini na hukuruhusu kukirekebisha kulingana na chombo chake.
+
+Wakati kipengele kinapowekwa nafasi kwa mkono, unaweza kubadilisha mpangilio wake na `top`, `left`, `right` na `bottom`. Weka kipengele cha `#back-wall` kuwa na thamani ya `top` ya `0`, na thamani ya `left` ya `0`.
+
+
+# --hints--
+
+Kichaguzi chako cha `#back-wall` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#back-wall')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#back-wall` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#back-wall')?.top === '0px');
+```
+
+Kichaguzi chako cha `#back-wall` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#back-wall')?.left === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51580.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51580.md
new file mode 100644
index 00000000000..cfed07cc3fe
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51580.md
@@ -0,0 +1,59 @@
+---
+id: 60b69a66b6ddb80858c51580
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Kipengele cha `z-index` kinatumika kuunda "tabaka" (layers) kwa vipengele vyako vya HTML. Ikiwa unafahamu wa zana za kuhariri picha, huenda ulifanya kazi na tabaka hapo awali. Hii ni dhana inayofanana.
+
+Vipengele vilivyo na thamani ya juu ya `z-index` vitaonekana kuwa vimewekwa juu ya vipengee vyenye thamani ya chini ya `z-index`. Hii inaweza kuunganishwa na nafasi katika somo lililopita ili kuunda athari za kipekee.
+
+Kwa kuwa kipengele cha `back-wall` kitahitaji kuonekana "nyuma" ya vipengele vingine utakavyounda, kipe kipengele cha `back-wall` `z-index` ya `-1`.
+
+# --hints--
+
+Kichaguzi chako cha `#back-wall` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `-1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#back-wall')?.zIndex === '-1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51581.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51581.md
new file mode 100644
index 00000000000..011937b87be
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51581.md
@@ -0,0 +1,68 @@
+---
+id: 60b69a66b6ddb80858c51581
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Chini ya kipengele chako cha `#back-wall`, unda `div` yenye `class` ya `characters`. Hapa ndipo utakuwa unaunda wahusika wa uchoraji wako.
+
+# --hints--
+
+Unapaswa kuongeza tu kipengele kimoja kipya cha `div`.
+
+```js
+assert(document.querySelectorAll('div').length === 2);
+```
+
+Kipengele chako kipya cha `div` kinafaa kuja baada ya kipengele chako cha `#back-wall`.
+
+```js
+assert(document.querySelector('#back-wall')?.nextElementSibling?.localName === 'div');
+```
+
+Kipengee chako kipya cha `div` kinapaswa kuwa na `class` iliyowekwa kuwa `characters`.
+
+```js
+assert(document.querySelectorAll('div')?.[1]?.classList?.contains('characters'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51582.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51582.md
new file mode 100644
index 00000000000..feae4c9a62e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51582.md
@@ -0,0 +1,70 @@
+---
+id: 60b69a66b6ddb80858c51582
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Ndani ya kipengele hicho cha `.characters`, unda `div` nyingine yenye `id` ya `offwhite-character`.
+
+# --hints--
+
+Unapaswa kuunda kipengele 1 pekee cha `div`.
+
+```js
+assert(document.querySelectorAll('div').length === 3);
+```
+
+Kipengee chako kipya cha `div` kinapaswa kuwekwa ndani ya kipengele chako cha `.characters`.
+
+```js
+assert(document.querySelector('.characters div'));
+```
+
+Kipengee chako kipya cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `offwhite-character`.
+
+```js
+assert(document.querySelector('.characters div')?.getAttribute('id') === 'offwhite-character');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51583.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51583.md
new file mode 100644
index 00000000000..60527b20df2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51583.md
@@ -0,0 +1,84 @@
+---
+id: 60b69a66b6ddb80858c51583
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Unda vipengele vinne vya `div` ndani ya kipengee chako cha `offwhite-character`. Vipe vipengele hivyo vya `div` thamani zifuatazo za `id` kwa mpangilio `white-hat`, `black-mask`, `gray-instrument`, `tan-table`.
+
+# --hints--
+
+Unapaswa kuongeza vipengele vinne vya `div` ndani ya kipengele chako cha `.offwhite-character`.
+
+```js
+assert(document.querySelectorAll('#offwhite-character div').length === 4);
+```
+
+Kipengele chako kipya cha kwanza cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `white-hat`.
+
+```js
+assert(document.querySelectorAll('#offwhite-character div')[0]?.getAttribute('id') === 'white-hat');
+```
+
+Kipengee chako kipya cha pili cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `black-mask`.
+
+```js
+assert(document.querySelectorAll('#offwhite-character div')[1]?.getAttribute('id') === 'black-mask');
+```
+
+Kipengee chako kipya cha tatu cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `gray-instrument`.
+
+```js
+assert(document.querySelectorAll('#offwhite-character div')[2]?.getAttribute('id') === 'gray-instrument');
+```
+
+Kipengele chako kipya cha nne cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `tan-table`.
+
+```js
+assert(document.querySelectorAll('#offwhite-character div')[3]?.getAttribute('id') === 'tan-table');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51584.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51584.md
new file mode 100644
index 00000000000..552d8b11b7b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51584.md
@@ -0,0 +1,79 @@
+---
+id: 60b69a66b6ddb80858c51584
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Mhusika anahitaji macho. Unda vipengele viwili vya `div` ndani ya kipengele chako cha `#black-mask`. Zipe classes za `eyes left` na `eyes right`, kwa mpangilio huo.
+
+# --hints--
+
+Unapaswa kuunda vipengee 2 vya `div` ndani ya kipengele chako cha `#black-mask`.
+
+```js
+assert(document.querySelectorAll('#black-mask div').length === 2);
+```
+
+`div` yako mpya ya kwanza inapaswa kuwa na classes za `eyes` na `left`.
+
+```js
+assert(document.querySelectorAll('#black-mask div')[0]?.classList.contains('eyes'));
+assert(document.querySelectorAll('#black-mask div')[0]?.classList.contains('left'));
+```
+
+`div` yako mpya ya pili inapaswa kuwa na classes za `eyes` na `right`.
+
+```js
+assert(document.querySelectorAll('#black-mask div')[1]?.classList.contains('eyes'));
+assert(document.querySelectorAll('#black-mask div')[1]?.classList.contains('right'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51585.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51585.md
new file mode 100644
index 00000000000..fe46f7e3c14
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51585.md
@@ -0,0 +1,74 @@
+---
+id: 60b69a66b6ddb80858c51585
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Unda "dots" kadhaa za kifaa. Ongeza vipengele vitano vya `div` ndani ya kipengele chako cha `#gray-instrument`. Weka `class` ya kila moja kuwa `black-dot`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele vitano vipya vya `div` ndani ya kipengele chako cha `#gray-instrument`.
+
+```js
+assert(document.querySelectorAll('#gray-instrument div').length === 5);
+```
+
+Vipengele vyako vitano vya `div` vyote vinapaswa kuwa na class yla `black-dot`.
+
+```js
+assert(document.querySelectorAll('#gray-instrument .black-dot').length === 5);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51586.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51586.md
new file mode 100644
index 00000000000..a318601db30
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51586.md
@@ -0,0 +1,93 @@
+---
+id: 60b69a66b6ddb80858c51586
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Kwa kutumia kichaguzi cha id, tengeneza kanuni ya kipengele chenye id `offwhite-character`. Ipe `width` ya `300px`, `height` ya `550px` na `background-color` ya `GhostWhite`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#offwhite-character`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#offwhite-character'));
+```
+
+`#offwhite-character` yako inapaswa kuwa na sifa ya `width` iliyowekwa kuwa `300px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#offwhite-character')?.width === '300px');
+```
+
+`#offwhite-character` yako inapaswa kuwa na sifa ya `height` iliyowekwa kuwa `550px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#offwhite-character')?.height === '550px');
+```
+
+`#offwhite-character` yako inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `GhostWhite`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#offwhite-character')?.backgroundColor === 'ghostwhite');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51587.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51587.md
new file mode 100644
index 00000000000..22c4e4a0e1e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51587.md
@@ -0,0 +1,91 @@
+---
+id: 60b69a66b6ddb80858c51587
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Sogeza kipengele cha `#offwhite-character` mahali panapofaa kwa kuipa `position` ya `absolute`, `top` ya `20%`, na `left` ya `17.5%`.
+
+# --hints--
+
+Kichaguzi chako cha `#offwhite-character` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#offwhite-character')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#offwhite-character` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `20%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#offwhite-character')?.top === '20%');
+```
+
+Kichaguzi chako cha `#offwhite-character` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `17.5%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#offwhite-character')?.left === '17.5%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51588.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51588.md
new file mode 100644
index 00000000000..dc1d166b85f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51588.md
@@ -0,0 +1,102 @@
+---
+id: 60b69a66b6ddb80858c51588
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Kwa kutumia kichaguzi cha id (id selector), tia mtindo kwenye kipengee chenye id `white-hat`. Ipe `width` na `height` ya `0`, na `border-style` ya `solid`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#white-hat`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat'));
+```
+
+Kichaguzi chako cha `#white-hat` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.width === '0px');
+```
+
+Kichaguzi chako cha `#white-hat` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.height === '0px');
+```
+
+Kichaguzi chako cha `#white-hat` kinafaa kuwa na sifa ya `border-style` iliyowekwa kuwa `solid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.borderStyle === 'solid');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51589.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51589.md
new file mode 100644
index 00000000000..25667f36e05
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51589.md
@@ -0,0 +1,88 @@
+---
+id: 60b69a66b6ddb80858c51589
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Hiyo haionekani kuwa sawa kabisa. Weka `border-width` ya `0 120px 140px 180px` ili kuweka ukubwa wa kofia ipasavyo.
+
+# --hints--
+
+Kichaguzi chako cha `#white-hat` kinafaa kuwa na sifa ya `border-width` iliyowekwa kuwa `0 120px 140px 180px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.borderWidth === '0px 120px 140px 180px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158a.md
new file mode 100644
index 00000000000..af7d074a99a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158a.md
@@ -0,0 +1,107 @@
+---
+id: 60b69a66b6ddb80858c5158a
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Now you have a large box. Ipatie `border-top-color`, `border-right-color`, na `border-left-color` ya `transparent`. Weka `border-bottom-color` kuwa `GhostWhite`. Hii itaifanya ionekane zaidi kama kofia.
+
+# --hints--
+
+Kichaguzi chako cha `#white-hat` kinapaswa kuwa na sifa ya `border-top-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.borderTopColor === 'transparent');
+```
+
+Kichaguzi chako cha `#white-hat` kinapaswa kuwa na sifa ya `border-right-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.borderRightColor === 'transparent');
+```
+
+Kichaguzi chako cha `#white-hat` kinapaswa kuwa na sifa ya `border-left-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.borderLeftColor === 'transparent');
+```
+
+Kichaguzi chako cha `#white-hat` kinapaswa kuwa na sifa ya `border-bottom-color` iliyowekwa kuwa `GhostWhite`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.borderBottomColor === 'ghostwhite');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158b.md
new file mode 100644
index 00000000000..705982bab19
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158b.md
@@ -0,0 +1,105 @@
+---
+id: 60b69a66b6ddb80858c5158b
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Ipe kofia `position` ya `absolute`, thamani ya `top` ya `-140px` na thamani ya `left` ya `0`.
+
+# --hints--
+
+Kichaguzi chako cha `#white-hat` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#white-hat` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `-140px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.top === '-140px');
+```
+
+Kichaguzi chako cha `#white-hat` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-hat')?.left === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158c.md
new file mode 100644
index 00000000000..a5c445edfb7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158c.md
@@ -0,0 +1,116 @@
+---
+id: 60b69a66b6ddb80858c5158c
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Kwa kutumia kichaguzi cha id, tengeneza kanuni ya kipengele cha id `black-mask`. Ipe `width` ya `100%`, `height` ya `50px` na `background-color` ya `rgb(45, 31, 19)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#black-mask`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-mask'));
+```
+
+Kichaguzi chako cha `#black-mask` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `100%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-mask')?.width === '100%');
+```
+
+Kichaguzi chako cha `#black-mask` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `50px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-mask')?.height === '50px');
+```
+
+Kichaguzi chako cha `#black-mask` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(45, 31, 19)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-mask')?.backgroundColor === 'rgb(45, 31, 19)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158d.md
new file mode 100644
index 00000000000..d7b31881957
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158d.md
@@ -0,0 +1,114 @@
+---
+id: 60b69a66b6ddb80858c5158d
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Ipe mask `position` ya `absolute`, na thamani za `top` na `left` za `0`.
+
+# --hints--
+
+Kichaguzi chako cha `#black-mask` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-mask')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#black-mask` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-mask')?.top === '0px');
+```
+
+Kichaguzi chako cha `#black-mask` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-mask')?.left === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158e.md
new file mode 100644
index 00000000000..8d62174e1ce
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158e.md
@@ -0,0 +1,105 @@
+---
+id: 60b69a66b6ddb80858c5158e
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Ili kuhakikisha kuwa unaweza kuona mask, ipe `z-index` ya `1`.
+
+# --hints--
+
+Kichaguzi chako cha `#black-mask` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-mask')?.zIndex === '1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158f.md
new file mode 100644
index 00000000000..317dbc2b22e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5158f.md
@@ -0,0 +1,126 @@
+---
+id: 60b69a66b6ddb80858c5158f
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Kwa kutumia kichaguzi cha id, kipe kipengee chenye id `gray-instrument` `width` ya `15%`, `height` ya `40%`, na `background-color` ya `rgb(167, 162, 117)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#gray-instrument`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-instrument'));
+```
+
+Kichaguzi chako cha `#gray-instrument` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `15%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-instrument')?.width === '15%');
+```
+
+Kichaguzi chako cha `#gray-instrument` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `40%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-instrument')?.height === '40%');
+```
+
+Kichaguzi chako cha `#gray-instrument` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(167, 162, 117)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-instrument')?.backgroundColor === 'rgb(167, 162, 117)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51590.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51590.md
new file mode 100644
index 00000000000..749fc59ec22
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51590.md
@@ -0,0 +1,124 @@
+---
+id: 60b69a66b6ddb80858c51590
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Sasa isogeze mahali kwa kutumia `position` ya `absolute`, thamani ya `top` ya `50px` na thamani ya `left` ya `125px`.
+
+# --hints--
+
+Kichaguzi chako cha `#gray-instrument` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-instrument')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#gray-instrument` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `50px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-instrument')?.top === '50px');
+```
+
+Kichaguzi chako cha `#gray-instrument` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `125px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-instrument')?.left === '125px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51591.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51591.md
new file mode 100644
index 00000000000..836210b7e4f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51591.md
@@ -0,0 +1,115 @@
+---
+id: 60b69a66b6ddb80858c51591
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Weka `z-index` kuwa `1`.
+
+# --hints--
+
+Kichaguzi chako cha `#gray-instrument` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-instrument')?.zIndex === '1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51592.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51592.md
new file mode 100644
index 00000000000..b7ef39dd147
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51592.md
@@ -0,0 +1,136 @@
+---
+id: 60b69a66b6ddb80858c51592
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Tumia kichaguzi cha class kuunda kanuni kwa vipengele vyenye class `black-dot`. Weka `width` kuwa `10px`, `height` kuwa `10px` na `background-color` kuwa `rgb(45, 31, 19)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.black-dot`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.black-dot'));
+```
+
+Kichaguzi chako cha `.black-dot` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `10px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.black-dot')?.width === '10px');
+```
+
+Kichaguzi chako cha `.black-dot` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `10px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.black-dot')?.height === '10px');
+```
+
+Kichaguzi chako cha `.black-dot` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(45, 31, 19)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.black-dot')?.backgroundColor === 'rgb(45, 31, 19)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51593.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51593.md
new file mode 100644
index 00000000000..d13dcef4977
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51593.md
@@ -0,0 +1,125 @@
+---
+id: 60b69a66b6ddb80858c51593
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Vitone hivi ni mraba sana. Ipe class ya `black-dot` `border-radius` ya `50%` ili kuirekebisha.
+
+# --hints--
+
+Kichaguzi chako cha `.black-dot` kinafaa kuwa na sifa ya `border-radius` iliyowekwa kuwa `50%`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.black-dot')?.borderTopLeftRadius, '50%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.black-dot')?.borderTopRightRadius, '50%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.black-dot')?.borderBottomRightRadius, '50%');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.black-dot')?.borderBottomLeftRadius, '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51594.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51594.md
new file mode 100644
index 00000000000..9b087014472
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51594.md
@@ -0,0 +1,135 @@
+---
+id: 60b69a66b6ddb80858c51594
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Sogeza dots hizo mahali pake kwa kuweka `display` kuwa `block`, `margin` kuwa `auto` na `margin-top` kuwa `65%`.
+
+# --hints--
+
+Kichaguzi chako cha `.black-dot` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `block`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.black-dot')?.display === 'block');
+```
+
+Kichaguzi chako cha `.black-dot` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `auto`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.black-dot')?.margin?.includes('auto'));
+```
+
+Kichaguzi chako cha `.black-dot` kinafaa kuwa na sifa ya `margin-top` iliyowekwa kuwa `65%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.black-dot')?.marginTop === '65%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51595.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51595.md
new file mode 100644
index 00000000000..358d1bfa5a8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51595.md
@@ -0,0 +1,146 @@
+---
+id: 60b69a66b6ddb80858c51595
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Kwa kutumia kichaguzi cha id (id selector), tia mtindo kwenye kipengee chenye id `tan-table`. Ipe `width` ya `450px`, `height` ya `140px` na `background-color` ya `#D2691E`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#tan-table`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#tan-table'));
+```
+
+Kichaguzi chako cha `#tan-table` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `450px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#tan-table')?.width === '450px');
+```
+
+Kichaguzi chako cha `#tan-table` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `140px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#tan-table')?.height === '140px');
+```
+
+Kichaguzi chako cha `#tan-table` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#D2691E`.
+
+```js
+assert (new __helpers.CSSHelp(document).getStyle('#tan-table')?.backgroundColor === 'rgb(210, 105, 30)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51596.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51596.md
new file mode 100644
index 00000000000..7ee39dd7a94
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51596.md
@@ -0,0 +1,144 @@
+---
+id: 60b69a66b6ddb80858c51596
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Sogeza jedwali mahali pake kwa kuipa `position` ya `absolute`, thamani ya `top` ya `275px` na thamani ya `left` ya `15px`.
+
+# --hints--
+
+Kichaguzi chako cha `#tan-table` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#tan-table')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#tan-table` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `275px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#tan-table')?.top === '275px');
+```
+
+Kichaguzi chako cha `#tan-table` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `15px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#tan-table')?.left === '15px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51597.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51597.md
new file mode 100644
index 00000000000..d1a1a1d89b0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51597.md
@@ -0,0 +1,135 @@
+---
+id: 60b69a66b6ddb80858c51597
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Ipe jedwali `z-index` ya `1`.
+
+# --hints--
+
+Kichaguzi chako cha `#tan-table` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#tan-table')?.zIndex === '1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51598.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51598.md
new file mode 100644
index 00000000000..cecb90fbc83
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51598.md
@@ -0,0 +1,142 @@
+---
+id: 60b69a66b6ddb80858c51598
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Baada ya kipengele chako cha `div#offwhite-character`, ongeza `div` kwa `id` ya `black-character`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele kipya cha `div` ndani ya kipengele cha `.characters`.
+
+```js
+assert(document.querySelectorAll('.characters > div')?.length === 2);
+```
+
+Kipengee chako kipya cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `black-character`.
+
+```js
+assert(document.querySelectorAll('.characters > div')?.[1]?.getAttribute('id') === 'black-character');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51599.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51599.md
new file mode 100644
index 00000000000..23f5b33554e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c51599.md
@@ -0,0 +1,156 @@
+---
+id: 60b69a66b6ddb80858c51599
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Ndani ya kipengele chako kipya cha `#black-character`, ongeza vipengele vitatu vya `div` vyenye thamani zifuatazo za `id`, kwa mpangilio huu `black-hat`, `gray-mask`, `white-paper`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele vitatu vya `div` ndani ya kipengele chako cha `#black-character`.
+
+```js
+assert(document.querySelectorAll('#black-character > div')?.length === 3);
+```
+
+Kipengee chako kipya cha kwanza cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `black-hat`.
+
+```js
+assert(document.querySelectorAll('#black-character > div')?.[0]?.getAttribute('id') === 'black-hat');
+```
+
+Kipengee chako kipya cha pili cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `gray-mask`.
+
+```js
+assert(document.querySelectorAll('#black-character > div')?.[1]?.getAttribute('id') === 'gray-mask');
+```
+
+Kipengee chako kipya cha tatu cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `white-paper`.
+
+```js
+assert(document.querySelectorAll('#black-character > div')?.[2]?.getAttribute('id') === 'white-paper');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159a.md
new file mode 100644
index 00000000000..1757213cba6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159a.md
@@ -0,0 +1,158 @@
+---
+id: 60b69a66b6ddb80858c5159a
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Mask inahitaji macho. Ndani ya kipengele chako cha `#gray-mask`, ongeza vipengele viwili vya `div`. Ya kwanza inapaswa kuwa na `class` iliyowekwa kuwa `eyes left`, na ya pili iwe na `class` iliyowekwa kuwa `eyes right`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele viwili vya `div` ndani ya kipengele chako cha `#gray-mask`.
+
+```js
+assert(document.querySelectorAll('#gray-mask > div')?.length === 2);
+```
+
+Kipengele chako kipya cha kwanza cha `div` kinapaswa kuwa na `class` iliyowekwa kuwa `eyes left`.
+
+```js
+const first = document.querySelectorAll('#gray-mask > div')?.[0];
+assert(first?.classList?.contains('eyes'));
+assert(first?.classList?.contains('left'));
+```
+
+Kipengele chako kipya cha pili cha `div` kinapaswa kuwa na `class` iliyowekwa kuwa `eyes right`.
+
+```js
+const second = document.querySelectorAll('#gray-mask > div')?.[1];
+assert(second?.classList?.contains('eyes'));
+assert(second?.classList?.contains('right'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159b.md
new file mode 100644
index 00000000000..405ed820eab
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159b.md
@@ -0,0 +1,161 @@
+---
+id: 60b69a66b6ddb80858c5159b
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Ni wakati wa kutumia aikoni za FontAwesome.
+
+Kipengele cha `i` kinatumika kwa maandishi ya nahau, au maandishi ambayo ni tofauti na maandishi ya "kawaida". Hii inaweza kuwa kwa maandishi ya _italic_, kama vile maneno ya kisayansi, au kwa aikoni kama zile zilizotolewa na FontAwesome.
+
+Ndani ya kipengele chako cha `#white-paper`, ongeza vipengele vinne vya `i`. Zipe zote thamani ya `class` ya `fas fa-music`.
+
+Darasa hili maalum ni jinsi FontAwesome huamua ikoni ya kupakia. `fas` inaonyesha aina ya aikoni (FontAwesome Solid, here), huku `fa-music` ikichagua ikoni mahususi.
+
+# --hints--
+
+Unapaswa kuwa na vipengele vinne vipya vya `i` ndani ya kipengele chako cha `#white-paper`.
+
+```js
+assert(document.querySelectorAll('#white-paper > i')?.length === 4);
+```
+
+Vipengele vyako vyote vya `i` vinapaswa kuwa na `class` iliyowekwa kuwa `fas fa-music`.
+
+```js
+const icons = document.querySelectorAll('#white-paper > i');
+for (const icon of icons) {
+ assert(icon.classList?.contains('fas'));
+ assert(icon.classList?.contains('fa-music'));
+};
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159c.md
new file mode 100644
index 00000000000..1fbad267875
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159c.md
@@ -0,0 +1,169 @@
+---
+id: 60b69a66b6ddb80858c5159c
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Tumia kichaguzi cha id kuunda kanuni ya kipengele chenye id `black-character`. Weka `width` kuwa `300px`, `height` kuwa `500px` na `background-color` kuwa `rgb(45, 31, 19)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#black-character`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-character'));
+```
+
+Kichaguzi chako cha `#black-character` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `300px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-character')?.width === '300px');
+```
+
+Kichaguzi chako cha `#black-character` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `500px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-character')?.height === '500px');
+```
+
+Kichaguzi chako cha `#black-character` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(45, 31, 19)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-character')?.backgroundColor === 'rgb(45, 31, 19)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159d.md
new file mode 100644
index 00000000000..e4277ac3fb0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159d.md
@@ -0,0 +1,167 @@
+---
+id: 60b69a66b6ddb80858c5159d
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Sogeza kipengele cha `#black-character` mahali ukiwa na `position` ya `absolute`, `top` ya `30%`, na `left` ya `59%`.
+
+# --hints--
+
+Kichaguzi chako cha `#black-character` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-character')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#black-character` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `30%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-character')?.top === '30%');
+```
+
+Kichaguzi chako cha `#black-character` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `59%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-character')?.left === '59%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159e.md
new file mode 100644
index 00000000000..14724c4b832
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159e.md
@@ -0,0 +1,178 @@
+---
+id: 60b69a66b6ddb80858c5159e
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Tumia kichaguzi cha id kuunda kanuni ya kipengele chenye id `black-hat`. Ipe `width` ya `0`, `height` ya `0` na `border-style` ya `solid`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#black-hat`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat'));
+```
+
+Kichaguzi chako cha `#black-hat` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.width === '0px');
+```
+
+Kichaguzi chako cha `#black-hat` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.height === '0px');
+```
+
+Kichaguzi chako cha `#black-hat` kinafaa kuwa na sifa ya `border-style` iliyowekwa kuwa `solid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.borderStyle === 'solid');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159f.md
new file mode 100644
index 00000000000..cdd7f09a08e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c5159f.md
@@ -0,0 +1,183 @@
+---
+id: 60b69a66b6ddb80858c5159f
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Kama vile `#white-hat`, unapaswa kuweka mtindo wa mpaka kwa kipengele cha `#black-hat`. Ipatie `border-top-color`, `border-right-color`, na `border-bottom-color` ya `transparent`. Weka `border-left-color` kuwa `rgb(45, 31, 19)`.
+
+# --hints--
+
+Kichaguzi chako cha `#black-hat` kinapaswa kuwa na sifa ya `border-top-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.borderTopColor === 'transparent');
+```
+
+Kichaguzi chako cha `#black-hat` kinapaswa kuwa na sifa ya `border-right-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.borderRightColor === 'transparent');
+```
+
+Kichaguzi chako cha `#black-hat` kinapaswa kuwa na sifa ya `border-bottom-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.borderBottomColor === 'transparent');
+```
+
+Kichaguzi chako cha `#black-hat` kinapaswa kuwa na sifa ya `border-left-color` iliyowekwa kuwa `rgb(45, 31, 19)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.borderLeftColor === 'rgb(45, 31, 19)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a0.md
new file mode 100644
index 00000000000..60642ce1315
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a0.md
@@ -0,0 +1,181 @@
+---
+id: 60b69a66b6ddb80858c515a0
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Sasa weka kipengele cha `#black-hat` katika nafasi yake. Weka `position` ya `absolute`, na `top` kuwa `-150px` na `left` kuwa `0`.
+
+# --hints--
+
+Kichaguzi chako cha `#black-hat` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#black-hat` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `-150px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.top === '-150px');
+```
+
+Kichaguzi chako cha `#black-hat` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.left === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a1.md
new file mode 100644
index 00000000000..4cf53eeac45
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a1.md
@@ -0,0 +1,192 @@
+---
+id: 60b69a66b6ddb80858c515a1
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Kwa kutumia kichaguzi cha id, tengeneza kipengee chenye id `gray-mask`. Ipe `width` ya `150px`, `height` ya `150px` na `background-color` ya `rgb(167, 162, 117)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#gray-mask`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-mask'));
+```
+
+Kichaguzi chako cha `#gray-mask` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `150px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-mask')?.height === '150px');
+```
+
+Kichaguzi chako cha `#gray-mask` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `150px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-mask')?.height === '150px')
+```
+
+Kichaguzi chako cha `#gray-mask` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(167, 162, 117)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-mask')?.backgroundColor === 'rgb(167, 162, 117)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a2.md
new file mode 100644
index 00000000000..2dcfc744b00
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a2.md
@@ -0,0 +1,190 @@
+---
+id: 60b69a66b6ddb80858c515a2
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Weka kipengele cha `#gray-mask` kwa kuweka `position` kuwa `absolute`, `top` kuwa `-10px`, na `left` kuwa `70px`.
+
+# --hints--
+
+Kichaguzi chako cha `#gray-mask` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-mask')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#gray-mask` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `-10px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-mask')?.top === '-10px');
+```
+
+Kichaguzi chako cha `#gray-mask` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `70px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#gray-mask')?.left === '70px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a3.md
new file mode 100644
index 00000000000..37a5104c99a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a3.md
@@ -0,0 +1,201 @@
+---
+id: 60b69a66b6ddb80858c515a3
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Kwa kutumia kichaguzi cha id, tengeneza sheria ya id `white-paper`. Weka `width` kuwa `400px`, `height` kuwa `100px` na `background-color` kuwa `GhostWhite`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#white-paper`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-paper'));
+```
+
+Kichaguzi chako cha `#white-paper` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `400px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-paper')?.width === '400px');
+```
+
+Kichaguzi chako cha `#white-paper` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `100px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-paper')?.height === '100px');
+```
+
+Kichaguzi chako cha `#white-paper` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `GhostWhite`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-paper')?.backgroundColor === 'ghostwhite');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a4.md
new file mode 100644
index 00000000000..561e9a2b842
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a4.md
@@ -0,0 +1,199 @@
+---
+id: 60b69a66b6ddb80858c515a4
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Ipe `#white-paper` `position` ya `absolute`, `top` ya `250px`, na `left` ya `-150px` ili kuisogeza mahali pake.
+
+# --hints--
+
+Kichaguzi chako cha `#white-paper` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-paper')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#white-paper` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `250px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-paper')?.top === '250px');
+```
+
+Kichaguzi chako cha `#white-paper` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `-150px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-paper')?.left === '-150px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a5.md
new file mode 100644
index 00000000000..7f6f9c9b39b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a5.md
@@ -0,0 +1,190 @@
+---
+id: 60b69a66b6ddb80858c515a5
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Weka `z-index` ya kipengele cha `#white-paper` kuwa `1`.
+
+# --hints--
+
+Kichaguzi chako cha `#white-paper` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#white-paper')?.zIndex === '1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a6.md
new file mode 100644
index 00000000000..c6bf2af5581
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a6.md
@@ -0,0 +1,211 @@
+---
+id: 60b69a66b6ddb80858c515a6
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Aikoni za FontAwesome huja na mtindo wao wenyewe ili kufafanua ikoni. Walakini, bado unaweza kuweka mtindo mwenyewe pia, ili kubadilisha vitu kama rangi na saizi. Kwa sasa, tumia kichaguzi cha class kulenga aikoni za class ya `fa-music`. Weka `display` kuwa `inline-block`, `margin-top` kuwa `8%` na `margin-left` kuwa `13%`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.fa-music`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fa-music'));
+```
+
+Kichaguzi chako cha `.fa-music` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `inline-block`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fa-music')?.display === 'inline-block');
+```
+
+Kichaguzi chako cha `.fa-music` kinapaswa kuwa na sifa ya `margin-top` iliyowekwa kuwa `8%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fa-music')?.marginTop === '8%');
+```
+
+Kichaguzi chako cha `.fa-music` kinapaswa kuwa na sifa ya `margin-left` iliyowekwa kuwa `13%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fa-music')?.marginLeft === '13%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a7.md
new file mode 100644
index 00000000000..53ee997ddf9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a7.md
@@ -0,0 +1,217 @@
+---
+id: 60b69a66b6ddb80858c515a7
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Chini ya kipengele chako cha `#black-character`, ongeza vipengele viwili vipya vya `div`. Hizi zitakuwa shawl. Wape zote mbili `class` ya `blue`. Kisha ipe ya kwanza `id` ya `blue-left`, na ya pili `id` ya `blue-right`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele viwili vipya vya `div` ndani ya kipengele chako cha `.characters`.
+
+```js
+assert(document.querySelectorAll('.characters > div')?.length === 4);
+```
+
+Vipengele vyako viwili vipya vya `div` vinapaswa kuwa na `class` iliyowekwa kuwa `blue`.
+
+```js
+const divs = document.querySelectorAll('.characters > div');
+assert(divs?.[2]?.classList?.contains('blue'))
+assert(divs?.[3]?.classList?.contains('blue'))
+```
+
+`div` yako mpya ya kwanza inapaswa kuwa na `id` ya `blue-left`.
+
+```js
+assert(document.querySelectorAll('.characters > div')?.[2]?.getAttribute('id') === 'blue-left');
+```
+
+`div` yako mpya ya pili inapaswa kuwa na `id` ya `blue-right`.
+
+```js
+assert(document.querySelectorAll('.characters > div')?.[3]?.getAttribute('id') === 'blue-right');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a8.md
new file mode 100644
index 00000000000..decc9c62540
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a8.md
@@ -0,0 +1,207 @@
+---
+id: 60b69a66b6ddb80858c515a8
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Tumia kichaguzi cha darasa kulenga vipengele vipya vilivyo na class ya `blue`. Weka `background-color` kuwa `#1E90FF`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.blue`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.blue'));
+```
+
+Kichaguzi chako cha `.blue` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#1E90FF`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.blue')?.backgroundColor === 'rgb(30, 144, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a9.md
new file mode 100644
index 00000000000..f8ca05bf159
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515a9.md
@@ -0,0 +1,217 @@
+---
+id: 60b69a66b6ddb80858c515a9
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Chagua kipengele chenye id `blue-left` kwa kutumia kichaguzi cha id. Ipe `width` ya `500px` na `height` ya `300px`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#blue-left`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-left'));
+```
+
+Kichaguzi chako cha `#blue-left` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `500px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-left')?.width === '500px');
+```
+
+Kichaguzi chako cha `#blue-left` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `300px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-left')?.height === '300px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515aa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515aa.md
new file mode 100644
index 00000000000..68b0c7e5e4a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515aa.md
@@ -0,0 +1,220 @@
+---
+id: 60b69a66b6ddb80858c515aa
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Sasa weka `position` kuwa `absolute`, `top` kuwa `20%` na `left` kuwa `20%`.
+
+# --hints--
+
+Kichaguzi chako cha `#blue-left` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-left')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#blue-left` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `20%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-left')?.top === '20%');
+```
+
+Kichaguzi chako cha `#blue-left` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `20%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-left')?.left === '20%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ab.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ab.md
new file mode 100644
index 00000000000..b386c6f777c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ab.md
@@ -0,0 +1,225 @@
+---
+id: 60b69a66b6ddb80858c515ab
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Ifuatayo, lenga kipengele chenye id `blue-right` kwa kutumia kichaguzi cha kitambulisho. Weka `width` kuwa `400px` na `height` kuwa `300px`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#blue-right`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-right'));
+```
+
+Kichaguzi chako cha `#blue-right` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `400px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-right')?.width === '400px');
+```
+
+Kichaguzi chako cha `#blue-right` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `300px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-right')?.height === '300px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ac.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ac.md
new file mode 100644
index 00000000000..03c832c27e9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ac.md
@@ -0,0 +1,228 @@
+---
+id: 60b69a66b6ddb80858c515ac
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Kipe kipengele cha `#blue-right` nafasi sahihi kwa kutumia `position` iliyowekwa `absolute`, `top` iliyowekwa `50%`, na `left` iliyowekwa kuwa `40%`.
+
+# --hints--
+
+Kichaguzi chako cha `#blue-right` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-right')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#blue-right` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `50%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-right')?.top === '50%');
+```
+
+Kichaguzi chako cha `#blue-right` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `40%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#blue-right')?.left === '40%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ad.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ad.md
new file mode 100644
index 00000000000..05935aa2750
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ad.md
@@ -0,0 +1,225 @@
+---
+id: 60b69a66b6ddb80858c515ad
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Chini ya vipengele vyako vya `.blue`, ongeza `div` nyingine. Ipe thamani ya `id` ya `orange-character`.
+
+# --hints--
+
+Unapaswa kuwa na kipengele kipya cha `div` ndani ya kipengele chako cha `.characters`.
+
+```js
+assert(document.querySelectorAll('.characters > div')?.length === 5);
+```
+
+Kipengee chako kipya cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `orange-character`.
+
+```js
+assert(document.querySelectorAll('.characters > div')?.[4]?.getAttribute('id') === 'orange-character');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ae.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ae.md
new file mode 100644
index 00000000000..a7c411b98a2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ae.md
@@ -0,0 +1,245 @@
+---
+id: 60b69a66b6ddb80858c515ae
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Ndani ya kipengele hicho cha `#orange-character`, ongeza vipengele vinne vya `div`. Zipe thamani za `id` za `black-round-hat`, `eyes-div`, `triangles` na `guitar`, kwa utaratibu.
+
+# --hints--
+
+Unapaswa kuwa na vipengele vinne vipya vya `div` ndani ya kipengele chako cha `#orange-character`.
+
+```js
+assert(document.querySelectorAll('#orange-character > div')?.length === 4);
+```
+
+Kipengee chako kipya cha kwanza cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `black-round-hat`.
+
+```js
+assert(document.querySelectorAll('#orange-character > div')?.[0]?.getAttribute('id') === 'black-round-hat');
+```
+
+Kipengee chako kipya cha pili cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `eyes-div`.
+
+```js
+assert(document.querySelectorAll('#orange-character > div')?.[1]?.getAttribute('id') === 'eyes-div');
+```
+
+Kipengee chako kipya cha tatu cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `triangles`.
+
+```js
+assert(document.querySelectorAll('#orange-character > div')?.[2]?.getAttribute('id') === 'triangles');
+```
+
+Kipengee chako kipya cha nne cha `div` kinapaswa kuwa na `id` iliyowekwa kuwa `guitar`.
+
+```js
+assert(document.querySelectorAll('#orange-character > div')?.[3]?.getAttribute('id') === 'guitar');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515af.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515af.md
new file mode 100644
index 00000000000..3dcb00ccc65
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515af.md
@@ -0,0 +1,240 @@
+---
+id: 60b69a66b6ddb80858c515af
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Kipengele cha `#eyes-div` kinafaa kushikilia baadhi ya macho. Ongeza vipengele viwili vya `div` ndani. Ipe ya kwanza `class` ya `eyes left`, na ya pili `class` ya `eyes right`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele viwili vya `div` vilivyowekwa kwenye kipengele chako cha `#eyes-div`.
+
+```js
+assert(document.querySelectorAll('#eyes-div > div')?.length === 2);
+```
+
+`div` mpya ya kwanza inapaswa kuwa na `class` iliyowekwa kuwa `eyes left`.
+
+```js
+assert(document.querySelectorAll('#eyes-div > div')?.[0]?.classList?.contains('eyes'));
+assert(document.querySelectorAll('#eyes-div > div')?.[0]?.classList?.contains('left'));
+```
+
+`div` ya pili mpya inapaswa kuwa na `class` iliyowekwa kuwa `eyes right`.
+
+```js
+assert(document.querySelectorAll('#eyes-div > div')?.[1]?.classList?.contains('eyes'));
+assert(document.querySelectorAll('#eyes-div > div')?.[1]?.classList?.contains('right'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b0.md
new file mode 100644
index 00000000000..3b9e2549f49
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b0.md
@@ -0,0 +1,238 @@
+---
+id: 60b69a66b6ddb80858c515b0
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Ndani ya div ya `#triangles`, utahitaji kuongeza vipengele ambavyo vitakuwa pembetatu zako. Unda vipengele thelathini vya `div` na uvipe kila class ya `triangle`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele 30 vya `div` ndani ya kipengele chako cha `#triangles`.
+
+```js
+assert(document.querySelectorAll('#triangles > div')?.length === 30);
+```
+
+Vipengele vyako vyote 30 vya `div` vinapaswa kuwa na `class` iliyowekwa kuwa `triangle`.
+
+```js
+const divDivDiv = document.querySelectorAll('#triangles > div');
+for (const div of divDivDiv) {
+ assert(div?.classList?.contains('triangle'));
+}
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b1.md
new file mode 100644
index 00000000000..0e1e3d3bc71
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b1.md
@@ -0,0 +1,298 @@
+---
+id: 60b69a66b6ddb80858c515b1
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Ndani ya kipengele cha `#guitar`, unda vipengele vitatu vya `div`. Zipe mbili za kwanza thamani ya `class` ya `guitar`. Kisha ipe ya kwanza `id` ya `guitar-left`, na ya pili `id` ya `guitar-right`. Ongeza `id` kwa `div` ya tatu yenye thamani `guitar-neck`.
+
+`div` ya tatu haipaswi kuwa na darasa la `guitar`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele vitatu vipya vya `div` ndani ya kipengele chako cha `#guitar`.
+
+```js
+assert(document.querySelectorAll('#guitar > div')?.length === 3);
+```
+
+`div` yako mpya ya kwanza inapaswa kuwa na `class` iliyowekwa kuwa `guitar`.
+
+```js
+assert(document.querySelectorAll('#guitar > div')?.[0]?.classList?.contains('guitar'));
+```
+
+`div` yako mpya ya kwanza inapaswa kuwa na `id` iliyowekwa kuwa `guitar-left`.
+
+```js
+assert(document.querySelectorAll('#guitar > div')?.[0]?.getAttribute('id') === 'guitar-left');
+```
+
+`div` yako mpya ya pili inapaswa kuwa na `class` iliyowekwa kuwa `guitar`.
+
+```js
+assert(document.querySelectorAll('#guitar > div')?.[1]?.classList?.contains('guitar'));
+```
+
+`div` yako mpya ya pili inapaswa kuwa na `id` iliyowekwa kuwa `guitar-right`.
+
+```js
+assert(document.querySelectorAll('#guitar > div')?.[1]?.getAttribute('id') === 'guitar-right');
+```
+
+`div` yako mpya ya tatu inapaswa kuwa na `id` iliyowekwa kuwa `guitar-neck`.
+
+```js
+assert(document.querySelectorAll('#guitar > div')?.[2]?.getAttribute('id') === 'guitar-neck');
+```
+
+Hupaswi kuipa `div` mpya ya tatu `class` ya `guitar`.
+
+```js
+assert.notExists(document.querySelector('#guitar > #guitar-neck.guitar'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b2.md
new file mode 100644
index 00000000000..d9f55eedea2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b2.md
@@ -0,0 +1,281 @@
+---
+id: 60b69a66b6ddb80858c515b2
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Tumia ikoni nyingine ya FontAwesome kwa `.guitar` yako. Ndani ya vipengele vyote viwili vya `#guitar-left` na `#guitar-right`, ongeza kipengele cha `i` na ukipe `class` ya `fas fa-bars`.
+
+# --hints--
+
+Ndani ya kipengele chako cha `#guitar-left`, unapaswa kuongeza kipengele cha `i`.
+
+```js
+assert(document.querySelectorAll('#guitar-left > i')?.length === 1);
+```
+
+Ndani ya kipengele chako cha `#guitar-right`, unapaswa kuongeza kipengele cha `i`.
+
+```js
+assert(document.querySelectorAll('#guitar-right > i')?.length === 1);
+```
+
+Vipengele vyako viwili vipya vya `i` vinapaswa kuwa na `class` iliyowekwa kuwa `fas fa-bars`.
+
+```js
+assert(document.querySelector('#guitar-left > i')?.classList?.contains('fas'));
+assert(document.querySelector('#guitar-left > i')?.classList?.contains('fa-bars'));
+assert(document.querySelector('#guitar-right > i')?.classList?.contains('fas'));
+assert(document.querySelector('#guitar-right > i')?.classList?.contains('fa-bars'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --fcc-editable-region--
+
+
+
+
+
+
+ --fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b3.md
new file mode 100644
index 00000000000..9a3df7159b4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b3.md
@@ -0,0 +1,287 @@
+---
+id: 60b69a66b6ddb80858c515b3
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Chagua kipengee chako cha `orange-character` na kichaguzi cha id. Ipe `width` ya `250px`, `height` ya `550px` na `background-color` ya `rgb(240, 78, 42)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#orange-character`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#orange-character'));
+```
+
+Kichaguzi chako cha `#orange-character` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `250px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#orange-character')?.width === '250px');
+```
+
+Kichaguzi chako cha `#orange-character` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `550px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#orange-character')?.height === '550px');
+```
+
+Kichaguzi chako cha `#orange-character` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(240, 78, 42)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#orange-character')?.backgroundColor === 'rgb(240, 78, 42)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b4.md
new file mode 100644
index 00000000000..ce5aee5937e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b4.md
@@ -0,0 +1,285 @@
+---
+id: 60b69a66b6ddb80858c515b4
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Kipe kipengele cha `#orange-character` `position` ya `absolute`, `top` ya `25%`, na `left` ya `40%`.
+
+# --hints--
+
+Kichaguzi chako cha `#orange-character` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#orange-character')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#orange-character` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `25%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#orange-character')?.top === '25%');
+```
+
+Kichaguzi chako cha `#orange-character` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `40%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#orange-character')?.left === '40%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b5.md
new file mode 100644
index 00000000000..693e532cc22
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b5.md
@@ -0,0 +1,296 @@
+---
+id: 60b69a66b6ddb80858c515b5
+title: Hatua ya 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+Weka mtindo wa kipengele kwa id `black-round-hat` kwa kutumia kichaguzi cha id. Weka `width` kuwa `180px`, `height` kuwa `150px` na `background-color` kuwa `rgb(45, 31, 19)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#black-round-hat`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat'));
+```
+
+Kichaguzi chako cha `#black-round-hat` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `180px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat')?.width === '180px');
+```
+
+Kichaguzi chako cha `#black-round-hat` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `150px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat')?.height === '150px');
+```
+
+Kichaguzi chako cha `#black-round-hat` kinapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `rgb(45, 31, 19)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat')?.backgroundColor === 'rgb(45, 31, 19)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b6.md
new file mode 100644
index 00000000000..03208cd7d2b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b6.md
@@ -0,0 +1,282 @@
+---
+id: 60b69a66b6ddb80858c515b6
+title: Hatua ya 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Kipengele cha `#black-round-hat` lazima kiwe cha mviringo. Ipe `border-radius` ya `50%` ili kurekebisha hili.
+
+# --hints--
+
+Kichaguzi chako cha `#black-round-hat` kinafaa kuwa na sifa ya `border-radius` iliyowekwa kuwa `50%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat')?.borderRadius === '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b7.md
new file mode 100644
index 00000000000..823ead670e7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b7.md
@@ -0,0 +1,295 @@
+---
+id: 60b69a66b6ddb80858c515b7
+title: Hatua ya 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Sogeza kipengele cha `#black-round-hat` mahali ukiwa na `position` ya `absolute`, `top` ya `-100px`, na `left` ya `5px`.
+
+# --hints--
+
+Kichaguzi chako cha `#black-round-hat` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#black-round-hat` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `-100px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat')?.top === '-100px');
+```
+
+Kichaguzi chako cha `#black-round-hat` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `5px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat')?.left === '5px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b8.md
new file mode 100644
index 00000000000..59b6c559b94
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b8.md
@@ -0,0 +1,286 @@
+---
+id: 60b69a66b6ddb80858c515b8
+title: Hatua ya 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Weka kipengele cha `#black-round-hat` kwenye safu sahihi kwa `z-index` ya `-1`.
+
+# --hints--
+
+Kichaguzi chako cha `#black-round-hat` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `-1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-round-hat')?.zIndex === '-1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b9.md
new file mode 100644
index 00000000000..7a37b7b2011
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515b9.md
@@ -0,0 +1,301 @@
+---
+id: 60b69a66b6ddb80858c515b9
+title: Hatua ya 68
+challengeType: 0
+dashedName: step-68
+---
+
+# --description--
+
+Tumia kichaguzi cha id kuunda kanuni ya kipengele kwa id `eyes-div`. Weka `width` kuwa `180px` na `height` kuwa `50px`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `#eyes-div`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#eyes-div'));
+```
+
+Kichaguzi chako cha `#eyes-div` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `180px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#eyes-div')?.width === '180px');
+```
+
+Kichaguzi chako cha `#eyes-div` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `50px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#eyes-div')?.height === '50px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ba.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ba.md
new file mode 100644
index 00000000000..40c7c0492ed
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515ba.md
@@ -0,0 +1,304 @@
+---
+id: 60b69a66b6ddb80858c515ba
+title: Hatua ya 69
+challengeType: 0
+dashedName: step-69
+---
+
+# --description--
+
+Sasa sogeza kipengele cha `#eyes-div` kwenye nafasi na `position` iliyowekwa kuwa `absolute`, `top` iliyowekwa kuwa `-40px`, na `left` zimewekwa kuwa `20px`.
+
+# --hints--
+
+Kichaguzi chako cha `#eyes-div` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#eyes-div')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#eyes-div` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `-40px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#eyes-div')?.top === '-40px');
+```
+
+Kichaguzi chako cha `#eyes-div` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `20px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#eyes-div')?.left === '20px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bc.md
new file mode 100644
index 00000000000..157ed62cdb0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bc.md
@@ -0,0 +1,295 @@
+---
+id: 60b69a66b6ddb80858c515bc
+title: Hatua ya 70
+challengeType: 0
+dashedName: step-70
+---
+
+# --description--
+
+Kipe kipengele cha `#eyes-div` `z-index` ya `3`.
+
+# --hints--
+
+Kichaguzi chako cha `#eyes-div` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `3`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#eyes-div')?.zIndex === '3');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bd.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bd.md
new file mode 100644
index 00000000000..51c8bbadb67
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bd.md
@@ -0,0 +1,348 @@
+---
+id: 60b69a66b6ddb80858c515bd
+title: Hatua ya 79
+challengeType: 0
+dashedName: step-79
+---
+
+# --description--
+
+Sasa tumia kichaguzi cha darasa kulenga `guitar`. Hii itaunda "nusu" mbili za gita lako. Weka `width` kuwa `150px`, `height` hadi `120px`, `background-color` kuwa `Goldenrod`, na `border-radius` kuwa `50%`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.guitar`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.guitar'));
+```
+
+Kichaguzi chako cha `.guitar` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `150px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.guitar')?.width === '150px');
+```
+
+Kichaguzi chako cha `.guitar` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `120px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.guitar')?.height === '120px');
+```
+
+Kichaguzi chako cha `.guitar` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `Goldenrod`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.guitar')?.backgroundColor === 'goldenrod');
+```
+
+Kichaguzi chako cha `.guitar` kinafaa kuwa na sifa ya `border-radius` iliyowekwa kuwa `50%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.guitar')?.borderRadius === '50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515be.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515be.md
new file mode 100644
index 00000000000..f38457e6616
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515be.md
@@ -0,0 +1,337 @@
+---
+id: 60b69a66b6ddb80858c515be
+title: Hatua ya 80
+challengeType: 0
+dashedName: step-80
+---
+
+# --description--
+
+Chagua `id` yenye thamani `guitar-left`, na uweke `position` kuwa `absolute` na `left` kuwa`0px`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi kipya cha `#guitar-left`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-left'));
+```
+
+Kichaguzi chako cha `#guitar-left` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-left')?.position === 'absolute');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bf.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bf.md
new file mode 100644
index 00000000000..51df40c72cb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515bf.md
@@ -0,0 +1,348 @@
+---
+id: 60b69a66b6ddb80858c515bf
+title: Hatua ya 81
+challengeType: 0
+dashedName: step-81
+---
+
+# --description--
+
+Chagua `id` yenye thamani `guitar-right`, na pia weka `position` kuwa `absolute`. Wakati huu, weka `left` kuwa `100px`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi kipya cha `#guitar-right`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-right'));
+```
+
+Kichaguzi chako cha `#guitar-right` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-right')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#guitar-right` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `100px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-right')?.left === '100px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c0.md
new file mode 100644
index 00000000000..4203c2b9e28
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c0.md
@@ -0,0 +1,359 @@
+---
+id: 60b69a66b6ddb80858c515c0
+title: Hatua ya 82
+challengeType: 0
+dashedName: step-82
+---
+
+# --description--
+
+Sasa unahitaji kuhamisha aikoni za bar mahali panapofaa. Unda kichaguzi cha darasa cha darasa la `fa-bars`. Weka `display` kuwa `block`, `margin-top` kuwa `30%` na `margin-left` kuwa `40%`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.fa-bars`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fa-bars'));
+```
+
+Kichaguzi chako cha `.fa-bars` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `block`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fa-bars')?.display === 'block');
+```
+
+Kichaguzi chako cha `.fa-bars` kinapaswa kuwa na sifa ya `margin-top` iliyowekwa kuwa `30%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fa-bars')?.marginTop === '30%');
+```
+
+Kichaguzi chako cha `.fa-bars` kinapaswa kuwa na sifa ya `margin-left` iliyowekwa kuwa `40%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fa-bars')?.marginLeft === '40%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c1.md
new file mode 100644
index 00000000000..b287dbaf69c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c1.md
@@ -0,0 +1,365 @@
+---
+id: 60b69a66b6ddb80858c515c1
+title: Hatua ya 83
+challengeType: 0
+dashedName: step-83
+---
+
+# --description--
+
+Tumia kichaguzi cha id kuunda sheria ya id `guitar-neck`. Weka `width` kuwa `200px`, `height` kuwa `30px` na `background-color` kuwa `#D2691E`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `#guitar-neck`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-neck'));
+```
+
+Kichaguzi chako cha `#guitar-neck` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `200px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-neck')?.width === '200px');
+```
+
+Kichaguzi chako cha `#guitar-neck` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `30px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-neck')?.height === '30px');
+```
+
+Kichaguzi chako cha `#guitar-neck` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#D2691E`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-neck')?.backgroundColor === 'rgb(210, 105, 30)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+.fa-bars {
+ display: block;
+ margin-top: 30%;
+ margin-left: 40%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c2.md
new file mode 100644
index 00000000000..650b6d7d41f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c2.md
@@ -0,0 +1,363 @@
+---
+id: 60b69a66b6ddb80858c515c2
+title: Hatua ya 84
+challengeType: 0
+dashedName: step-84
+---
+
+# --description--
+
+Sasa sogeza kipengele cha `#guitar-neck` kiwe na `position` iliyowekwa kuwa `absolute`, `top` iliyowekwa kuwa `45px`, na `left` iliyowekwa kuwa `200px`.
+
+# --hints--
+
+Kichaguzi chako cha `#guitar-neck` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-neck')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#guitar-neck` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `45px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-neck')?.top === '45px');
+```
+
+Kichaguzi chako cha `#guitar-neck` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `200px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-neck')?.left === '200px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+.fa-bars {
+ display: block;
+ margin-top: 30%;
+ margin-left: 40%;
+}
+
+#guitar-neck {
+ width: 200px;
+ height: 30px;
+ background-color: #D2691E;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c3.md
new file mode 100644
index 00000000000..fa983a48023
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c3.md
@@ -0,0 +1,354 @@
+---
+id: 60b69a66b6ddb80858c515c3
+title: Hatua ya 85
+challengeType: 0
+dashedName: step-85
+---
+
+# --description--
+
+Kipe kipengele cha `#guitar-neck` `z-index` ya `3`.
+
+# --hints--
+
+Kichaguzi chako cha `#guitar-neck` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `3`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar-neck')?.zIndex === '3');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+.fa-bars {
+ display: block;
+ margin-top: 30%;
+ margin-left: 40%;
+}
+
+#guitar-neck {
+ width: 200px;
+ height: 30px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 45px;
+ left: 200px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c4.md
new file mode 100644
index 00000000000..e292323dd1c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c4.md
@@ -0,0 +1,381 @@
+---
+id: 60b69a66b6ddb80858c515c4
+title: Hatua ya 86
+challengeType: 0
+dashedName: step-86
+---
+
+# --description--
+
+Wakati wa kupamba vipengele kwa darasa la `eyes`. Tumia kichaguzi cha darasa kuweka `width` kuwa `35px`, `height` kuwa `20px`, `background-color` kuwa `#8B4513`, na `border-radius` kuwa `20px 50%`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.eyes`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.eyes'));
+```
+
+Kichaguzi chako cha `.eyes` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `35px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.eyes')?.width === '35px');
+```
+
+Kichaguzi chako cha `.eyes` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `20px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.eyes')?.height === '20px');
+```
+
+Kichaguzi chako cha `.eyes` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#8B4513`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.eyes')?.backgroundColor === 'rgb(139, 69, 19)');
+```
+
+Kichaguzi chako cha `.eyes` kinafaa kuwa na sifa ya `border-radius` iliyowekwa kuwa `20px 50%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.eyes')?.borderRadius === '20px 50%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+.fa-bars {
+ display: block;
+ margin-top: 30%;
+ margin-left: 40%;
+}
+
+#guitar-neck {
+ width: 200px;
+ height: 30px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 45px;
+ left: 200px;
+ z-index: 3;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c5.md
new file mode 100644
index 00000000000..6fc577bc14f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c5.md
@@ -0,0 +1,382 @@
+---
+id: 60b69a66b6ddb80858c515c5
+title: Hatua ya 87
+challengeType: 0
+dashedName: step-87
+---
+
+# --description--
+
+Lenga `class` yenye thamani `right` na uweke `position` kuwa `absolute`, `top` kuwa `15px`, na `right` kuwa `30px`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.right`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.right'));
+```
+
+Kichaguzi chako cha `.right` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.right')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `.right` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `15px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.right')?.top === '15px');
+```
+
+Kichaguzi chako cha `.right` kinafaa kuwa na sifa ya `right` iliyowekwa kuwa `30px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.right')?.right === '30px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+.fa-bars {
+ display: block;
+ margin-top: 30%;
+ margin-left: 40%;
+}
+
+#guitar-neck {
+ width: 200px;
+ height: 30px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 45px;
+ left: 200px;
+ z-index: 3;
+}
+
+.eyes {
+ width: 35px;
+ height: 20px;
+ background-color: #8B4513;
+ border-radius: 20px 50%;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c6.md
new file mode 100644
index 00000000000..0706ea2c3fa
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c6.md
@@ -0,0 +1,388 @@
+---
+id: 60b69a66b6ddb80858c515c6
+title: Hatua ya 88
+challengeType: 0
+dashedName: step-88
+---
+
+# --description--
+
+Kwa `class` yenye thamani `left`, tengeneza kichaguzi na uweke `position` kuwa `absolute`, `top` kuwa `15px`, na `left` kuwa `30px`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi kipya cha `.left`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.left'));
+```
+
+Kichaguzi chako cha `.left` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.left')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `.left` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `15px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.left')?.top === '15px');
+```
+
+Kichaguzi chako cha `.left` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `30px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.left')?.left === '30px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+width: 150px;
+height: 120px;
+background-color: Goldenrod;
+border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+.fa-bars {
+ display: block;
+ margin-top: 30%;
+ margin-left: 40%;
+}
+
+#guitar-neck {
+ width: 200px;
+ height: 30px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 45px;
+ left: 200px;
+ z-index: 3;
+}
+
+.eyes {
+ width: 35px;
+ height: 20px;
+ background-color: #8B4513;
+ border-radius: 20px 50%;
+}
+
+.right {
+ position: absolute;
+ top: 15px;
+ right: 30px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c7.md
new file mode 100644
index 00000000000..65e13c23f85
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b69a66b6ddb80858c515c7.md
@@ -0,0 +1,739 @@
+---
+id: 60b69a66b6ddb80858c515c7
+title: Hatua ya 89
+challengeType: 0
+dashedName: step-89
+---
+
+# --description--
+
+Hatua moja ya mwisho. Aikoni za FontAwesome ni ndogo sana. Lenga vyote kwa kichaguzi cha darasa cha `fas`, na uweke `font-size` kuwa `30px`.
+
+Kwa hayo, mchoro wako wa Picasso umekamilika!
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.fas`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fas'));
+```
+
+Kichaguzi chako cha `.fas` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `30px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.fas')?.fontSize === '30px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+.fa-bars {
+ display: block;
+ margin-top: 30%;
+ margin-left: 40%;
+}
+
+#guitar-neck {
+ width: 200px;
+ height: 30px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 45px;
+ left: 200px;
+ z-index: 3;
+}
+
+.eyes {
+ width: 35px;
+ height: 20px;
+ background-color: #8B4513;
+ border-radius: 20px 50%;
+}
+
+.right {
+ position: absolute;
+ top: 15px;
+ right: 30px;
+}
+
+.left {
+ position: absolute;
+ top: 15px;
+ left: 30px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold; /* yellow */
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ z-index: 3;
+}
+
+.guitar {
+ width: 150px;
+ height: 120px;
+ background-color: Goldenrod;
+ border-radius: 50%;
+}
+
+#guitar-left {
+ position: absolute;
+ left: 0px;
+}
+
+#guitar-right {
+ position: absolute;
+ left: 100px;
+}
+
+.fa-bars {
+ display: block;
+ margin-top: 30%;
+ margin-left: 40%;
+}
+
+#guitar-neck {
+ width: 200px;
+ height: 30px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 45px;
+ left: 200px;
+ z-index: 3;
+}
+
+.eyes {
+ width: 35px;
+ height: 20px;
+ background-color: #8B4513;
+ border-radius: 20px 50%;
+}
+
+.right {
+ position: absolute;
+ top: 15px;
+ right: 30px;
+}
+
+.left {
+ position: absolute;
+ top: 15px;
+ left: 30px;
+}
+
+.fas {
+ font-size: 30px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b80da8676fb3227967a731.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b80da8676fb3227967a731.md
new file mode 100644
index 00000000000..42e03951cdd
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60b80da8676fb3227967a731.md
@@ -0,0 +1,71 @@
+---
+id: 60b80da8676fb3227967a731
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Endelea na uunganishe faili yako ya CSS sasa, ingawa bado hujaandika CSS yoyote.
+
+Ongeza kipengele cha `link` kilicho na `rel` ya `stylesheet` na `href` ya `styles.css`.
+
+# --hints--
+
+
+Msimbo wako unapaswa kuwa na kipengele cha `link`.
+
+```js
+assert.match(code, / link'));
+```
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `rel` yenye thamani `stylesheet`.
+
+```js
+const link_element = document.querySelector('link');
+const rel = link_element.getAttribute("rel");
+assert.equal(rel, "stylesheet");
+```
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `href` yenye thamani `styles.css`.
+
+```js
+const link = document.querySelector('link');
+assert.equal(link.dataset.href, "styles.css");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba890832b4940f24d1936b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba890832b4940f24d1936b.md
new file mode 100644
index 00000000000..e80f17d6bdf
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba890832b4940f24d1936b.md
@@ -0,0 +1,312 @@
+---
+id: 60ba890832b4940f24d1936b
+title: Hatua ya 75
+challengeType: 0
+dashedName: step-75
+---
+
+# --description--
+
+Rekebisha mpangilio wa vipengele vya `.triangle` kuwa `display` ya `inline-block`.
+
+# --hints--
+
+Kichaguzi chako cha `.triangle` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `inline-block`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.display === 'inline-block');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold;
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba89123a445e0f5c9e4022.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba89123a445e0f5c9e4022.md
new file mode 100644
index 00000000000..61604d41388
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba89123a445e0f5c9e4022.md
@@ -0,0 +1,326 @@
+---
+id: 60ba89123a445e0f5c9e4022
+title: Hatua ya 74
+challengeType: 0
+dashedName: step-74
+---
+
+# --description--
+
+Vipe vipengele vyako vya `.triangle` rangi sahihi. Weka `border-top-color`, `border-bottom-color`, na `border-left-color` kuwa `transparent`. Weka `border-right-color` kuwa `Gold`.
+
+# --hints--
+
+Kichaguzi chako cha `.triangle` kinapaswa kuwa na sifa ya `border-top-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.borderTopColor === 'transparent');
+```
+
+Kichaguzi chako cha `.triangle` kinapaswa kuwa na sifa ya `border-bottom-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.borderBottomColor === 'transparent');
+```
+
+Kichaguzi chako cha `.triangle` kinapaswa kuwa na sifa ya `border-left-color` iliyowekwa kuwa `transparent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.borderLeftColor === 'transparent');
+```
+
+Kichaguzi chako cha `.triangle` kinafaa kuwa na sifa ya `border-right-color` iliyowekwa kuwa `Gold`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.borderRightColor === 'gold');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba8913f1704c0f7a8906b8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba8913f1704c0f7a8906b8.md
new file mode 100644
index 00000000000..5eb5be336db
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba8913f1704c0f7a8906b8.md
@@ -0,0 +1,312 @@
+---
+id: 60ba8913f1704c0f7a8906b8
+title: Hatua ya 73
+challengeType: 0
+dashedName: step-73
+---
+
+# --description--
+
+Tengeneza mtindo wa mpaka wa vipengele vyako vya `.triangle`. Weka `border-style` kuwa `solid` na `border-width` kuwa `42px 45px 45px 0`.
+
+# --hints--
+
+Kichaguzi chako cha `.triangle` kinafaa kuwa na sifa ya `border-style` iliyowekwa kuwa `solid`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.borderStyle === 'solid');
+```
+
+Kichaguzi chako cha `.triangle` kinafaa kuwa na sifa ya `border-width` iliyowekwa kuwa `42px 45px 45px 0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.borderWidth === '42px 45px 45px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba89146b25080f99ab54ad.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba89146b25080f99ab54ad.md
new file mode 100644
index 00000000000..4a8b3969b64
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba89146b25080f99ab54ad.md
@@ -0,0 +1,315 @@
+---
+id: 60ba89146b25080f99ab54ad
+title: Hatua ya 72
+challengeType: 0
+dashedName: step-72
+---
+
+# --description--
+
+Unda kichaguzi cha class cha vipengele vyenye class ya `triangle`. Weka `width` kuwa `0` na `height` kuwa `0`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.triangle`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle'));
+```
+
+Kichaguzi chako cha `.triangle` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.width === '0px');
+```
+
+Kichaguzi chako cha `.triangle` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.triangle')?.height === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba8914bab51f0fb8228e9c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba8914bab51f0fb8228e9c.md
new file mode 100644
index 00000000000..23a3c2427d8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba8914bab51f0fb8228e9c.md
@@ -0,0 +1,310 @@
+---
+id: 60ba8914bab51f0fb8228e9c
+title: Hatua ya 71
+challengeType: 0
+dashedName: step-71
+---
+
+# --description--
+
+Lenga kipengele chenye id `triangles` kwa kutumia kichaguzi cha id. Weka `width` kuwa `250px` na `height` kuwa `550px`.
+
+# --hints--
+
+Unapaswa kuongeza kichaguzi cha `#triangles`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#triangles'));
+```
+
+Kichaguzi chako cha `#triangles` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `250px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#triangles')?.width === '250px');
+```
+
+Kichaguzi chako cha `#triangles` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `550px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#triangles')?.height === '550px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba929345ab0714a3743655.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba929345ab0714a3743655.md
new file mode 100644
index 00000000000..15f9e8425a0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba929345ab0714a3743655.md
@@ -0,0 +1,327 @@
+---
+id: 60ba929345ab0714a3743655
+title: Hatua ya 76
+challengeType: 0
+dashedName: step-76
+---
+
+# --description--
+
+Sasa tumia kichaguzi cha id kwa `guitar`. Weka `width` kuwa `100%` na `height` kuwa `100px`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `#guitar`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar'));
+```
+
+Kichaguzi chako cha `#guitar` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `100%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar')?.width === '100%');
+```
+
+Kichaguzi chako cha `#guitar` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `100px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar')?.height === '100px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold;
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba9296d4d6b414c1b10995.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba9296d4d6b414c1b10995.md
new file mode 100644
index 00000000000..b0169083263
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba9296d4d6b414c1b10995.md
@@ -0,0 +1,330 @@
+---
+id: 60ba9296d4d6b414c1b10995
+title: Hatua ya 77
+challengeType: 0
+dashedName: step-77
+---
+
+# --description--
+
+Katika kichaguzi sawa cha `#guitar`, weka `position` kuwa `absolute`, `top` kuwa `120px`, na `left` kuwa `0px`.
+
+# --hints--
+
+Kichaguzi chako cha `#guitar` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `#guitar` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `120px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar')?.top === '120px');
+```
+
+Kichaguzi chako cha `#guitar` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `0px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar')?.left === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold;
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba92987c1e4914dfa7a0b9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba92987c1e4914dfa7a0b9.md
new file mode 100644
index 00000000000..c2e776ae497
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60ba92987c1e4914dfa7a0b9.md
@@ -0,0 +1,321 @@
+---
+id: 60ba92987c1e4914dfa7a0b9
+title: Hatua ya 78
+challengeType: 0
+dashedName: step-78
+---
+
+# --description--
+
+Ipe sheria ya `#guitar` `z-index` ya `3`.
+
+# --hints--
+
+Kichaguzi chako cha `#guitar` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `3`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#guitar')?.zIndex === '3');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 150px 0 0 300px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: rgb(45, 31, 19);
+ position: absolute;
+ top: -150px;
+ left: 0;
+}
+
+#gray-mask {
+ width: 150px;
+ height: 150px;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: -10px;
+ left: 70px;
+}
+
+#white-paper {
+ width: 400px;
+ height: 100px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 250px;
+ left: -150px;
+ z-index: 1;
+}
+
+.fa-music {
+ display: inline-block;
+ margin-top: 8%;
+ margin-left: 13%;
+}
+
+.blue {
+ background-color: #1E90FF;
+}
+
+#blue-left {
+ width: 500px;
+ height: 300px;
+ position: absolute;
+ top: 20%;
+ left: 20%;
+}
+
+#blue-right {
+ width: 400px;
+ height: 300px;
+ position: absolute;
+ top: 50%;
+ left: 40%;
+}
+
+#orange-character {
+ width: 250px;
+ height: 550px;
+ background-color: rgb(240, 78, 42);
+ position: absolute;
+ top: 25%;
+ left: 40%;
+}
+
+#black-round-hat {
+ width: 180px;
+ height: 150px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ position: absolute;
+ top: -100px;
+ left: 5px;
+ z-index: -1;
+}
+
+#eyes-div {
+ width: 180px;
+ height: 50px;
+ position: absolute;
+ top: -40px;
+ left: 20px;
+ z-index: 3;
+}
+
+#triangles {
+ width: 250px;
+ height: 550px;
+}
+
+.triangle {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 42px 45px 45px 0;
+ border-top-color: transparent;
+ border-right-color: Gold;
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+ display: inline-block;
+}
+
+#guitar {
+ width: 100%;
+ height: 100px;
+ position: absolute;
+ top: 120px;
+ left: 0px;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60bad32219ebcb4a8810ac6a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60bad32219ebcb4a8810ac6a.md
new file mode 100644
index 00000000000..8818c4a9d41
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-intermediate-css-by-building-a-picasso-painting/60bad32219ebcb4a8810ac6a.md
@@ -0,0 +1,164 @@
+---
+id: 60bad32219ebcb4a8810ac6a
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Weka `border-width` ya `#black-hat` kuwa `150px 0 0 300px`.
+
+# --hints--
+
+Kichaguzi chako cha `#black-hat` kinafaa kuwa na sifa ya `border-width` iliyowekwa kuwa `150px 0 0 300px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#black-hat')?.borderWidth === '150px 0px 0px 300px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Picasso Painting
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: rgb(184, 132, 46);
+}
+
+#back-wall {
+ background-color: #8B4513;
+ width: 100%;
+ height: 60%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1;
+}
+
+#offwhite-character {
+ width: 300px;
+ height: 550px;
+ background-color: GhostWhite;
+ position: absolute;
+ top: 20%;
+ left: 17.5%;
+}
+
+#white-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 120px 140px 180px;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: GhostWhite;
+ border-left-color: transparent;
+ position: absolute;
+ top: -140px;
+ left: 0;
+}
+
+#black-mask {
+ width: 100%;
+ height: 50px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+#gray-instrument {
+ width: 15%;
+ height: 40%;
+ background-color: rgb(167, 162, 117);
+ position: absolute;
+ top: 50px;
+ left: 125px;
+ z-index: 1;
+}
+
+.black-dot {
+ width: 10px;
+ height: 10px;
+ background-color: rgb(45, 31, 19);
+ border-radius: 50%;
+ display: block;
+ margin: auto;
+ margin-top: 65%;
+}
+
+#tan-table {
+ width: 450px;
+ height: 140px;
+ background-color: #D2691E;
+ position: absolute;
+ top: 275px;
+ left: 15px;
+ z-index: 1;
+}
+
+#black-character {
+ width: 300px;
+ height: 500px;
+ background-color: rgb(45, 31, 19);
+ position: absolute;
+ top: 30%;
+ left: 59%;
+}
+
+#black-hat {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd5a93fd62bb35968adeab.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd5a93fd62bb35968adeab.md
new file mode 100644
index 00000000000..0383a3b2166
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd5a93fd62bb35968adeab.md
@@ -0,0 +1,131 @@
+---
+id: 61fd5a93fd62bb35968adeab
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Sanidi HTML yako na vipengee vya `DOCTYPE`, `html` kuonyesha hati hii iko kwa Kiingereza, vipengele vya `head` na `body`.
+
+Kipe kipengele chako cha `head` vipengele vinavyofaa vya `meta` kwa `charset` na `viewport`, kipengele cha `title` chenye kichwa kinachofaa, na kipengele cha `link` cha laha yako ya mtindo.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na tamko la ``.
+
+```js
+assert(code.match(//i));
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `html`.
+
+```js
+assert.equal(document.querySelectorAll('html')?.length, 1);
+```
+
+Kipengele chako cha `html` kinafaa kuwa na tagi ya ufunguzi yenye sifa ya `lang` ya `en`.
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufunga.
+
+```js
+assert(code.match(/<\/html\s*>/));
+```
+
+Unapaswa kuwa na kipengele cha `head` ndani ya kipengele chako cha `html`.
+
+```js
+assert.equal(document.querySelectorAll('head')?.length, 1);
+```
+
+Unapaswa kuwa na kipengele cha `body` ndani ya kipengele chako cha `html`.
+
+```js
+assert.equal(document.querySelectorAll('body')?.length, 1);
+```
+
+Kipengele chako cha `head` kinapaswa kuja kabla ya kipengele chako cha `body`.
+
+```js
+assert.equal(document.querySelector('body')?.previousElementSibling?.tagName, 'HEAD');
+```
+
+Unapaswa kuwa na vipengele viwili vya `meta`.
+
+```js
+const meta = document.querySelectorAll('meta');
+assert.equal(meta?.length, 2);
+```
+
+Kipengele kimoja cha `meta` kinapaswa kuwa na `name` iliyowekwa kuwa `viewport`, na `content` iliyowekwa kuwa `width=device-width, initial-scale=1.0`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => m?.getAttribute('name') === 'viewport' && m?.getAttribute('content') === 'width=device-width, initial-scale=1.0' && !m?.getAttribute('charset'));
+assert.exists(target);
+```
+
+Kipengele kingine cha `meta` kinafaa kuwa na sifa ya `charset` iliyowekwa kuwa `UTF-8`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => !m?.getAttribute('name') && !m?.getAttribute('content') && m?.getAttribute('charset')?.toLowerCase() === 'utf-8');
+assert.exists(target);
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `title`.
+
+```js
+const title = document.querySelector('title');
+assert.exists(title);
+```
+
+`title` yako inapaswa kuwa na maandishi.
+
+```js
+const title = document.querySelector('title');
+assert.isAtLeast(title?.textContent?.length, 1);
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `link`.
+
+```js
+assert(/ [\w\W\s]* [\w\W\s]*<\/head>/i))
+```
+
+Kipengele chako cha `link` kinapaswa kuwa na sifa ya `rel` yenye thamani ya `stylesheet`.
+
+```js
+assert.match(code, /
+
+
+
+
+ Balance Sheet
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd66c687e610436494c6f1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd66c687e610436494c6f1.md
new file mode 100644
index 00000000000..f0f2e345074
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd66c687e610436494c6f1.md
@@ -0,0 +1,52 @@
+---
+id: 61fd66c687e610436494c6f1
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Ndani ya kipengele cha `section`, ongeza kipengele cha `h1` na kipengele cha `span`.
+
+# --hints--
+
+Kipengele chako cha `section` kinapaswa kuwa na kipengele cha `h1`.
+
+```js
+assert(document.querySelector('section')?.children?.[0]?.localName === 'h1');
+```
+
+Kipengele chako cha `h1` kinapaswa kuwa na kipengele cha `span`.
+
+```js
+assert(document.querySelector('h1')?.children?.[0]?.localName === 'span');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd67a656743144844941cb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd67a656743144844941cb.md
new file mode 100644
index 00000000000..b5eb7293788
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd67a656743144844941cb.md
@@ -0,0 +1,78 @@
+---
+id: 61fd67a656743144844941cb
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Visoma skrini vinatangaza vipengele vya HTML kulingana na mtiririko wa hati. Hatimaye tutataka laha ya usawa iwe na kichwa cha "Balance Sheet" na kichwa kidogo cha "AcmeWidgetCorp". Hata hivyo, agizo hili halina maana ikiwa litatangazwa na kisoma skrini.
+
+Ipe `span` yako iliyopo sifa ya `class` iliyowekwa kuwa `flex`, na uongeze vipengele viwili vya `span` ndani yake. Ipe ya kwanza maandishi `AcmeWidgetCorp`. Ipe ya pili maandishi `Balance Sheet`. Utatumia CSS kubadilisha mpangilio wa maandishi kwenye ukurasa, lakini mpangilio wa HTML utaleta maana zaidi kwa kisomaji skrini.
+
+# --hints--
+
+Kipengele chako cha `span` kilichopo kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `flex`.
+
+```js
+assert(document.querySelector('h1')?.children?.[0]?.classList?.contains('flex'));
+```
+
+Kipengele chako cha `span` kilichopo kinafaa kuwa na vipengele viwili vipya vya `span` ndani yake.
+
+```js
+assert(document.querySelector('.flex')?.children?.[0]?.localName === 'span');
+assert(document.querySelector('.flex')?.children?.[1]?.localName === 'span');
+```
+
+Vipengele vyako vipya vya `span` havifai kuwa na sifa ya `class`.
+
+```js
+assert(!document.querySelector('.flex')?.children?.[0]?.classList?.length);
+assert(!document.querySelector('.flex')?.children?.[1]?.classList?.length);
+```
+
+Kipengele chako kipya cha kwanza cha `span` kinapaswa kuwa na maandishi `AcmeWidgetCorp`.
+
+```js
+assert(document.querySelector('.flex')?.children?.[0]?.textContent === 'AcmeWidgetCorp');
+```
+
+Kipengele chako cha pili cha `span` kinapaswa kuwa na maandishi `Balance Sheet`.
+
+```js
+assert(document.querySelector('.flex')?.children?.[1]?.textContent === 'Balance Sheet');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6ab779390f49148773bb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6ab779390f49148773bb.md
new file mode 100644
index 00000000000..479c485fa06
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6ab779390f49148773bb.md
@@ -0,0 +1,65 @@
+---
+id: 61fd6ab779390f49148773bb
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Chini ya kipengele chako cha `h1`, unda kipengele cha `div`. Ipe sifa ya `id` iliyowekwa kuwa `years`. Unataka kipengele hiki mahususi kifichwe kutoka kwa visoma skrini, kwa hivyo kipe sifa ya `aria-hidden` iliyowekwa kuwa `true`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div` baada ya kipengele chako cha `h1`.
+
+```js
+assert(document.querySelector('h1')?.nextElementSibling?.localName === 'div');
+```
+
+Kipengele chako cha `div` kinapaswa kuwa na sifa ya `id` iliyowekwa kuwa `years`.
+
+```js
+assert(document.querySelector('div')?.getAttribute('id') === 'years');
+```
+
+Kipengele chako kipya cha `div` kinapaswa kuwa na sifa ya `aria-hidden` yenye thamani ya `true`.
+
+```js
+assert(document.querySelector('div')?.getAttribute('aria-hidden') === 'true');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6b7c83dbf54a08cf0498.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6b7c83dbf54a08cf0498.md
new file mode 100644
index 00000000000..e99875145a3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6b7c83dbf54a08cf0498.md
@@ -0,0 +1,79 @@
+---
+id: 61fd6b7c83dbf54a08cf0498
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `div`, ongeza vipengele vitatu vya `span`. Ipe kila mmoja yao sifa ya `class` iliyowekwa kuwa `year`, na uongeze maandishi yafuatayo (kwa mpangilio): `2019`, `2020`, na `2021`.
+
+# --hints--
+
+Kipengele chako cha `div` kinafaa kuwa na vipengele vitatu vya `span`.
+
+```js
+assert(document.querySelector('div')?.children?.length === 3);
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `year`.
+
+```js
+const spans = [...document.querySelector('div')?.children];
+spans.forEach(span => assert(span?.classList?.contains('year')));
+```
+
+`span` yako ya kwanza inapaswa kuwa na maandishi `2019`.
+
+```js
+assert(document.querySelector('div')?.children?.[0]?.textContent === '2019');
+```
+
+`span` yako ya pili inapaswa kuwa na maandishi `2020`.
+
+```js
+assert(document.querySelector('div')?.children?.[1]?.textContent === '2020');
+```
+
+`span` yako ya tatu inapaswa kuwa na maandishi `2021`.
+
+```js
+assert(document.querySelector('div')?.children?.[2]?.textContent === '2021');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6cc9475a784b7776233e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6cc9475a784b7776233e.md
new file mode 100644
index 00000000000..b0974f9a2f3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6cc9475a784b7776233e.md
@@ -0,0 +1,80 @@
+---
+id: 61fd6cc9475a784b7776233e
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Chini ya kipengele chako cha `div` kilichopo, ongeza kipengee kipya cha `div` chenye `class` iliyowekwa kuwa `table-wrap`. Hiki kitakuwa chombo (container) cha meza zako.
+
+Ndani ya hayo, ongeza vipengele vitatu vya `table`. Utakuwa unatumia CSS kuweka mtindo kwa hizi katika jedwali moja, lakini kutumia majedwali tofauti kutasaidia wasomaji wa skrini kuelewa mtiririko wa hati.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+assert(document.querySelectorAll('div')?.length === 2);
+```
+
+Kipengee chako kipya cha `div` kinapaswa kuwa na `class` iliyowekwa kuwa `table-wrap`.
+
+```js
+assert(document.querySelector('.table-wrap')?.localName === 'div');
+```
+
+Kipengele chako cha `.table-wrap` kinafaa kuja baada ya `div` yako iliyopo.
+
+```js
+assert(document.querySelectorAll('div')?.[1]?.classList?.contains('table-wrap'));
+```
+
+Kipengele chako cha `.table-wrap` kinapaswa kuwa na vipengele vitatu vya `table`.
+
+```js
+const children = [...(document.querySelector('.table-wrap')?.children ?? [])];
+assert(children?.length === 3);
+children.forEach(child => assert(child?.localName === 'table'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd70336ebb3e4f62ee81ba.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd70336ebb3e4f62ee81ba.md
new file mode 100644
index 00000000000..71d01454695
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd70336ebb3e4f62ee81ba.md
@@ -0,0 +1,73 @@
+---
+id: 61fd70336ebb3e4f62ee81ba
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Majedwali ya HTML hutumia kipengele cha `caption` kuelezea jedwali linahusu nini. Kipengele cha `caption` kinapaswa kuwa mtoto wa kwanza katika `table`, lakini kinaweza kuwekwa kwa sifa ya CSS ya `caption-side`.
+
+Ongeza kipengele cha `caption` kwa `table` yako ya kwanza, na uipe maandishi `Assets`.
+
+# --hints--
+
+Kipengele chako cha kwanza cha `table` kinapaswa kuwa na kipengele cha `caption`.
+
+```js
+assert(document.querySelector('table')?.children?.[0]?.localName === 'caption');
+```
+
+Kipengele chako cha `caption` kinapaswa kuwa na maandishi `Assets`.
+
+```js
+assert(document.querySelector('caption')?.textContent === 'Assets');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd719788899952e67692b9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd719788899952e67692b9.md
new file mode 100644
index 00000000000..d7820592718
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd719788899952e67692b9.md
@@ -0,0 +1,86 @@
+---
+id: 61fd719788899952e67692b9
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Vipengele vya `thead` na `tbody` hutumika kuonyesha ni sehemu gani ya jedwali lako ni kichwa, na ni sehemu gani inayo data msingi au maudhui.
+
+Ongeza `thead` na `tbody` kwenye `table` yako ya kwanza, chini ya kipengele cha `caption`.
+
+# --hints--
+
+Kipengele chako cha kwanza cha `table` kinapaswa kuwa na kipengele cha `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[0]?.querySelector('thead'));
+```
+
+Kipengele chako cha kwanza cha `table` kinapaswa kuwa na kipengele cha `tbody`.
+
+```js
+assert(document.querySelectorAll('table')?.[0]?.querySelector('tbody'));
+```
+
+Kipengele chako cha `thead` kinapaswa kuwa mara moja chini ya kipengele chako cha `caption`.
+
+```js
+assert(document.querySelector('caption')?.nextElementSibling?.localName === 'thead');
+```
+
+Kipengele chako cha `tbody` kinapaswa kuwa mara moja chini ya kipengele chako cha `thead`.
+
+```js
+assert(document.querySelector('thead')?.nextElementSibling?.localName === 'tbody');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd71d596e8f253b9408b39.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd71d596e8f253b9408b39.md
new file mode 100644
index 00000000000..96d09dea3a3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd71d596e8f253b9408b39.md
@@ -0,0 +1,86 @@
+---
+id: 61fd71d596e8f253b9408b39
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Kipengele cha `tr` kinatumika kuonyesha safu mlalo ya jedwali. Ongeza kipengele cha `tr` ndani ya kipengele chako cha `thead`. Katika kipengele chako kipya cha `tr`, ongeza kipengele cha `td`, kikifuatiwa na vipengele vitatu vya `th`.
+
+Kipengele cha `td` kinaonyesha kisanduku cha data, ilhali kipengele cha `th` kinaonyesha kisanduku cha kichwa.
+
+# --hints--
+
+Kipengele chako cha `thead` kinapaswa kuwa na kipengele cha `tr`.
+
+```js
+assert(document.querySelector('thead')?.children?.[0]?.localName === 'tr');
+```
+
+Kipengele chako cha `tr` kinapaswa kuwa na kipengele cha `td` kama mtoto wa kwanza.
+
+```js
+assert(document.querySelector('tr')?.children?.[0]?.localName === 'td');
+```
+
+Kipengele chako cha `tr` kinafaa kuwa na vipengele vitatu vya `th`, baada ya kipengele cha `td`.
+
+```js
+assert(document.querySelector('tr')?.children?.[1]?.localName === 'th');
+assert(document.querySelector('tr')?.children?.[2]?.localName === 'th');
+assert(document.querySelector('tr')?.children?.[3]?.localName === 'th');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd75ea7f663457612dba02.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd75ea7f663457612dba02.md
new file mode 100644
index 00000000000..10e45e7b7d8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd75ea7f663457612dba02.md
@@ -0,0 +1,125 @@
+---
+id: 61fd75ea7f663457612dba02
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Ndani ya kila kipengele chako kipya cha `th`, weka kipengele cha `span` chenye `class` iliyowekwa kuwa `sr-only year`. Zipe maandishi yafuatayo (kwa mpangilio): `2019`, `2020` na `2021`.
+
+Kipe kipengele chako cha tatu cha `th` sifa ya `class` iliyowekwa kuwa `current`.
+
+Acha kipengele cha `td` kikiwa tupu. Kipengele hiki kinapatikana tu ili kuhakikisha kuwa jedwali lako lina mpangilio wa safu wima nne na kuhusisha vichwa na safu wima sahihi.
+
+# --hints--
+
+Kila moja ya vipengele vyako vya `th` vinapaswa kuwa na kipengele cha `span`.
+
+```js
+const ths = [...document.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.length === 1);
+ assert(th?.children?.[0]?.localName === 'span');
+});
+```
+
+Kila moja ya vipengele vyako vipya vya `span` vinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `sr-only year`.
+
+```js
+const ths = [...document.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.[0]?.classList?.contains('sr-only'));
+ assert(th?.children?.[0]?.classList?.contains('year'));
+});
+```
+
+Kipengele chako cha kwanza cha `span` kinapaswa kuwa na maandishi `2019`.
+
+```js
+assert(document.querySelectorAll('th')?.[0]?.children?.[0]?.textContent === '2019');
+```
+
+Kipengele chako cha pili cha `span` kinapaswa kuwa na maandishi `2020`.
+
+```js
+assert(document.querySelectorAll('th')?.[1]?.children?.[0]?.textContent === '2020');
+```
+
+Kipengele chako cha tatu cha `span` kinapaswa kuwa na maandishi `2021`.
+
+```js
+assert(document.querySelectorAll('th')?.[2]?.children?.[0]?.textContent === '2021');
+```
+
+Kipengele chako cha tatu cha `th` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelector('table')?.querySelectorAll('th')?.[2]?.classList?.contains('current'));
+```
+
+Kipengele chako cha `td` kinapaswa kuwa tupu.
+
+```js
+assert(document.querySelector('table')?.querySelectorAll('td')?.[0]?.textContent === '');
+assert(document.querySelector('table')?.querySelectorAll('td')?.[0]?.children?.length === 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7648a7ba2e5882436831.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7648a7ba2e5882436831.md
new file mode 100644
index 00000000000..ef903e75f01
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7648a7ba2e5882436831.md
@@ -0,0 +1,96 @@
+---
+id: 61fd7648a7ba2e5882436831
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `tbody`, ongeza vipengele vinne vya `tr`. Zipe sifa tatu za kwanza `class` iliyowekwa kuwa `data`, na ya nne sifa ya `class` iliyowekwa kuwa `total`.
+
+# --hints--
+
+Kipengele chako cha `tbody` kinapaswa kuwa na vipengele vinne vya `tr`.
+
+```js
+const children = [...document.querySelector('tbody')?.children];
+assert(children?.length === 4);
+children.forEach(child => assert(child?.localName === 'tr'));
+```
+
+Vipengele vyako vitatu vya kwanza vya `tr` vinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `data`.
+
+```js
+const children = [...document.querySelector('tbody')?.children];
+children.forEach((child, index) => {
+ if (index < 3) {
+ assert(child?.classList?.contains('data'));
+ }
+});
+```
+
+Kipengele chako cha nne cha `tr` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `total`.
+
+```js
+const children = [...document.querySelector('tbody')?.children];
+assert(children?.[3]?.classList?.contains('total'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd778081276b59d59abad6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd778081276b59d59abad6.md
new file mode 100644
index 00000000000..a6101c36fe3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd778081276b59d59abad6.md
@@ -0,0 +1,134 @@
+---
+id: 61fd778081276b59d59abad6
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Katika `tr` yako ya kwanza, ongeza kipengee cha `th` chenye maandishi `Cash This is the cash we currently have on hand.`. Funga maandishi hayo, isipokuwa `Cash`, katika kipengele cha `span` chenye sifa ya `class` iliyowekwa `description`.
+
+Kufuatia hilo, ongeza vipengele vitatu vya `td` vyenye maandishi yafuatayo (kwa mpangilio): `$25`, `$30`, `$28`. Kipe kipengele cha tatu cha `td` sifa ya `class` iliyowekwa kuwa `current`.
+
+# --hints--
+
+Kipengele chako cha kwanza cha `tr` kinapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th'));
+```
+
+Kipengele chako cha `th` kinapaswa kuwa na maandishi `Cash This is the cash we currently have on hand.`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th')?.innerText === 'Cash This is the cash we currently have on hand.');
+```
+
+Unapaswa kufunga maandishi `This is the cash we currently have on hand.` ndani ya kipengele cha `span`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.textContent === 'This is the cash we currently have on hand.');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `description`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$25`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[0]?.textContent === '$25');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$30`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[1]?.textContent === '$30');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$28`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.textContent === '$28');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd77f7ad2aeb5ae34d07d6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd77f7ad2aeb5ae34d07d6.md
new file mode 100644
index 00000000000..e317b22d143
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd77f7ad2aeb5ae34d07d6.md
@@ -0,0 +1,138 @@
+---
+id: 61fd77f7ad2aeb5ae34d07d6
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Katika kipengele chako cha pili cha `tr`, ongeza kipengele cha `th` chenye maandishi `Checking Our primary transactional account.`. Funga maandishi hayo, isipokuwa `Checking`, katika kipengele cha `span` chenye sifa ya `class` iliyowekwa `description`.
+
+Kufuatia hilo, ongeza vipengele vitatu vya `td` vyenye maandishi yafuatayo (kwa mpangilio): `$54`, `$56`, `$53`. Kipe kipengele cha tatu cha `td` sifa ya `class` iliyowekwa kuwa `current`.
+
+# --hints--
+
+`tr` yako ya pili inapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th'));
+```
+
+Kipengele chako cha `th` kinapaswa kuwa na maandishi `Checking Our primary transactional account.`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th')?.innerText === 'Checking Our primary transactional account.');
+```
+
+Unapaswa kufunga maandishi `Our primary transactional account.` katika kipengele cha `span`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th > span')?.textContent === 'Our primary transactional account.');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `description`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$54`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[0]?.textContent === '$54');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$56`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[1]?.textContent === '$56');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$53`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[2]?.textContent === '$53');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd78621573aa5e8b512f5e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd78621573aa5e8b512f5e.md
new file mode 100644
index 00000000000..9d1de6035d5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd78621573aa5e8b512f5e.md
@@ -0,0 +1,142 @@
+---
+id: 61fd78621573aa5e8b512f5e
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Ndani ya kipengele cha tatu cha `tr`, ongeza kipengee cha `th` chenye maandishi `Savings Funds set aside for emergencies.`. Funga maandishi hayo, isipokuwa `Savings`, katika kipengele cha `span` chenye sifa ya `class` iliyowekwa kuwa `description`.
+
+Kufuatia hilo, ongeza vipengele vitatu vya `td` vyenye maandishi yafuatayo (kwa mpangilio): `$500`, `$650`, `$728`. Kipe kipengele cha tatu cha `td` sifa ya `class` iliyowekwa kuwa `current`.
+
+# --hints--
+
+Kipengele chako cha tatu cha `tr` kinapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th'));
+```
+
+Kipengee chako cha `th` kinapaswa kuwa na maandishi ya `Savings Funds set aside for emergencies.`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th')?.innerText === 'Savings Funds set aside for emergencies.');
+```
+
+Unapaswa kufunga maandishi `Funds set aside for emergencies.` ndani ya kipengele cha `span`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th > span')?.textContent === 'Funds set aside for emergencies.');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `description`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$500`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[0]?.textContent === '$500');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$650`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[1]?.textContent === '$650');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$728`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[2]?.textContent === '$728');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7a160ed17960e971f28b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7a160ed17960e971f28b.md
new file mode 100644
index 00000000000..99ed9c1d2d9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7a160ed17960e971f28b.md
@@ -0,0 +1,140 @@
+---
+id: 61fd7a160ed17960e971f28b
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Ndani ya kipengele cha nne cha `tr`, ongeza kipengee cha `th` chenye maandishi `Total Assets`. Funga maandishi `Assets` katika kipengele cha `span` kwa sifa ya `class` iliyowekwa kuwa `sr-only`.
+
+Kufuatia hilo, ongeza vipengele vitatu vya `td` vyenye maandishi yafuatayo (kwa mpangilio): `$579`, `$736`, `$809`. Kipe kipengele cha tatu cha `td` sifa ya `class` iliyowekwa kuwa `current`.
+
+# --hints--
+
+Kipengele chako cha nne cha `tr` kinapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th'));
+```
+
+Kipengele chako cha `th` kinapaswa kuwa na maandishi `Total Assets`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th')?.innerText === 'Total Assets');
+```
+
+Unapaswa kufunga maandishi `Assets` katika kipengele cha `span`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th > span')?.textContent === 'Assets');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `sr-only`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th > span')?.classList?.contains('sr-only'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$579`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[0]?.textContent === '$579');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$736`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[1]?.textContent === '$736');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$809`.
+
+```js
+assert(document.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[2]?.textContent === '$809');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7b3fcaa5406257abc5d1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7b3fcaa5406257abc5d1.md
new file mode 100644
index 00000000000..08cf9b65b5c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7b3fcaa5406257abc5d1.md
@@ -0,0 +1,130 @@
+---
+id: 61fd7b3fcaa5406257abc5d1
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Ni wakati wa kuendelea na jedwali lako la pili. Anza kwa kukipa kipengele cha `caption` kilichowekwa kuwa `Liabilities`. Kisha ongeza `thead` yako na `tbody`.
+
+# --hints--
+
+Kipengele chako cha pili cha `table` kinapaswa kuwa na kipengele cha `caption`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.children?.[0]?.localName === 'caption');
+```
+
+Kipengele chako cha `caption` kinapaswa kuwa na maandishi `Liabilities`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('caption')?.textContent === 'Liabilities');
+```
+
+Kipengele chako cha pili cha `table` kinapaswa kuwa na kipengele cha `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('thead'));
+```
+
+Kipengele chako cha pili cha `table` kinapaswa kuwa na kipengele cha `tbody`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody'));
+```
+
+Kipengele chako cha `thead` kinapaswa kuwa mara moja chini ya kipengele chako cha `caption`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('caption')?.nextElementSibling?.localName === 'thead');
+```
+
+Kipengele chako cha `tbody` kinapaswa kuwa mara moja chini ya kipengele chako cha `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('thead')?.nextElementSibling?.localName === 'tbody');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8e491324ce717da97ffe.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8e491324ce717da97ffe.md
new file mode 100644
index 00000000000..45eb6349014
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8e491324ce717da97ffe.md
@@ -0,0 +1,119 @@
+---
+id: 61fd8e491324ce717da97ffe
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Ndani ya `thead` yako, ongeza `tr`. Ndani yake, ongeza `td` na vipengele vitatu vya `th`.
+
+# --hints--
+
+Kipengele chako cha `thead` kinapaswa kuwa na kipengele cha `tr`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('thead')?.children?.[0]?.localName === 'tr');
+```
+
+Kipengele chako cha `tr` kinapaswa kuwa na kipengele cha `td` kama mtoto wa kwanza.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tr')?.children?.[0]?.localName === 'td');
+```
+
+Kipengele chako cha `tr` kinafaa kuwa na vipengele vitatu vya `th`, baada ya kipengele cha `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tr')?.children?.[1]?.localName === 'th');
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tr')?.children?.[2]?.localName === 'th');
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tr')?.children?.[3]?.localName === 'th');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8fd08af43372f02952d0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8fd08af43372f02952d0.md
new file mode 100644
index 00000000000..5f305ee73ef
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd8fd08af43372f02952d0.md
@@ -0,0 +1,149 @@
+---
+id: 61fd8fd08af43372f02952d0
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Kipe kila kipengele cha `th` kipengee cha `span` chenye class iliyowekwa kuwa `sr-only` na maandishi yafuatayo, kwa mpangilio: `2019`, `2020`, na `2021`.
+
+# --hints--
+
+Kila moja ya vipengele vyako vya `th` vinapaswa kuwa na kipengele cha `span`.
+
+```js
+const ths = [...document.querySelectorAll('table')?.[1]?.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.length === 1);
+ assert(th?.children?.[0]?.localName === 'span');
+});
+```
+
+Kila moja ya vipengele vyako vipya vya `span` vinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `sr-only`.
+
+```js
+const ths = [...document.querySelectorAll('table')?.[1]?.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.[0]?.classList?.contains('sr-only'));
+});
+```
+
+Kipengele chako cha kwanza cha `span` kinapaswa kuwa na maandishi `2019`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('th')?.[0]?.children?.[0]?.textContent === '2019');
+```
+
+Kipengele chako cha pili cha `span` kinapaswa kuwa na maandishi `2020`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('th')?.[1]?.children?.[0]?.textContent === '2020');
+```
+
+Kipengele chako cha tatu cha `span` kinapaswa kuwa na maandishi `2021`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('th')?.[2]?.children?.[0]?.textContent === '2021');
+```
+
+Kipengele chako cha `td` kinapaswa kuwa tupu.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('td')?.[0]?.textContent === '');
+assert(document.querySelectorAll('table')?.[1]?.querySelectorAll('td')?.[0]?.children?.length === 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+--fcc-editable-region--
+
+ Liabilities
+
+
+
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9126aa72a474301fc49f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9126aa72a474301fc49f.md
new file mode 100644
index 00000000000..e7dd83062f1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9126aa72a474301fc49f.md
@@ -0,0 +1,131 @@
+---
+id: 61fd9126aa72a474301fc49f
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Ndani ya kipengele cha `tbody`, ongeza vipengele vinne vya `tr`. Zipe tatu za kwanza sifa ya `class` iliyowekwa kuwa `data`, na ya nne sifa ya `class` iliyowekwa kuwa `total`.
+
+# --hints--
+
+Kipengele chako cha `tbody` kinapaswa kuwa na vipengele vinne vya `tr`.
+
+```js
+const children = [...document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.children];
+assert(children?.length === 4);
+children.forEach(child => assert(child?.localName === 'tr'));
+```
+
+Vipengele vyako vitatu vya kwanza vya `tr` vinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `data`.
+
+```js
+const children = [...document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.children];
+children.forEach((child, index) => {
+ if (index < 3) {
+ assert(child?.classList?.contains('data'));
+ }
+});
+```
+
+Kipengele chako cha nne cha `tr` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `total`.
+
+```js
+const children = [...document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.children];
+assert(children?.[3]?.classList?.contains('total'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+--fcc-editable-region--
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd933ba685de776a94997e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd933ba685de776a94997e.md
new file mode 100644
index 00000000000..baeff97484c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd933ba685de776a94997e.md
@@ -0,0 +1,169 @@
+---
+id: 61fd933ba685de776a94997e
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Ndani ya `tr` ya kwanza, ongeza kipengele cha `th` chenye maandishi `Loans The outstanding balance on our startup loan.`. Funga maandishi hayo, isipokuwa `Loans`, katika kipengele cha `span` chenye sifa ya `class` iliyowekwa `description`.
+
+Ongeza vipengele vitatu vya `td` chini ya yake, na uipe maandishi yafuatayo, kwa mpangilio: `$500`, `$250` na `$0`. Kipe kipengele cha tatu cha `td` sifa ya `class` iliyowekwa kuwa `current`.
+
+# --hints--
+
+Kipengele chako cha kwanza cha `tr` kinapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th'));
+```
+
+Kipengele chako cha`th` kinapaswa kuwa na maandishi`Loans The outstanding balance on our startup loan.`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th')?.innerText === 'Loans The outstanding balance on our startup loan.');
+```
+
+Unapaswa kufunga maandishi `The outstanding balance on our startup loan.` katika kipengele cha `span`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.textContent === 'The outstanding balance on our startup loan.');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `description`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$500`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[0]?.textContent === '$500');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$250`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[1]?.textContent === '$250');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$0`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.textContent === '$0');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd94056e0355785fbba4d3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd94056e0355785fbba4d3.md
new file mode 100644
index 00000000000..ef18edf351f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd94056e0355785fbba4d3.md
@@ -0,0 +1,173 @@
+---
+id: 61fd94056e0355785fbba4d3
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Ndani ya `tr` ya pili, ongeza kipengele cha `th` chenye maandishi `Expenses Annual anticipated expenses, such as payroll.`. Funga maandishi hayo, isipokuwa `Expenses`, katika kipengele cha `span` chenye sifa ya `class` iliyowekwa `description`.
+
+Ongeza vipengele vitatu vya `td` chini ya yake, na uvipe maandishi yafuatayo, kwa mpangilio: `$200`, `$300` na `$400`. Kipe kipengele cha tatu cha `td` sifa ya `class` iliyowekwa kuwa `current`.
+
+# --hints--
+
+`tr` yako ya pili inapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th'));
+```
+
+Kipengele chako cha `th` kinapaswa kuwa na maandishi `Expenses Annual anticipated expenses, such as payroll.`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th')?.innerText === 'Expenses Annual anticipated expenses, such as payroll.');
+```
+
+Unapaswa kufunga maandishi `Annual anticipated expenses, such as payroll.` katika kipengele cha `span`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th > span')?.textContent === 'Annual anticipated expenses, such as payroll.');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `description`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$200`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[0]?.textContent === '$200');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$300`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[1]?.textContent === '$300');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$400`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[2]?.textContent === '$400');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[1]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+--fcc-editable-region--
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd986ddbcbd47ba8fbc5ec.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd986ddbcbd47ba8fbc5ec.md
new file mode 100644
index 00000000000..a3da24eea24
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd986ddbcbd47ba8fbc5ec.md
@@ -0,0 +1,177 @@
+---
+id: 61fd986ddbcbd47ba8fbc5ec
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Ndani ya `tr` ya tatu, ongeza kipengele cha `th` chenye maandishi `Credit The outstanding balance on our credit card.`. Funga maandishi hayo, isipokuwa `Credit`, katika kipengele cha `span` chenye sifa ya `class` iliyowekwa `description`.
+
+Ongeza vipengele vitatu vya `td` chini ya yake, na uipe maandishi yafuatayo, kwa mpangilio: `$50`, `$50` na `$75`. Kipe kipengele cha tatu cha `td` sifa ya `class` iliyowekwa kuwa `current`.
+
+# --hints--
+
+Kipengele chako cha tatu cha `tr` kinapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th'));
+```
+
+Kipengele chako cha`th` kinapaswa kuwa na maandishi`Credit The outstanding balance on our credit card.`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th')?.innerText === 'Credit The outstanding balance on our credit card.');
+```
+
+Unapaswa kufunga maandishi `The outstanding balance on our credit card.` katika kipengele cha `span`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th > span')?.textContent === 'The outstanding balance on our credit card.');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `description`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelector('th > span')?.classList?.contains('description'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$50`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[0]?.textContent === '$50');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$50`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[1]?.textContent === '$50');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$75`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[2]?.textContent === '$75');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[2]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+--fcc-editable-region--
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd990577d8227dd93fbeeb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd990577d8227dd93fbeeb.md
new file mode 100644
index 00000000000..4cb16d9b9a0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd990577d8227dd93fbeeb.md
@@ -0,0 +1,181 @@
+---
+id: 61fd990577d8227dd93fbeeb
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Ndani ya kipengele cha nne cha `tr`, ongeza kipengee cha `th` chenye maandishi `Total Liabilities`. Funga maandishi `Liabilities` katika kipengele cha `span` chenye sifa ya `class` iliyowekwa kuwa `sr-only`.
+
+Kufuatia hilo, ongeza vipengele vitatu vya `td` vyenye maandishi yafuatayo (kwa mpangilio): `$750`, `$600`, `$475`. Kipe kipengele cha tatu cha `td` sifa ya `class` iliyowekwa kuwa `current`.
+
+# --hints--
+
+Kipengele chako cha nne cha `tr` kinapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th'));
+```
+
+Kipengele chako cha `th` kinapaswa kuwa na maandishi `Total Liabilities`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th')?.innerText === 'Total Liabilities');
+```
+
+Unapaswa kufunga maandishi `Liabilities` ndani ya kipengele cha `span`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th > span')?.textContent === 'Liabilities');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `sr-only`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelector('th > span')?.classList?.contains('sr-only'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$750`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[0]?.textContent === '$750');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$600`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[1]?.textContent === '$600');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$475`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[2]?.textContent === '$475');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelectorAll('table')?.[1]?.querySelector('tbody')?.querySelectorAll('tr')?.[3]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+--fcc-editable-region--
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9a4ff2fc4481b9157bd7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9a4ff2fc4481b9157bd7.md
new file mode 100644
index 00000000000..84297fb5995
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9a4ff2fc4481b9157bd7.md
@@ -0,0 +1,165 @@
+---
+id: 61fd9a4ff2fc4481b9157bd7
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Kwa jedwali lako la tatu, ongeza `caption` yenye maandishi `Net Worth`, na usanidi kichwa cha jedwali na mwili wa jedwali.
+
+# --hints--
+
+Kipengele chako cha tatu cha `table` kinapaswa kuwa na kipengele cha `caption`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.children?.[0]?.localName === 'caption');
+```
+
+Kipengele chako cha `caption` kinapaswa kuwa na maandishi `Net Worth`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('caption')?.textContent === 'Net Worth');
+```
+
+Kipengele chako cha tatu cha `table` kinapaswa kuwa na kipengele cha `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('thead'));
+```
+
+Kipengele chako cha tatu cha `table` kinapaswa kuwa na kipengele cha `tbody`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody'));
+```
+
+Kipengele chako cha `thead` kinapaswa kuwa mara moja chini ya kipengele chako cha `caption`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('caption')?.nextElementSibling?.localName === 'thead');
+```
+
+Kipengele chako cha `tbody` kinapaswa kuwa mara moja chini ya kipengele chako cha `thead`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('thead')?.nextElementSibling?.localName === 'tbody');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9ad665a4a282c8106be3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9ad665a4a282c8106be3.md
new file mode 100644
index 00000000000..5bcab6bc355
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9ad665a4a282c8106be3.md
@@ -0,0 +1,198 @@
+---
+id: 61fd9ad665a4a282c8106be3
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `thead`, unda kipengele cha `tr`. Ndani yake, ongeza `td` na vipengele vitatu vya `th`. Ndani ya kila kipengele cha `th`, ongeza kipengele cha `span` chenye `class` iliyowekwa kuwa`sr-only` na maandishi yafuatayo., kwa mpangilio: `2019`, `2020` na `2021`.
+
+# --hints--
+
+Kipengele chako cha `thead` kinapaswa kuwa na kipengele cha `tr`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('thead')?.children?.[0]?.localName === 'tr');
+```
+
+Kipengele chako cha `tr` kinapaswa kuwa na kipengele cha `td` kama mtoto wa kwanza.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tr')?.children?.[0]?.localName === 'td');
+```
+
+Kipengele chako cha `tr` kinafaa kuwa na vipengele vitatu vya `th`, baada ya kipengele cha `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tr')?.children?.[1]?.localName === 'th');
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tr')?.children?.[2]?.localName === 'th');
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tr')?.children?.[3]?.localName === 'th');
+```
+
+Kila moja ya vipengele vyako vya `th` vinapaswa kuwa na kipengele cha `span`.
+
+```js
+const ths = [...document.querySelectorAll('table')?.[2]?.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.length === 1);
+ assert(th?.children?.[0]?.localName === 'span');
+});
+```
+
+Kila moja ya vipengele vyako vipya vya `span` vinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `sr-only`.
+
+```js
+const ths = [...document.querySelectorAll('table')?.[2]?.querySelectorAll('th')];
+ths?.forEach(th => {
+ assert(th?.children?.[0]?.classList?.contains('sr-only'));
+});
+```
+
+Kipengele chako cha kwanza cha `span` kinapaswa kuwa na maandishi `2019`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('th')?.[0]?.children?.[0]?.textContent === '2019');
+```
+
+Kipengele chako cha pili cha `span` kinapaswa kuwa na maandishi `2020`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('th')?.[1]?.children?.[0]?.textContent === '2020');
+```
+
+Kipengele chako cha tatu cha `span` kinapaswa kuwa na maandishi `2021`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('th')?.[2]?.children?.[0]?.textContent === '2021');
+```
+
+Kipengele chako cha `td` kinapaswa kuwa tupu.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('td')?.[0]?.textContent === '');
+assert(document.querySelectorAll('table')?.[2]?.querySelectorAll('td')?.[0]?.children?.length === 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9b7285bde783ad5b8aac.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9b7285bde783ad5b8aac.md
new file mode 100644
index 00000000000..f9f1d14ef49
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9b7285bde783ad5b8aac.md
@@ -0,0 +1,208 @@
+---
+id: 61fd9b7285bde783ad5b8aac
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Ndani ya `tbody`, ongeza `tr` yenye `class` iliyowekwa kuwa `total`. Katika hilo, ongeza `th` yenye maandishi `Total Net Worth`, na ufunge `Net Worth` katika `span` yenye `class` iliyowekwa kuwa `sr-only`.
+
+Kisha ongeza vipengele vitatu vya `td`, ukikipa cha tatu `class` iliyowekwa kuwa `current`, na kila moja ukipe maandishi yafuatayo: `$-171`, `$136`, `$334`.
+
+# --hints--
+
+Kipengele chako cha `tbody` kinapaswa kuwa na kipengele cha `tr`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.length === 1);
+```
+
+Kipengee chako cha `tr` kinapaswa kuwa na `class` iliyowekwa kuwa `total`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelector('tr')?.classList?.contains('total'));
+```
+
+Kipengele chako cha nne cha `tr` kinapaswa kuwa na kipengele cha `th`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th'));
+```
+
+Kipengele chako cha `th` kinapaswa kuwa na maandishi `Total Net Worth`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th')?.innerText === 'Total Net Worth');
+```
+
+Unapaswa kufunga maandishi `Net Worth` katika kipengele cha `span`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.textContent === 'Net Worth');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `sr-only`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelector('th > span')?.classList?.contains('sr-only'));
+```
+
+Unapaswa kuwa na vipengele vitatu vya `td`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td').length === 3);
+```
+
+Kipengele chako cha kwanza cha `td` kinapaswa kuwa na maandishi `$-171`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[0]?.textContent === '$-171');
+```
+
+Kipengele chako cha pili cha `td` kinapaswa kuwa na maandishi `$136`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[1]?.textContent === '$136');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na maandishi `$334`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.textContent === '$334');
+```
+
+Kipengele chako cha tatu cha `td` kinapaswa kuwa na `class` iliyowekwa kuwa `current`.
+
+```js
+assert(document.querySelectorAll('table')?.[2]?.querySelector('tbody')?.querySelectorAll('tr')?.[0]?.querySelectorAll('td')?.[2]?.classList?.contains('current'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+--fcc-editable-region--
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9d9fbdfe078800317055.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9d9fbdfe078800317055.md
new file mode 100644
index 00000000000..cf373277b87
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9d9fbdfe078800317055.md
@@ -0,0 +1,158 @@
+---
+id: 61fd9d9fbdfe078800317055
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Muda wa kupamba jedwali lako. Anza kwa kurekebisha muundo wa sanduku. Unda kichaguzi cha `html` na ukipe sifa ya `box-sizing` iliyowekwa kuwa `border-box`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `html`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html'));
+```
+
+Kichaguzi chako cha `html` kinafaa kuwa na sifa ya `box-sizing` iliyowekwa kuwa `border-box`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html')?.getPropertyValue('box-sizing') === 'border-box');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda307bde0b091cf7d884a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda307bde0b091cf7d884a.md
new file mode 100644
index 00000000000..928fd983555
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda307bde0b091cf7d884a.md
@@ -0,0 +1,168 @@
+---
+id: 61fda307bde0b091cf7d884a
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Unda kichaguzi cha `body`, na ukipe sifa ya `font-family` iliyowekwa kuwa `sans-serif` na sifa ya `color` iliyowekwa kuwa `#0a0a23`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `body`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+Kichaguzi chako cha `body` kinafaa kuwa na sifa ya `font-family` yenye thamani ya `sans-serif`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.getPropertyValue('font-family') === 'sans-serif');
+```
+
+Kichaguzi chako cha `body` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `#0a0a23`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.getPropertyValue('color') === 'rgb(10, 10, 35)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda339eadcfd92a6812bed.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda339eadcfd92a6812bed.md
new file mode 100644
index 00000000000..99235f8e1a9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda339eadcfd92a6812bed.md
@@ -0,0 +1,171 @@
+---
+id: 61fda339eadcfd92a6812bed
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Kabla ya kufika mbali sana katika mtindo wako, unapaswa kutumia darasa la `sr-only`. Unaweza kutumia CSS kutengeneza vipengee vilivyo na darasa hili kufichwa kabisa kutoka kwa ukurasa unaoonekana, lakini bado vitangazwe na visoma skrini.
+
+CSS unayokaribia kuandika ni seti ya kawaida ya sifa zinazotumiwa kuhakikisha vipengele vimefichwa kabisa kimwonekano.
+
+Kichaguzi cha `span[class~="sr-only"]` kitachagua kipengele chochote cha `span` ambacho `class` *inajumuisha* `sr-only`. Unda kichaguzi hicho na ukipe sifa ya `border` iliyowekwa kuwa `0`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `span[class~="sr-only"]`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `border` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('border-width') === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdac1e31692f9a9ad97295.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdac1e31692f9a9ad97295.md
new file mode 100644
index 00000000000..f5ac3a4ea9d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdac1e31692f9a9ad97295.md
@@ -0,0 +1,172 @@
+---
+id: 61fdac1e31692f9a9ad97295
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Sifa ya `clip` ya CSS inatumika kufafanua sehemu zinazoonekana za kipengele. Weka kichaguzi cha `span[class~="sr-only"]` kiwe na sifa ya `clip` ya `rect(1px, 1px, 1px, 1px)`.
+
+Sifa ya `clip-path` huamua umbo ambalo sifa ya `clip` inafaa kuchukua. Weka kipengele cha `clip-path` kuwa na thamani ya `inset(50%)`, ukiunda njia ya klipu kuwa mstatili ndani ya kipengele.
+
+# --hints--
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `clip` iliyowekwa kuwa `rect(1px, 1px, 1px, 1px)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('clip') === 'rect(1px, 1px, 1px, 1px)');
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `clip-path` iliyowekwa kuwa `inset(50%)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('clip-path') === 'inset(50%)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaea3999cb19d76ce717b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaea3999cb19d76ce717b.md
new file mode 100644
index 00000000000..b736c943c65
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaea3999cb19d76ce717b.md
@@ -0,0 +1,172 @@
+---
+id: 61fdaea3999cb19d76ce717b
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Sasa unahitaji kupunguza ukubwa wa vipengele hivi chini. Kipe kichaguzi chako cha `span[class~="sr-only"]` `width` na `height` iliyowekwa kuwa `1px`.
+
+# --hints--
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `1px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('width') === '1px');
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `1px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('height') === '1px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaf9ff894b6a084ecdc1b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaf9ff894b6a084ecdc1b.md
new file mode 100644
index 00000000000..ed11baff0fa
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaf9ff894b6a084ecdc1b.md
@@ -0,0 +1,174 @@
+---
+id: 61fdaf9ff894b6a084ecdc1b
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Ili kuzuia maudhui ya maandishi kufurika, kipe kichaguzi chako `span[class~="sr-only"]` sifa ya `overflow` iliyowekwa kuwa `hidden` na sifa ya `white-space` iliyowekwa kuwa `nowrap`.
+
+# --hints--
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `overflow` iliyowekwa kuwa `hidden`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('overflow') === 'hidden');
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `white-space` iliyowekwa kuwa `nowrap`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('white-space') === 'nowrap');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdafe6f07fd7a1c6785bc2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdafe6f07fd7a1c6785bc2.md
new file mode 100644
index 00000000000..6a7e47b6a1e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdafe6f07fd7a1c6785bc2.md
@@ -0,0 +1,182 @@
+---
+id: 61fdafe6f07fd7a1c6785bc2
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Hatimaye, unahitaji kuchukua vipengele hivi vilivyofichwa kutoka kwa mtiririko wa hati. Kipe kichaguzi cha `span[class~="sr-only"]` sifa ya `position` iliyowekwa kuwa `absolute`, sifa ya `padding` iliyowekwa kuwa `0`, na sifa ya `margin` iliyowekwa kuwa `-1px`. Hii itahakikisha kwamba sio tu kwamba hazionekani tena, lakini hata hazimo ndani ya mwonekano wa ukurasa.
+
+# --hints--
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('position') === 'absolute');
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('padding') === '0px');
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `-1px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.getPropertyValue('margin') === '-1px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ overflow: hidden;
+ white-space: nowrap;
+
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdb04d9939f0a26ca51c2b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdb04d9939f0a26ca51c2b.md
new file mode 100644
index 00000000000..baaf3453486
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdb04d9939f0a26ca51c2b.md
@@ -0,0 +1,192 @@
+---
+id: 61fdb04d9939f0a26ca51c2b
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Wakati wa kupamba kichwa cha jedwali lako. Unda kichaguzi cha `h1`. Ipe sifa ya `max-width` iliyowekwa kuwa `37.25rem`, sifa ya `margin` iliyowekwa kuwa `0 auto`, na sifa ya `padding` iliyowekwa kuwa `1.5rem 1.25rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `h1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1'));
+```
+
+Kichaguzi chako cha `h1` kinafaa kuwa na sifa ya `max-width` iliyowekwa kuwa `37.25rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.getPropertyValue('max-width') === '37.25rem');
+```
+
+Kichaguzi chako cha `h1` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `0 auto`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.getPropertyValue('margin') === '0px auto');
+```
+
+Kichaguzi chako cha `h1` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `1.5rem 1.25rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.getPropertyValue('padding') === '1.5rem 1.25rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620159cd5431aa34bc6a4c9c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620159cd5431aa34bc6a4c9c.md
new file mode 100644
index 00000000000..ae86ed59d71
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620159cd5431aa34bc6a4c9c.md
@@ -0,0 +1,198 @@
+---
+id: 620159cd5431aa34bc6a4c9c
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Lenga kontena ya flex kwa kichaguzi cha `h1 .flex`. Ipe sifa ya `display` iliyowekwa kuwa `flex` ili kuwezesha mpangilio wa flexbox. Kisha weka kipengele cha `flex-direction` kuwa `column-reverse` - hii itaonyesha vipengele vilivyowekwa ndani yake kutoka chini hadi juu. Hatimaye, weka kipengele cha `gap` kuwa `1rem` ili kuunda nafasi kati ya vipengele.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `h1 .flex`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex'));
+```
+
+Kichaguzi chako cha `h1 .flex` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `flex`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex')?.getPropertyValue('display') === 'flex');
+```
+
+Kichaguzi chako cha `h1 .flex` kinapaswa kuwa na sifa ya `flex-direction` iliyowekwa kuwa `column-reverse`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex')?.getPropertyValue('flex-direction') === 'column-reverse');
+```
+
+Kichaguzi chako cha `h1 .flex` kinapaswa kuwa na sifa ya `gap` iliyowekwa kuwa `1rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex')?.getPropertyValue('gap') === '1rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015a5da1c95c358f079ebb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015a5da1c95c358f079ebb.md
new file mode 100644
index 00000000000..302c72bc4d1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015a5da1c95c358f079ebb.md
@@ -0,0 +1,194 @@
+---
+id: 62015a5da1c95c358f079ebb
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+`:first-of-type` pseudo-selector hutumiwa kulenga kipengele cha kwanza kinacholingana na kichaguzi. Unda kichaguzi cha `h1 .flex span:first-of-type` ili kulenga kipengele cha kwanza cha `span` katika chombo chako cha `.flex`. Kumbuka kwamba vipengee vyako vya `span` vimegeuzwa kinyume, vinavyoonekana, kwa hivyo hiki kitaonekana kuwa kipengele cha pili kwenye ukurasa.
+
+Kipe kichaguzi chako kipya sifa ya `font-size` ya `0.7em` ili kuifanya ionekane kama kichwa kidogo.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `h1 .flex span:first-of-type`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex span:first-of-type'));
+```
+
+Kichaguzi chako cha `h1 .flex span:first-of-type` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `0.7em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex span:first-of-type')?.getPropertyValue('font-size') === '0.7em');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015cd2654a1139321a89d2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015cd2654a1139321a89d2.md
new file mode 100644
index 00000000000..e16d939db11
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015cd2654a1139321a89d2.md
@@ -0,0 +1,196 @@
+---
+id: 62015cd2654a1139321a89d2
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+`:last-of-type` pseudo-selector hufanya kinyume kabisa - inalenga kipengele cha mwisho kinacholingana na kichaguzi. Unda kichaguzi cha `h1 .flex span:last-of-type` ili kulenga `span` ya mwisho katika chombo chako cha flex, na ukipe sifa ya `font-size` iliyowekwa kuwa `1.2em` ili kuifanya ionekane kama kichwa.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `h1 .flex span:last-of-type`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex span:last-of-type'));
+```
+
+Kichaguzi chako cha `h1 .flex span:last-of-type` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `1.2em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1 .flex span:last-of-type')?.getPropertyValue('font-size') === '1.2em');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015d8942384c3aed48329e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015d8942384c3aed48329e.md
new file mode 100644
index 00000000000..12e33c9240b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015d8942384c3aed48329e.md
@@ -0,0 +1,212 @@
+---
+id: 62015d8942384c3aed48329e
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Ulifunga jedwali lako kwa kipengele cha section - sasa unaweza kuipa mtindo huo ili kuipa jedwali yako mpaka. Unda kichaguzi cha `section`, na ukipe `max-width` iliyowekwa kuwa `40rem` kwa muundo unaoitikia. Weka sifa ya `margin` kuwa `0 auto` ili kuiweka katikati, na uweke kipengele cha `border` kuwa `2px solid #d0d0d5`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `section`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('section'));
+```
+
+Kichaguzi chako cha `section` kinafaa kuwa na sifa ya `max-width` iliyowekwa kuwa `40rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('section')?.getPropertyValue('max-width') === '40rem');
+```
+
+Kichaguzi chako cha `section` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `0 auto`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('section')?.getPropertyValue('margin') === '0px auto');
+```
+
+Kichaguzi chako cha `section` kinafaa kuwa na sifa ya `border` iliyowekwa kuwa `2px solid #d0d0d5`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('section')?.getPropertyValue('border') === '2px solid rgb(208, 208, 213)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620167374bb8b4455cd11125.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620167374bb8b4455cd11125.md
new file mode 100644
index 00000000000..a1aca9eb873
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620167374bb8b4455cd11125.md
@@ -0,0 +1,224 @@
+---
+id: 620167374bb8b4455cd11125
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Sehemu ya mwisho ya kichwa chako cha jedwali ni miaka yako. Unda kichaguzi cha `#years`, na uwezeshe flexbox. Thibitisha yaliyomo hadi mwisho wa mwelekeo wa kubadilika (flex direction), na ufanye kipengele kuwa sticky. Tengeneza juu ya kontena yake kwa kutumia `top: 0`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#years`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years'));
+```
+
+Kichaguzi chako cha `#years` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `flex`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('display') === 'flex');
+```
+
+Kichaguzi chako cha `#years` kinapaswa kuwa na sifa ya `justify-content` iliyowekwa kuwa `flex-end`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('justify-content') === 'flex-end');
+```
+
+Kichaguzi chako cha `#years` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `sticky`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('position') === 'sticky');
+```
+
+Kichaguzi chako cha `#years` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('top') === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620174ed519dd7506c1a4b61.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620174ed519dd7506c1a4b61.md
new file mode 100644
index 00000000000..f78dff94c4d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620174ed519dd7506c1a4b61.md
@@ -0,0 +1,212 @@
+---
+id: 620174ed519dd7506c1a4b61
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Sasa weka rangi kwenye `#years`. Fanya maandishi `#fff` na background `#0a0a23`.
+
+# --hints--
+
+`#years` yako inapaswa kuwa na sifa ya `color` iliyowekwa kuwa `#fff`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('color') === 'rgb(255, 255, 255)');
+```
+
+`#years` yako inapaswa kuwa na sifa ya `background-color` iliyowekwa kuwa `#0a0a23`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('background-color') === 'rgb(10, 10, 35)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+--fcc-editable-region--
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ top: 0;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620175b3710a0951cfa86edf.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620175b3710a0951cfa86edf.md
new file mode 100644
index 00000000000..5b76231c803
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620175b3710a0951cfa86edf.md
@@ -0,0 +1,223 @@
+---
+id: 620175b3710a0951cfa86edf
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Kitendakazi cha `calc()` ni kitendakazi cha CSS kinachokuruhusu kukokotoa thamani kulingana na thamani zingine. Kwa mfano, unaweza kuitumia kukokotoa upana wa kituo cha kutazama ukiondoa ukingo wa kipengele:
+
+```css
+.example {
+ margin: 10px;
+ width: calc(100% - 20px);
+}
+```
+
+Ipe `#years` `margin` ya `0 -2px`, na `padding` iwe `0.5rem calc(1.25rem + 2px) 0.5rem 0`.
+
+# --hints--
+
+Kichaguzi chako cha `#years` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `0 -2px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('margin') === '0px -2px');
+```
+
+Kichaguzi chako cha `#years` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0.5rem calc(1.25rem + 2px) 0.5rem 0`.
+
+```js
+const padding = new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('padding');
+assert(['0.5rem calc(1.25rem + 2px) 0.5rem 0px', '0.5rem calc(2px + 1.25rem) 0.5rem 0px'].includes(padding));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+--fcc-editable-region--
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201782cc420715562f36271.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201782cc420715562f36271.md
new file mode 100644
index 00000000000..b7001effcc7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201782cc420715562f36271.md
@@ -0,0 +1,232 @@
+---
+id: 6201782cc420715562f36271
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Weka muundo wa maandishi ndani ya kipengele chako cha `#years` kwa kuunda kichaguzi `#years span[class]`. Sintaksia ya `span[class]` italenga kipengele chochote cha `span` ambacho kina seti ya sifa ya `class`, bila kujali thamani ya sifa.
+
+Mpe kichaguzi chako kipya fonti ya `bold`, upana wa `4.5rem`, na maandishi yakiwa yamepangiliwa kulia.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#years span[class]`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years span[class]'));
+```
+
+Kichaguzi chako cha `#years span[class]` kinapaswa kuwa na sifa ya `font-weight` iliyowekwa kuwa `bold`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years span[class]')?.getPropertyValue('font-weight') === 'bold');
+```
+
+Kichaguzi chako cha `#years span[class]` kinapaswa kuwa na sifa ya `width` iliyowekwa kuwa `4.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years span[class]')?.getPropertyValue('width') === '4.5rem');
+```
+
+Kichaguzi chako cha `#years span[class]` kinapaswa kuwa na sifa ya `text-align` iliyowekwa kuwa `right`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#years span[class]')?.getPropertyValue('text-align') === 'right');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620179bc0a6a2358c72b90ad.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620179bc0a6a2358c72b90ad.md
new file mode 100644
index 00000000000..922e3e79a7a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620179bc0a6a2358c72b90ad.md
@@ -0,0 +1,224 @@
+---
+id: 620179bc0a6a2358c72b90ad
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Ulifunga jedwali lako kwenye kontena yenye darasa la `table-wrap`. Unda kichaguzi cha darasa hilo, na ukipe `padding` iliyowekwa kuwa `0 0.75rem 1.5rem 0.75rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.table-wrap`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.table-wrap'));
+```
+
+Kichaguzi chako cha `.table-wrap` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0 0.75rem 1.5rem 0.75rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.table-wrap')?.getPropertyValue('padding') === '0px 0.75rem 1.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017b6f47454059bf2d3bd1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017b6f47454059bf2d3bd1.md
new file mode 100644
index 00000000000..a2007c37e45
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017b6f47454059bf2d3bd1.md
@@ -0,0 +1,230 @@
+---
+id: 62017b6f47454059bf2d3bd1
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Kabla ya kuanza kushughulikia jedwali lenyewe, vipengele vyako vya `span` vimeandikwa kwa herufi nzito kwa sasa. Unda kichaguzi cha `span:not(.sr-only)` na ukipe sifa ya `font-weight` iliyowekwa kuwa `normal`.
+
+Pseudo-selector ya `:not()` hutumiwa kulenga vipengele vyote ambavyo havilingani na kichaguzi - kwa hali hii, vipengele vyako vyovyote vya `span` ambavyo havina class ya `sr-only`. Hii inahakikisha kwamba sheria zako za awali za kichaguzi `span[class~="sr-only"]` hazijafutwa.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `span:not(.sr-only)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span:not(.sr-only)'));
+```
+
+Kichaguzi chako cha `span:not(.sr-only)` kinapaswa kuwa na sifa ya `font-weight` iliyowekwa kuwa `normal`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span:not(.sr-only)')?.getPropertyValue('font-weight') === 'normal');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017f47c87be96457c49f46.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017f47c87be96457c49f46.md
new file mode 100644
index 00000000000..db979ae5b2f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017f47c87be96457c49f46.md
@@ -0,0 +1,291 @@
+---
+id: 62017f47c87be96457c49f46
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Badala ya kulazimika kuangalia mara mbili kuwa hubatili sifa zako za awali, unaweza kutumia neno kuu la `!important` ili kuhakikisha sifa hizi zinatumika kila mara, bila kujali mpangilio au umaalum.
+
+Kipe kila kipengele katika kichaguzi chako cha `span[class~="sr-only"]` neno kuu la `!important`. Usibadilishe thamani zozote.
+
+# --hints--
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `border` iliyowekwa kuwa `0 !important`.
+
+```js
+// log it
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('border: 0px !important;') || text.includes('border: 0px none !important'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `clip` iliyowekwa kuwa `rect(1px, 1px, 1px, 1px) !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('clip: rect(1px, 1px, 1px, 1px) !important;'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `clip-path` iliyowekwa kuwa `inset(50%) !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('clip-path: inset(50%) !important;'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `1px !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('height: 1px !important;'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `1px !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('width: 1px !important;'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('position: absolute !important;'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `overflow` iliyowekwa kuwa `hidden !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('overflow: hidden !important;'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `white-space` iliyowekwa kuwa `nowrap !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('white-space: nowrap !important;'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0 !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('padding: 0px !important;'));
+```
+
+Kichaguzi chako cha `span[class~="sr-only"]` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `-1px !important`.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('span[class~="sr-only"]')?.cssText;
+assert(text.includes('margin: -1px !important;'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+--fcc-editable-region--
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span:not(.sr-only) {
+ font-weight: normal;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017fa5bbef406580ceb44f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017fa5bbef406580ceb44f.md
new file mode 100644
index 00000000000..685b90a59f6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017fa5bbef406580ceb44f.md
@@ -0,0 +1,236 @@
+---
+id: 62017fa5bbef406580ceb44f
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Kwa kuwa sasa umeongeza neno kuu la `!important`, unaweza kuondoa `:not(.sr-only)` kutoka kwa kichaguzi chako cha `span`.
+
+# --hints--
+
+Hupaswi kuwa na kichaguzi cha `span:not(.sr-only)`.
+
+```js
+assert(!(new __helpers.CSSHelp(document).getStyle('span:not(.sr-only)')));
+```
+
+Unapaswa kuwa na kichaguzi cha `span`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span'));
+```
+
+Hupaswi kubadilisha `font-weight`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('span')?.getPropertyValue('font-weight') === 'normal');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+--fcc-editable-region--
+span:not(.sr-only) {
+ font-weight: normal;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018243f046a368fab8ffb6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018243f046a368fab8ffb6.md
new file mode 100644
index 00000000000..87dfcc1ed46
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018243f046a368fab8ffb6.md
@@ -0,0 +1,238 @@
+---
+id: 62018243f046a368fab8ffb6
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Unda kichaguzi cha `table` ili kulenga majedwali yako. Weka sifa ya `border-collapse` kuwa `collapse`, ambayo itaruhusu mipaka ya seli kukunjwa hadi kwenye mpaka mmoja, badala ya mpaka unaozunguka kila seli. Pia weka sifa ya `border` kuwa `0` ili kuficha mipaka yenyewe.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `table`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table'));
+```
+
+Kichaguzi chako cha `table` kinafaa kuwa na sifa ya `border-collapse` iliyowekwa kuwa `collapse`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table')?.getPropertyValue('border-collapse') === 'collapse');
+```
+
+Kichaguzi chako cha `table` kinafaa kuwa na sifa ya `border` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table')?.getPropertyValue('border-width') === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201830cb0c74b69f1b41635.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201830cb0c74b69f1b41635.md
new file mode 100644
index 00000000000..5fa2230913c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201830cb0c74b69f1b41635.md
@@ -0,0 +1,242 @@
+---
+id: 6201830cb0c74b69f1b41635
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Hakikisha jedwali lako linajaza kontena yake kwa sifa ya `width` iliyowekwa kuwa `100%`, kisha iweke kwa kiasi na ukipe ukingo wa juu wa `3rem`.
+
+# --hints--
+
+Kichaguzi chako cha `table` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `100%`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table')?.getPropertyValue('width') === '100%');
+```
+
+Kichaguzi chako cha `table` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `relative`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table')?.getPropertyValue('position') === 'relative');
+```
+
+Kichaguzi chako cha `table` kinafaa kuwa na sifa ya `margin-top` iliyowekwa kuwa `3rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table')?.getPropertyValue('margin-top') === '3rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+--fcc-editable-region--
+table {
+ border-collapse: collapse;
+ border: 0;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620186f4b6b8356d2def576b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620186f4b6b8356d2def576b.md
new file mode 100644
index 00000000000..550d6a87e86
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620186f4b6b8356d2def576b.md
@@ -0,0 +1,252 @@
+---
+id: 620186f4b6b8356d2def576b
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Ifuatayo, unahitaji kuweka muundo wa vipengele vyako vya `caption` ili kuonekana kama vichwa. Unda kichaguzi cha `table caption`. Weka maandishi yawe na rangi ya `#356eaf`, ukubwa wa `1.3em` na uzito wa kawaida.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `table caption`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table caption'));
+```
+
+Kichaguzi chako cha `table caption` kinafaa kuwa na sifa ya `color` iliyowekwa kuwa `#356eaf`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table caption')?.getPropertyValue('color') === 'rgb(53, 110, 175)');
+```
+
+Kichaguzi chako cha `table caption` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `1.3em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table caption')?.getPropertyValue('font-size') === '1.3em');
+```
+
+Kichaguzi chako cha `table caption` kinapaswa kuwa na sifa ya `font-weight` iliyowekwa kuwa `normal`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table caption')?.getPropertyValue('font-weight') === 'normal');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018ba1aa263770c953be66.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018ba1aa263770c953be66.md
new file mode 100644
index 00000000000..7a470645fae
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018ba1aa263770c953be66.md
@@ -0,0 +1,251 @@
+---
+id: 62018ba1aa263770c953be66
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Sasa yape manukuu nafasi kamili, na uyahamishe `-2.25rem` kutoka juu na `0.5rem` kutoka kushoto.
+
+# --hints--
+
+Kichaguzi chako cha `table caption` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table caption')?.getPropertyValue('position') === 'absolute');
+```
+
+Kichaguzi chako cha `table caption` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `-2.25rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table caption')?.getPropertyValue('top') === '-2.25rem');
+```
+
+Kichaguzi chako cha `table caption` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `0.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('table caption')?.getPropertyValue('left') === '0.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+--fcc-editable-region--
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018c3e94434a71af1d5eaa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018c3e94434a71af1d5eaa.md
new file mode 100644
index 00000000000..8fc492e3a5c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018c3e94434a71af1d5eaa.md
@@ -0,0 +1,261 @@
+---
+id: 62018c3e94434a71af1d5eaa
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Unda kichaguzi ili kulenga vipengele vya `td` ndani ya muundo wako wa jedwali. Zipe upana wa kujaza kituo cha kutazama, na kiwango cha chini na cha juu zaidi cha `4rem`. Mbinu hii inahakikisha kuwa upana umewekwa, ilhali kuweka `width` haswa kungeruhusu vipengee kupungua hadi kwenye kontena.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tbody td`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tbody td'));
+```
+
+Kichaguzi chako cha `tbody td` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `100vw`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tbody td')?.getPropertyValue('width') === '100vw');
+```
+
+Kichaguzi chako cha `tbody td` kinafaa kuwa na sifa ya `min-width` iliyowekwa kuwa `4rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tbody td')?.getPropertyValue('min-width') === '4rem');
+```
+
+Kichaguzi chako cha `tbody td` kinafaa kuwa na sifa ya `max-width` iliyowekwa kuwa `4rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tbody td')?.getPropertyValue('max-width') === '4rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018ec29b3ae674f40bef31.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018ec29b3ae674f40bef31.md
new file mode 100644
index 00000000000..fb31b371667
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018ec29b3ae674f40bef31.md
@@ -0,0 +1,255 @@
+---
+id: 62018ec29b3ae674f40bef31
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Sasa lenga vipengele vya `th` ndani ya jedwali lako, na uzipe upana wa kontena zima, chini ya `12rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tbody th`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tbody th'));
+```
+
+Kichaguzi chako cha `tbody th` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `calc(100% - 12rem)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tbody th')?.getPropertyValue('width') === 'calc(100% - 12rem)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62019093fe30e278e797d2f6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62019093fe30e278e797d2f6.md
new file mode 100644
index 00000000000..f690767cbfd
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62019093fe30e278e797d2f6.md
@@ -0,0 +1,265 @@
+---
+id: 62019093fe30e278e797d2f6
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Kichaguzi cha `[attribute="value"]` kinalenga kipengele chochote ambacho kina sifa iliyo na thamani mahususi. Unda kichaguzi cha `tr[class="total"]` ili kulenga vipengele vyako vya `tr` vyenye darasa la `total`. Upe mpaka wa chini wa `4px double #0a0a23` na ufanye fonti kuwa nzito (bold).
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr[class="total"]`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr[class="total"]'));
+```
+
+Kichaguzi chako cha `tr[class="total"]` kinafaa kuwa na sifa ya `border-bottom` iliyowekwa kuwa `4px double #0a0a23`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr[class="total"]')?.getPropertyValue('border-bottom') === '4px double rgb(10, 10, 35)');
+```
+
+Kichaguzi chako cha `tr[class="total"]` kinapaswa kuwa na sifa ya `font-weight` iliyowekwa kuwa `bold`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr[class="total"]')?.getPropertyValue('font-weight') === 'bold');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620191707bc65579ddd3ce15.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620191707bc65579ddd3ce15.md
new file mode 100644
index 00000000000..5c61eeadc56
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620191707bc65579ddd3ce15.md
@@ -0,0 +1,270 @@
+---
+id: 620191707bc65579ddd3ce15
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Kwa kutumia sintaksia sawa ya kichaguzi, lenga vipengele vya `th` ndani ya safu mlalo za jedwali lako ambapo `class` ni `total`. Pangilia maandishi upande wa kushoto, na uwape pedi ya `0.5rem 0 0.25rem 0.5rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr[class="total"] th`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr[class="total"] th'));
+```
+
+Kichaguzi chako cha `tr[class="total"] th` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `left`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr[class="total"] th')?.getPropertyValue('text-align') === 'left');
+```
+
+Kichaguzi chako cha `tr[class="total"] th` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0.5rem 0 0.25rem 0.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr[class="total"] th')?.getPropertyValue('padding') === '0.5rem 0px 0.25rem 0.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620192a767533a7ad19d96d7.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620192a767533a7ad19d96d7.md
new file mode 100644
index 00000000000..54d42badb8b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620192a767533a7ad19d96d7.md
@@ -0,0 +1,277 @@
+---
+id: 620192a767533a7ad19d96d7
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Tofauti kuu kati ya `tr[class="total"]` na `tr.total` ni kwamba ya kwanza itachagua vipengele vya `tr` ambapo class *pekee* ni `total`. Ya pili itachagua vipengele vya `tr` ambapo darasa *inajumuisha* `total`.
+
+Kwa upande wako, `tr.total` itafanya kazi. Unaweza kutumia kichaguzi hiki kulenga vipengele vyote vya `td` ndani ya safu mlalo zako za `.total`. Pangilia maandishi kulia, na uipe padding ya `0 0.25rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr.total td`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.total td'));
+```
+
+Kichaguzi chako cha `tr.total td` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `right`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.total td')?.getPropertyValue('text-align') === 'right');
+```
+
+Kichaguzi chako cha `tr.total td` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0 0.25rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.total td')?.getPropertyValue('padding') === '0px 0.25rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201995d9ab88e80f1989dce.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201995d9ab88e80f1989dce.md
new file mode 100644
index 00000000000..075367f89a2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201995d9ab88e80f1989dce.md
@@ -0,0 +1,274 @@
+---
+id: 6201995d9ab88e80f1989dce
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Pseudo-selector ya `:nth-of-type()` hutumiwa kulenga vipengele maalum kulingana na mpangilio wao kati ya ndugu wa aina moja. Tumia kichaguzi hiki cha pseudo-selector kulenga kipengele cha tatu cha `td` ndani ya safu mlalo za jedwali la `total`. Ipe hii pedi (padding) inayofaa ya `0.5rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr.total td:nth-of-type(3)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.total td:nth-of-type(3)'));
+```
+
+Kichaguzi chako cha `tr.total td:nth-of-type(3)` kinafaa kuwa na sifa ya `padding-right` iliyowekwa kuwa `0.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.total td:nth-of-type(3)')?.getPropertyValue('padding-right') === '0.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620199c7a7a32c81d4db3410.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620199c7a7a32c81d4db3410.md
new file mode 100644
index 00000000000..286ca76579c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620199c7a7a32c81d4db3410.md
@@ -0,0 +1,278 @@
+---
+id: 620199c7a7a32c81d4db3410
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Vipe vipengele vyako vya `tr.total` athari ya kuelea ambayo inabadilisha mandharinyuma hadi `#99c9ff`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr.total:hover`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.total:hover'));
+```
+
+Kichaguzi chako cha `tr.total:hover` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#99c9ff`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.total:hover')?.getPropertyValue('background-color') === 'rgb(153, 201, 255)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a1a7af32c287bd6b8183.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a1a7af32c287bd6b8183.md
new file mode 100644
index 00000000000..cd7f95f62c3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a1a7af32c287bd6b8183.md
@@ -0,0 +1,284 @@
+---
+id: 6201a1a7af32c287bd6b8183
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Chagua vipengee vyako vya `td` vilivyo na thamani ya `class` ya `current` na ufanye fonti kuwa italiki.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `td.current`.
+
+```js
+const def = (s) => new __helpers.CSSHelp(document).getStyle(s);
+assert(def('td.current') || def('td[class="current"]'));
+```
+
+Kichaguzi chako cha `td.current` kinafaa kuwa na sifa ya `font-style` iliyowekwa kuwa `italic`.
+
+```js
+const font = (s) => new __helpers.CSSHelp(document).getStyle(s)?.getPropertyValue('font-style');
+assert((font('td.current') || font('td[class="current"]')) === 'italic');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a1cc668a34888f5b2f52.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a1cc668a34888f5b2f52.md
new file mode 100644
index 00000000000..e409a5f68c4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a1cc668a34888f5b2f52.md
@@ -0,0 +1,288 @@
+---
+id: 6201a1cc668a34888f5b2f52
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Chagua vipengele vya `tr` vyenye `class` iliyowekwa kuwa `data`. Zipe picha mandharinyuma ya `linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem)`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr.data`.
+
+```js
+const def = (s) => new __helpers.CSSHelp(document).getStyle(s);
+assert(def('tr.data') || def('tr[class="data"]'));
+```
+
+Kichaguzi chako cha `tr.data` kinafaa kuwa na `background-image` iliyowekwa kuwa `linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem)`.
+
+```js
+const bg = (s) => new __helpers.CSSHelp(document).getStyle(s)?.getPropertyValue('background-image');
+assert((bg('tr.data') || bg('tr[class="data"]')) === 'linear-gradient(rgb(223, 223, 226) 1.845rem, white 1.845rem)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+td.current {
+ font-style: italic;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a20d742f5c89736c8cfb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a20d742f5c89736c8cfb.md
new file mode 100644
index 00000000000..18293679186
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a20d742f5c89736c8cfb.md
@@ -0,0 +1,302 @@
+---
+id: 6201a20d742f5c89736c8cfb
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Chagua vipengele vya `th` ndani ya vipengele vyako vya `tr.data`. Pangilia maandishi upande wa kushoto, na kuipa pedi ya juu ya `0.3rem` na pedi ya kushoto ya `0.5rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr.data th`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th'));
+```
+
+Kichaguzi chako cha `tr.data th` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `left`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th')?.getPropertyValue('text-align') === 'left');
+```
+
+Kichaguzi chako cha `tr.data th` kinafaa kuwa na sifa ya `padding-top` iliyowekwa kuwa `0.3rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th')?.getPropertyValue('padding-top') === '0.3rem');
+```
+
+Kichaguzi chako cha `tr.data th` kinafaa kuwa na sifa ya `padding-left` iliyowekwa kuwa `0.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th')?.getPropertyValue('padding-left') === '0.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+td.current {
+ font-style: italic;
+}
+
+tr.data {
+ background-image: linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a42e39bf3b95b6a33bf3.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a42e39bf3b95b6a33bf3.md
new file mode 100644
index 00000000000..e37840d5904
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a42e39bf3b95b6a33bf3.md
@@ -0,0 +1,320 @@
+---
+id: 6201a42e39bf3b95b6a33bf3
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Unda kichaguzi `tr.data th .description` ili kulenga vipengele vilivyo na `class` iliyowekwa kuwa `description` ambayo iko ndani ya vipengele vyako vya `th` katika safu mlalo za jedwali za `.data`. Zipe onyesho la kuzuia (block display), fanya maandishi kuwa italiki kwa uzani wa kawaida, na uyaweke kuwa na `padding` iliyowekwa kuwa `1rem 0 0.75rem` na ukingo wa kulia wa `-13.5rem`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr.data th .description`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th .description'));
+```
+
+Kichaguzi chako cha `tr.data th .description` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `block`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th .description')?.getPropertyValue('display') === 'block');
+```
+
+Kichaguzi chako cha `tr.data th .description` kinapaswa kuwa na sifa ya `font-style` iliyowekwa kuwa `italic`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th .description')?.getPropertyValue('font-style') === 'italic');
+```
+
+Kichaguzi chako cha `tr.data th .description` kinapaswa kuwa na sifa ya `font-weight` iliyowekwa kuwa `normal`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th .description')?.getPropertyValue('font-weight') === 'normal');
+```
+
+Kichaguzi chako cha `tr.data th .description` kinapaswa kuwa na sifa ya `padding` iliyowekwa kuwa `1rem 0 0.75rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th .description')?.getPropertyValue('padding') === '1rem 0px 0.75rem');
+```
+
+Kichaguzi chako cha `tr.data th .description` kinapaswa kuwa na sifa ya `margin-right` iliyowekwa kuwa `-13.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data th .description')?.getPropertyValue('margin-right') === '-13.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+span {
+ font-weight: normal;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+td.current {
+ font-style: italic;
+}
+
+tr.data {
+ background-image: linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem);
+}
+
+tr.data th {
+ text-align: left;
+ padding-top: 0.3rem;
+ padding-left: 0.5rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a4adcc6414968b391592.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a4adcc6414968b391592.md
new file mode 100644
index 00000000000..57c2e845882
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a4adcc6414968b391592.md
@@ -0,0 +1,296 @@
+---
+id: 6201a4adcc6414968b391592
+title: Hatua ya 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+Vipengele vyako vya `span` sasa vyote vina mtindo mahususi zaidi, kumaanisha kuwa unaweza kuondoa sheria yako ya `span`.
+
+# --hints--
+
+Hupaswi kuwa na kichaguzi cha `span`.
+
+```js
+assert(!(new __helpers.CSSHelp(document).getStyle('span')));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+--fcc-editable-region--
+span {
+ font-weight: normal;
+}
+--fcc-editable-region--
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+td.current {
+ font-style: italic;
+}
+
+tr.data {
+ background-image: linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem);
+}
+
+tr.data th {
+ text-align: left;
+ padding-top: 0.3rem;
+ padding-left: 0.5rem;
+}
+
+tr.data th .description {
+ display: block;
+ font-weight: normal;
+ font-style: italic;
+ padding: 1rem 0 0.75rem;
+ margin-right: -13.5rem;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a5258af7b398b030bfaf.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a5258af7b398b030bfaf.md
new file mode 100644
index 00000000000..db591b7e1b2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a5258af7b398b030bfaf.md
@@ -0,0 +1,312 @@
+---
+id: 6201a5258af7b398b030bfaf
+title: Hatua ya 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Kiasi cha dola yako hakilingani sasa. Unda kichaguzi ili kulenga vipengele vya `td` ndani ya vipengele vyako vya `tr.data`. Pangilia maandishi kwa wima hadi juu, panga maandishi kwa mlalo kulia, na uweke pedi kuwa `0.3rem 0.25rem 0`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr.data td`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data td'));
+```
+
+Kichaguzi chako cha `tr.data td` kinafaa kuwa na sifa ya `vertical-align` iliyowekwa kuwa `top`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data td')?.getPropertyValue('vertical-align') === 'top');
+```
+
+Kichaguzi chako cha `tr.data td` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `right`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data td')?.getPropertyValue('text-align') === 'right');
+```
+
+Kichaguzi chako cha `tr.data td` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0.3rem 0.25rem 0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data td')?.getPropertyValue('padding') === '0.3rem 0.25rem 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+td.current {
+ font-style: italic;
+}
+
+tr.data {
+ background-image: linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem);
+}
+
+tr.data th {
+ text-align: left;
+ padding-top: 0.3rem;
+ padding-left: 0.5rem;
+}
+
+tr.data th .description {
+ display: block;
+ font-weight: normal;
+ font-style: italic;
+ padding: 1rem 0 0.75rem;
+ margin-right: -13.5rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a59be346d399c21d10b1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a59be346d399c21d10b1.md
new file mode 100644
index 00000000000..278e8f5ccf0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a59be346d399c21d10b1.md
@@ -0,0 +1,589 @@
+---
+id: 6201a59be346d399c21d10b1
+title: Hatua ya 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Unda kichaguzi kingine cha vipengele vya `td` ndani ya kipengele chako cha `tr.data`, lakini chagua cha mwisho haswa. Ipe hii pedi (padding) inayofaa ya `0.5rem`.
+
+Kwa hili, balance sheet yako imekamilika!
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `tr.data td:last-of-type`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data td:last-of-type'));
+```
+
+Kichaguzi chako cha `tr.data td:last-of-type` kinafaa kuwa na sifa ya `padding-right` iliyowekwa kuwa `0.5rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('tr.data td:last-of-type')?.getPropertyValue('padding-right') === '0.5rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ z-index: 999;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+td.current {
+ font-style: italic;
+}
+
+tr.data {
+ background-image: linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem);
+}
+
+tr.data th {
+ text-align: left;
+ padding-top: 0.3rem;
+ padding-left: 0.5rem;
+}
+
+tr.data th .description {
+ display: block;
+ font-weight: normal;
+ font-style: italic;
+ padding: 1rem 0 0.75rem;
+ margin-right: -13.5rem;
+}
+
+tr.data td {
+ vertical-align: top;
+ padding: 0.3rem 0.25rem 0;
+ text-align: right;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0 !important;
+ clip: rect(1px, 1px, 1px, 1px) !important;
+ clip-path: inset(50%) !important;
+ height: 1px !important;
+ width: 1px !important;
+ position: absolute !important;
+ overflow: hidden !important;
+ white-space: nowrap !important;
+ padding: 0 !important;
+ margin: -1px !important;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ z-index: 999;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+
+#years span[class] {
+ font-weight: bold;
+ width: 4.5rem;
+ text-align: right;
+}
+
+.table-wrap {
+ padding: 0 0.75rem 1.5rem 0.75rem;
+}
+
+table {
+ border-collapse: collapse;
+ border: 0;
+ width: 100%;
+ position: relative;
+ margin-top: 3rem;
+}
+
+table caption {
+ color: #356eaf;
+ font-size: 1.3em;
+ font-weight: normal;
+ position: absolute;
+ top: -2.25rem;
+ left: 0.5rem;
+}
+
+tbody td {
+ width: 100vw;
+ min-width: 4rem;
+ max-width: 4rem;
+}
+
+tbody th {
+ width: calc(100% - 12rem);
+}
+
+tr[class="total"] {
+ border-bottom: 4px double #0a0a23;
+ font-weight: bold;
+}
+
+tr[class="total"] th {
+ text-align: left;
+ padding: 0.5rem 0 0.25rem 0.5rem;
+}
+
+tr.total td {
+ text-align: right;
+ padding: 0 0.25rem;
+}
+
+tr.total td:nth-of-type(3) {
+ padding-right: 0.5rem;
+}
+
+tr.total:hover {
+ background-color: #99c9ff;
+}
+
+td.current {
+ font-style: italic;
+}
+
+tr.data {
+ background-image: linear-gradient(to bottom, #dfdfe2 1.845rem, white 1.845rem);
+}
+
+tr.data th {
+ text-align: left;
+ padding-top: 0.3rem;
+ padding-left: 0.5rem;
+}
+
+tr.data th .description {
+ display: block;
+ font-weight: normal;
+ font-style: italic;
+ padding: 1rem 0 0.75rem;
+ margin-right: -13.5rem;
+}
+
+tr.data td {
+ vertical-align: top;
+ padding: 0.3rem 0.25rem 0;
+ text-align: right;
+}
+
+tr.data td:last-of-type {
+ padding-right: 0.5rem;
+}
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/64076bbeba941114b0027b6a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/64076bbeba941114b0027b6a.md
new file mode 100644
index 00000000000..20768b05b24
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/64076bbeba941114b0027b6a.md
@@ -0,0 +1,209 @@
+---
+id: 64076bbeba941114b0027b6a
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Kuongeza nafasi `sticky` kulisogeza kipengele kwenye rafu yake yenyewe. Ili kuhakikisha kipengele chako cha `#years` hakifichwi na rafu tofauti, ongeza kipengele cha `z-index` kilichowekwa kuwa `999` katika sheria ya `#years`.
+
+# --hints--
+
+Kichaguzi chako cha `#years` kinafaa kuwa na sifa ya `z-index` iliyowekwa kuwa `999`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('#years')?.getPropertyValue('z-index'), '999');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ Balance Sheet
+
+
+
+
+
+
+
+ AcmeWidgetCorp
+ Balance Sheet
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+ Assets
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Cash This is the cash we currently have on hand.
+ $25
+ $30
+ $28
+
+
+ Checking Our primary transactional account.
+ $54
+ $56
+ $53
+
+
+ Savings Funds set aside for emergencies.
+ $500
+ $650
+ $728
+
+
+ Total Assets
+ $579
+ $736
+ $809
+
+
+
+
+ Liabilities
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Loans The outstanding balance on our startup loan.
+ $500
+ $250
+ $0
+
+
+ Expenses Annual anticipated expenses, such as payroll.
+ $200
+ $300
+ $400
+
+
+ Credit The outstanding balance on our credit card.
+ $50
+ $50
+ $75
+
+
+ Total Liabilities
+ $750
+ $600
+ $475
+
+
+
+
+ Net Worth
+
+
+
+ 2019
+ 2020
+ 2021
+
+
+
+
+ Total Net Worth
+ $-171
+ $136
+ $334
+
+
+
+
+
+
+
+
+```
+
+```css
+span[class~="sr-only"] {
+ border: 0;
+ clip: rect(1px, 1px, 1px, 1px);
+ clip-path: inset(50%);
+ height: 1px;
+ width: 1px;
+ position: absolute;
+ overflow: hidden;
+ white-space: nowrap;
+ padding: 0;
+ margin: -1px;
+}
+
+html {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ color: #0a0a23;
+}
+
+h1 {
+ max-width: 37.25rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem;
+}
+
+h1 .flex {
+ display: flex;
+ flex-direction: column-reverse;
+ gap: 1rem;
+}
+
+h1 .flex span:first-of-type {
+ font-size: 0.7em;
+}
+
+h1 .flex span:last-of-type {
+ font-size: 1.2em;
+}
+
+section {
+ max-width: 40rem;
+ margin: 0 auto;
+ border: 2px solid #d0d0d5;
+}
+
+--fcc-editable-region--
+#years {
+ display: flex;
+ justify-content: flex-end;
+ position: sticky;
+ top: 0;
+ background: #0a0a23;
+ color: #fff;
+ padding: 0.5rem calc(1.25rem + 2px) 0.5rem 0;
+ margin: 0 -2px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e6afc009b450a437940a1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e6afc009b450a437940a1.md
new file mode 100644
index 00000000000..0395c522db3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e6afc009b450a437940a1.md
@@ -0,0 +1,133 @@
+---
+id: 612e6afc009b450a437940a1
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Anza na muundo wa msingi wa HTML. Ongeza tamko la `DOCTYPE`, na vipengele vya `html`, `head`, `body` na `title`.
+
+Weka lugha ya ukurasa huu kwa Kiingereza. Weka `title` kuwa `Piano`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na rejeleo la `DOCTYPE`.
+
+```js
+assert(code.match(/` baada ya aina.
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinafaa kuwa na tagi ya ufunguzi yenye sifa ya `lang` ya `en`.
+
+```js
+assert(code.match(//gi));
+```
+
+Kipengele chako cha `html` kinapaswa kuwa na tagi ya kufunga.
+
+```js
+assert(code.match(/<\/html\s*>/));
+```
+
+Tamko lako la `DOCTYPE` linapaswa kuwa mwanzoni mwa HTML yako.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+Unapaswa kuwa na tagi ya kufungua ya `head`.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `head`.
+
+```js
+assert(code.match(/<\/head\s*>/i));
+```
+
+Unapaswa kuwa na tagi ya kufungua ya `body`.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya kufunga ya `body`.
+
+```js
+assert(code.match(/<\/body\s*>/i));
+```
+
+Vipengele vya `head` na `body` vinapaswa kuwa ndugu.
+
+```js
+assert(document.querySelector('head')?.nextElementSibling?.localName === 'body');
+```
+
+Kipengele cha `head` kinafaa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'head'));
+```
+
+Kipengele cha `body` kinafaa kuwa ndani ya kipengele cha `html`.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'body'));
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `title`.
+
+```js
+const title = document.querySelector('title');
+assert.exists(title);
+```
+
+Mradi wako unapaswa kuwa na kichwa cha `Piano`.
+
+```js
+const title = document.querySelector('title');
+assert.equal(title?.text?.trim()?.toLowerCase(), 'piano')
+```
+
+Kumbuka, ukubwa wa herufi na tahajia ni jambo la muhimu katika kichwa.
+
+```js
+const title = document.querySelector('title');
+assert.equal(title?.text?.trim(), 'Piano');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e77aba7ca691f598feb02.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e77aba7ca691f598feb02.md
new file mode 100644
index 00000000000..7c4ca57fd55
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e77aba7ca691f598feb02.md
@@ -0,0 +1,64 @@
+---
+id: 612e77aba7ca691f598feb02
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Ongeza tagi mbili za `meta`, moja ili kuboresha ukurasa wako kwa vifaa vya mkononi, na moja ili kubainisha `charset` iliyokubaliwa kwa ukurasa.
+
+# --hints--
+
+Unapaswa kuwa na vipengele viwili vya `meta`.
+
+```js
+const meta = document.querySelector('meta');
+assert.exists(meta);
+```
+
+Unapaswa kuwa na vipengele viwili vya `meta`.
+
+```js
+const meta = document.querySelectorAll('meta');
+assert(meta?.length === 2);
+```
+
+Kipengele kimoja cha `meta` kinapaswa kuwa na `name` iliyowekwa kuwa `viewport`, na `content` iliyowekwa kuwa `width=device-width, initial-scale=1.0`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => m?.getAttribute('name') === 'viewport' && m?.getAttribute('content') === 'width=device-width, initial-scale=1.0' && !m?.getAttribute('charset'));
+assert.exists(target);
+```
+
+Kipengele kingine cha `meta` kinafaa kuwa na sifa ya `charset` iliyowekwa kuwa `UTF-8`.
+
+```js
+const meta = [...document.querySelectorAll('meta')];
+const target = meta?.find(m => !m?.getAttribute('name') && !m?.getAttribute('content') && m?.getAttribute('charset')?.toLowerCase() === 'utf-8');
+assert.exists(target);
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ Piano
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e78af05201622d4bab8aa.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e78af05201622d4bab8aa.md
new file mode 100644
index 00000000000..9ee866218ff
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e78af05201622d4bab8aa.md
@@ -0,0 +1,57 @@
+---
+id: 612e78af05201622d4bab8aa
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Ni wakati wa kuanza kufanya kazi kwenye piano. Unda kipengele cha `div` ndani ya kipengele chako `body` kikiwa na `id` iliyowekwa kuwa `piano`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+const div = document.querySelector('div');
+assert.exists(div);
+```
+
+Kipengele chako cha `div` kinapaswa kuwa ndani ya kipengele chako cha `body`.
+
+```js
+const div = document.querySelector('div');
+assert(div?.parentElement?.localName === 'body');
+```
+
+Kipengee chako cha `div` kinapaswa kuwa na `id` ya `piano`.
+
+```js
+const div = document.querySelector('div');
+assert(div?.getAttribute('id') === 'piano');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e7d1c29fb872d6384379c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e7d1c29fb872d6384379c.md
new file mode 100644
index 00000000000..57beacc57c9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e7d1c29fb872d6384379c.md
@@ -0,0 +1,60 @@
+---
+id: 612e7d1c29fb872d6384379c
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Weka `div` ya pili ndani ya `div` yako iliyopo, na uweke `class` kuwa `keys`.
+
+# --hints--
+
+Unapaswa kuunda kipengele cha pili cha `div`.
+
+```js
+const divDiv = document.querySelectorAll('div');
+assert(divDiv?.length === 2);
+```
+
+Kipengele chako kipya cha `div` kinafaa kuwa ndani ya kipengee cha `div` kilichopo.
+
+```js
+const div = document.querySelector('div');
+assert(div?.children?.length === 1);
+assert(div?.children?.[0]?.localName === 'div');
+```
+
+Kipengee chako kipya cha `div` kinapaswa kuwa na `class` iliyowekwa kuwa `keys`.
+
+```js
+const div = document.querySelector('div');
+assert(div?.children?.[0]?.className === 'keys');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e804c54d5e7308d7ebe56.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e804c54d5e7308d7ebe56.md
new file mode 100644
index 00000000000..55e1eb40e3d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e804c54d5e7308d7ebe56.md
@@ -0,0 +1,60 @@
+---
+id: 612e804c54d5e7308d7ebe56
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `.keys`, ongeza vipengele saba vya `div`. Zipe zote class ya `key`.
+
+# --hints--
+
+Unapaswa kuunda vipengee saba vipya vya `div`.
+
+```js
+const divDivDiv = document.querySelectorAll('div');
+assert(divDivDiv?.length === 9);
+```
+
+Vipengele vyako saba vipya vya `div` vinapaswa kuwa ndani ya kipengele chako `.keys`.
+
+```js
+const keys = document.querySelector('.keys');
+assert([...keys?.children].length === 7);
+assert([...keys?.children].every(child => child?.tagName === 'DIV'));
+```
+
+Vipengele vyako saba vipya vya `div` vinapaswa kuwa na `class` iliyowekwa kuwa `key`.
+
+```js
+const keys = document.querySelector('.keys');
+assert([...keys?.children].every(child => child?.classList?.contains('key')));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e813b3ba67633222cbe54.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e813b3ba67633222cbe54.md
new file mode 100644
index 00000000000..2badc378698
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e813b3ba67633222cbe54.md
@@ -0,0 +1,95 @@
+---
+id: 612e813b3ba67633222cbe54
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Kumbuka kwamba sifa ya `class` inaweza kuwa na thamani nyingi. Ili kutenganisha vitufe vyako vyeupe na vitufe vyako vyeusi, utaongeza thamani ya pili ya `class` ya `black--key`. Ongeza hii kwenye vipengele vyako vya `.key` vya pili, tatu, tano, sita na saba.
+
+# --hints--
+
+Kipengele chako cha pili cha `.key` kinapaswa kuwa na `class` iliyowekwa kuwa `black--key`.
+
+```js
+const key = document.querySelectorAll('.key')?.[1];
+assert(key?.className?.includes('black--key'));
+```
+
+`.key` yako ya tatu inapaswa kuwa na `black--key` katika `class`.
+
+```js
+const third = document.querySelectorAll('.key')?.[2];
+assert(third?.classList?.contains('black--key'));
+```
+
+`.key` yako ya tano inapaswa kuwa na `black--key` katika `class`.
+
+```js
+const fifth = document.querySelectorAll('.key')?.[4];
+assert(fifth?.classList?.contains('black--key'));
+```
+
+`.key` yako ya sita inapaswa kuwa na `black--key` katika `class`.
+
+```js
+const sixth = document.querySelectorAll('.key')?.[5];
+assert(sixth?.classList?.contains('black--key'));
+```
+
+`.key` yako ya saba inapaswa kuwa na `black--key` katika `class`.
+
+```js
+const seventh = document.querySelectorAll('.key')?.[6];
+assert(seventh?.classList?.contains('black--key'));
+```
+
+Unapaswa kuwa na vipengele vitano vya `.black--key`.
+
+```js
+const blackKeys = document.querySelectorAll('.black--key');
+assert(blackKeys?.length === 5);
+```
+
+Unapaswa kuwa na vipengele saba vya `.key`.
+
+```js
+const keys = document.querySelectorAll('.key');
+assert(keys?.length === 7);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e8279827a28352ce83a72.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e8279827a28352ce83a72.md
new file mode 100644
index 00000000000..3f9f4139213
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e8279827a28352ce83a72.md
@@ -0,0 +1,74 @@
+---
+id: 612e8279827a28352ce83a72
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Sasa nakili seti ya vipengele saba vya `.key`, na ubandike seti mbili zaidi kwenye div ya `.keys`.
+
+# --hints--
+
+Unapaswa kuwa na vipengele 21 vya `.key`.
+
+```js
+const keys = document.querySelectorAll('.key');
+assert(keys?.length === 21);
+```
+
+Unapaswa kuwa na vipengele 15 vya `.black--key`.
+
+```js
+const blackKeys = document.querySelectorAll('.black--key');
+assert(blackKeys?.length === 15);
+```
+
+Vipengele vyote vya `.key` vinapaswa kuwa ndani ya kipengele chako cha `.keys`.
+
+```js
+const keys = document.querySelector('.keys');
+assert(keys?.querySelectorAll('.key')?.length === 21);
+```
+
+Vipengele vyote vya `.black--key` vinapaswa kuwa ndani ya kipengele chako cha `.keys`.
+
+```js
+const keys = document.querySelector('.keys');
+assert(keys?.querySelectorAll('.black--key')?.length === 15);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e83ec2eca1e370f830511.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e83ec2eca1e370f830511.md
new file mode 100644
index 00000000000..fccaabbf9d5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e83ec2eca1e370f830511.md
@@ -0,0 +1,102 @@
+---
+id: 612e83ec2eca1e370f830511
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Ongeza kipengele cha `link` ndani ya kipengele chako cha `head`. Kwa kipengele hicho cha `link`, weka sifa ya `rel` kuwa `stylesheet` na `href` kuwa `./styles.css`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha `link`.
+
+```js
+assert.match(code, / link'));
+```
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `rel` yenye thamani `stylesheet`.
+
+```js
+const link_element = document.querySelector('link');
+const rel = link_element.getAttribute("rel");
+assert.equal(rel, "stylesheet");
+```
+
+Kipengele chako cha `link` kinafaa kuwa na sifa ya `href` yenye thamani `styles.css`.
+
+```js
+const link = document.querySelector('link');
+assert.equal(link.dataset.href, "styles.css");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ --fcc-editable-region--
+
+ Piano
+
+ --fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e89562043183c86df287c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e89562043183c86df287c.md
new file mode 100644
index 00000000000..8b9d0e5d38b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e89562043183c86df287c.md
@@ -0,0 +1,77 @@
+---
+id: 612e89562043183c86df287c
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Vivinjari vinaweza kutumia ukingo chaguomsingi (default margin) na thamani za padding kwenye vipengele mahususi. Ili kuhakikisha kuwa piano yako inaonekana sawa, unahitaji kuweka upya muundo wa kisanduku.
+
+Ongeza kichaguzi cha sheria cha `html` kwenye faili yako ya CSS, na uweke kipengele cha `box-sizing` kuwa `border-box`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `html`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html'));
+```
+
+Kichaguzi chako cha `html` kinafaa kuwa na sifa ya `box-sizing` iliyowekwa kuwa `border-box`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html')?.boxSizing === 'border-box');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e89d254fe5d3df7d6693d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e89d254fe5d3df7d6693d.md
new file mode 100644
index 00000000000..b6b678a3e34
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e89d254fe5d3df7d6693d.md
@@ -0,0 +1,83 @@
+---
+id: 612e89d254fe5d3df7d6693d
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Kwa kuwa sasa umeweka upya kielelezo cha kisanduku cha `html`, unahitaji kupitisha hiyo kwa vipengele vilivyomo pia. Ili kufanya hivyo, unaweza kuweka `box-sizing` kuwa `inherit`, ambayo itaambia vipengele vilivyolengwa kutumia thamani sawa na kipengele kikuu.
+
+Utahitaji pia kulenga vipengele vya pseudo, ambavyo ni maneno makuu yanayofuata kichaguzi. Vipengele viwili vya pseudo utakavyokuwa ukitumia ni `::before` na `::after`.
+
+Kichaguzi cha `::before` huunda kipengele cha pseudo ambacho ni mtoto wa kwanza wa kipengele kilichochaguliwa, huku kichaguzi cha `::after` huunda kipengele cha pseudo ambacho ni mtoto wa mwisho wa kipengele kilichochaguliwa. Vipengele hivi vya pseudo hutumiwa mara nyingi kuunda maudhui ya vipodozi, ambayo utaona baadaye katika mradi huu.
+
+Kwa sasa, unda kichaguzi cha CSS ili kulenga vipengele vyote kwa `*`, na ujumuishe vipengele vya pseudo vilivyo na `::before` na `::after`. Weka sifa ya `box-sizing` kuwa `inherit`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi vya `*, ::before, ::after`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*, ::before, ::after'));
+```
+
+Kichaguzi chako cha `*, ::before, ::after` kinapaswa kuwa na sifa ya `box-sizing` iliyowekwa kuwa `inherit`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*, ::before, ::after')?.boxSizing === 'inherit');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+html {
+ box-sizing: border-box;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e8eebe3a6dc3fcc33a66f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e8eebe3a6dc3fcc33a66f.md
new file mode 100644
index 00000000000..b2e4f69b5d4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e8eebe3a6dc3fcc33a66f.md
@@ -0,0 +1,95 @@
+---
+id: 612e8eebe3a6dc3fcc33a66f
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Sasa lenga kipengele chako cha `#piano` kwa kichaguzi cha `id`. Weka sifa ya `background-color` kuwa `#00471b`, sifa ya `width` kuwa`992px` na sifa ya `height` kuwa`290px`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `#piano`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano'));
+```
+
+Kichaguzi chako cha `#piano` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#00471b`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.backgroundColor === 'rgb(0, 71, 27)');
+```
+
+Kichaguzi chako cha `#piano` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `992px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.width === '992px');
+```
+
+Kichaguzi chako cha `#piano` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `290px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.height === '290px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e95ef2e4bdf41f69067f9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e95ef2e4bdf41f69067f9.md
new file mode 100644
index 00000000000..6eda734bec4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e95ef2e4bdf41f69067f9.md
@@ -0,0 +1,81 @@
+---
+id: 612e95ef2e4bdf41f69067f9
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Weka `margin` ya `#piano` kuwa `80px auto`.
+
+# --hints--
+
+Kichaguzi chako cha `#piano` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `80px auto`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.margin === '80px auto');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+--fcc-editable-region--
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e96fc87fe8e44f69f7ec5.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e96fc87fe8e44f69f7ec5.md
new file mode 100644
index 00000000000..02f1ae3532d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e96fc87fe8e44f69f7ec5.md
@@ -0,0 +1,102 @@
+---
+id: 612e96fc87fe8e44f69f7ec5
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Wakati wa kupamba vitufe (keys). Chini ya sheria ya `#piano`, lenga kipengele cha `.keys` kwa kutumia kichaguzi cha `class`. Ipe sheria mpya sifa ya `background-color` ya `#040404`, sifa ya `width` ya `949px` na sifa ya `height` ya `180px`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.keys`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys'));
+```
+
+Kichaguzi chako cha `.keys` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#040404`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys')?.backgroundColor === 'rgb(4, 4, 4)');
+```
+
+Kichaguzi chako cha `.keys` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `949px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys')?.width === '949px');
+```
+
+Kichaguzi chako cha `.keys` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `180px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys')?.height === '180px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e98f3245c98475e49cfc6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e98f3245c98475e49cfc6.md
new file mode 100644
index 00000000000..8c65553605e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e98f3245c98475e49cfc6.md
@@ -0,0 +1,88 @@
+---
+id: 612e98f3245c98475e49cfc6
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Ipe `.keys` `padding-left` ya `2px`.
+
+# --hints--
+
+Kichaguzi chako cha `.keys` kinafaa kuwa na sifa ya `padding-left` iliyowekwa kuwa `2px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys')?.paddingLeft === '2px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+}
+
+--fcc-editable-region--
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9a21381a1949327512e6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9a21381a1949327512e6.md
new file mode 100644
index 00000000000..72eeb5d0855
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9a21381a1949327512e6.md
@@ -0,0 +1,89 @@
+---
+id: 612e9a21381a1949327512e6
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Sogeza vitufe kwenye nafasi kwa kurekebisha kichaguzi cha `#piano`. Weka sifa ya `padding` kuwa `90px 20px 0 20px`.
+
+# --hints--
+
+Kichaguzi chako cha `#piano` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `90px 20px 0 20px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.padding === '90px 20px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+--fcc-editable-region--
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+}
+--fcc-editable-region--
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9d142affc44a453655db.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9d142affc44a453655db.md
new file mode 100644
index 00000000000..af605ceff02
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9d142affc44a453655db.md
@@ -0,0 +1,117 @@
+---
+id: 612e9d142affc44a453655db
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Ni wakati wa kutengeneza mtindo kwa vitufe vyenyewe. Unda kichaguzi cha `class` cha vipengele vya `.key`. Weka `background-color` iliyowekwa kuwa na thamani `#ffffff`, sifa ya `position` kuwa `relative`, sifa ya `width` kuwa `41px`, na sifa ya `height` kuwa `175px`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.key`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key'));
+```
+
+Kichaguzi chako cha `.key` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#ffffff`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.backgroundColor === 'rgb(255, 255, 255)');
+```
+
+Kichaguzi chako cha `.key` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `relative`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.position === 'relative');
+```
+
+Kichaguzi chako cha `.key` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `41px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.width === '41px');
+```
+
+Kichaguzi chako cha `.key` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `175px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.height === '175px');
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9f1e7e5ccd4fa9ada0be.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9f1e7e5ccd4fa9ada0be.md
new file mode 100644
index 00000000000..f21843bd3d1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9f1e7e5ccd4fa9ada0be.md
@@ -0,0 +1,103 @@
+---
+id: 612e9f1e7e5ccd4fa9ada0be
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Ipe `.key` `margin` ya `2px` na sifa ya `float` iliyowekwa kuwa `left`.
+
+# --hints--
+
+Kichaguzi chako cha `.key` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `2px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.margin === '2px');
+```
+
+Kichaguzi chako cha `.key` kinafaa kuwa na sifa ya `float` iliyowekwa kuwa `left`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.float === 'left');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+--fcc-editable-region--
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ea4c4993aba52ab4aa32e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ea4c4993aba52ab4aa32e.md
new file mode 100644
index 00000000000..18910c6bcc8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ea4c4993aba52ab4aa32e.md
@@ -0,0 +1,119 @@
+---
+id: 612ea4c4993aba52ab4aa32e
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Sasa ni wakati wa kutumia vichaguzi vya pseudo ulivyotayarisha hapo awali. Ili kuunda vitufe vyeusi, ongeza kichaguzi kipya cha `.key.black--key::after`. Hii italenga vipengee vilivyo na darasa la `key black--key`, na kuchagua kipengele cha pseudo baada ya vipengele hivi katika HTML.
+
+Katika kichaguzi kipya, weka `background-color` kuwa `#1d1e22`. Pia weka kipengele cha `content` kuwa `""`. Hii itafanya vipengee vya pseudo kuwa tupu.
+
+Sifa ya `content` inatumika kuweka au kubatilisha maudhui ya kipengele. Kwa chaguo-msingi, vipengele vya pseudo vilivyoundwa na vichaguzi vya pseudo vya `::before` na `::after` ni tupu, na vipengele havitatolewa kwa ukurasa. Kuweka kipengele cha `content` kuwa mfuatano tupu `""` kutahakikisha kipengele kinatolewa kwa ukurasa huku kikiwa tupu.
+
+Ikiwa ungependa kufanya majaribio, jaribu kuondoa `background-color` na kuweka thamani tofauti za kipengele cha `content`, kama vile `"♥"`. Kumbuka kutendua mabadiliko haya unapomaliza ili majaribio yapite.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.key.black--key::after`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after'));
+```
+
+Kichaguzi chako cha `.key.black--key::after` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `#1d1e22`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.backgroundColor === 'rgb(29, 30, 34)');
+```
+
+Kichaguzi chako cha `.key.black--key::after` kinafaa kuwa na sifa ya `content` iliyowekwa kuwa `""`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.content === '""');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ea97df5742154772f312e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ea97df5742154772f312e.md
new file mode 100644
index 00000000000..c6bc91a25a5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ea97df5742154772f312e.md
@@ -0,0 +1,110 @@
+---
+id: 612ea97df5742154772f312e
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Ipe `.key.black--key::after` `position` iliyowekwa kuwa `absolute` na sifa ya `left` iliyowekwa kuwa `-18px`.
+
+# --hints--
+
+Kichaguzi chako cha `.key.black--key::after` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `.key.black--key::after` kinafaa kuwa na sifa ya `left` iliyowekwa kuwa `-18px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.left === '-18px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+}
+
+--fcc-editable-region--
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ead8788d28655ef8db056.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ead8788d28655ef8db056.md
new file mode 100644
index 00000000000..364e572ea8c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ead8788d28655ef8db056.md
@@ -0,0 +1,112 @@
+---
+id: 612ead8788d28655ef8db056
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Kwa `.key.black--key::after`, weka `width` kuwa `32px` na `height` kuwa `100px`.
+
+# --hints--
+
+Kichaguzi chako cha `.key.black--key::after` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `32px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.width === '32px');
+```
+
+Kichaguzi chako cha `.key.black--key::after` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `100px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.height === '100px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+}
+
+--fcc-editable-region--
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eaf56b7ba3257fdbfb0db.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eaf56b7ba3257fdbfb0db.md
new file mode 100644
index 00000000000..652ff6337d2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eaf56b7ba3257fdbfb0db.md
@@ -0,0 +1,144 @@
+---
+id: 612eaf56b7ba3257fdbfb0db
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Piano inahitaji nembo ya freeCodeCamp ili kuifanya iwe rasmi.
+
+Ongeza kipengele cha `img` kabla ya kipengele chako cha `.keys`. Ipe `img` `class` ya `logo`, na uweke `src` kuwa `https://cdn.freecodecamp.org/platform/universal/fcc_primary.svg`. Ipe maandishi ya `alt` ya `freeCodeCamp Logo`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele kipya cha `img`.
+
+```js
+assert(document.querySelectorAll('img')?.length === 1);
+```
+
+Kipengele chako cha `img` kinapaswa kuja kabla ya kipengele chako cha kwanza cha `.key`.
+
+```js
+const img = document.querySelector('img');
+assert(img?.nextElementSibling?.className === 'keys');
+assert(img?.previousElementSibling === null);
+```
+
+Kipengee chako kipya cha `img` kinapaswa kuwa na `class` ya `logo`.
+
+```js
+const img = document.querySelector('img');
+assert(img?.className === 'logo');
+```
+
+Kipengee chako cha `img` kinapaswa kuwa na `src` iliyowekwa kuwa `https://cdn.freecodecamp.org/platform/universal/fcc_primary.svg`.
+
+```js
+const img = document.querySelector('img');
+assert(img?.getAttribute('src') === 'https://cdn.freecodecamp.org/platform/universal/fcc_primary.svg');
+```
+
+Kipengee chako cha `img` kinapaswa kuwa na sifa ya `alt` iliyowekwa kuwa `freeCodeCamp Logo`.
+
+```js
+assert(document.querySelector('img')?.getAttribute('alt')?.toLowerCase() === 'freecodecamp logo');
+```
+
+Kumbuka kuwa tahajia na uandishi sahihi ni muhimu.
+
+```js
+assert(document.querySelector('img')?.getAttribute('alt') === 'freeCodeCamp Logo');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+ --fcc-editable-region--
+
+
+ --fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb4893b63c75bb9251ddf.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb4893b63c75bb9251ddf.md
new file mode 100644
index 00000000000..352a38c9df8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb4893b63c75bb9251ddf.md
@@ -0,0 +1,129 @@
+---
+id: 612eb4893b63c75bb9251ddf
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Anza kupamba nembo kwa kuunda cha kichaguzi `.logo`. Weka `width` kuwa `200px`, `position` ya `absolute` na `top` kuwa `23px`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.logo`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.logo'));
+```
+
+Kichaguzi chako cha `.logo` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `200px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.logo')?.width === '200px');
+```
+
+Kichaguzi chako cha `.logo` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.logo')?.position === 'absolute');
+```
+
+Kichaguzi chako cha `.logo` kinafaa kuwa na sifa ya `top` iliyowekwa kuwa `23px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.logo')?.top === '23px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb75153591b5e3b1ab65e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb75153591b5e3b1ab65e.md
new file mode 100644
index 00000000000..f61d23b2a23
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb75153591b5e3b1ab65e.md
@@ -0,0 +1,115 @@
+---
+id: 612eb75153591b5e3b1ab65e
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Kipengele cha `img` kinahitaji mzazi wake awe na `position` iliyowekwa kama marejeleo. Weka `position` ya kichaguzi cha `#piano` kuwa `relative`.
+
+# --hints--
+
+Kichaguzi chako cha `#piano` kinafaa kuwa na sifa ya `position` iliyowekwa kuwa `relative`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.position === 'relative');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+--fcc-editable-region--
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+}
+--fcc-editable-region--
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb7ca8c275d5f89c73333.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb7ca8c275d5f89c73333.md
new file mode 100644
index 00000000000..f4c641fc45b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb7ca8c275d5f89c73333.md
@@ -0,0 +1,116 @@
+---
+id: 612eb7ca8c275d5f89c73333
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Ili kulainisha kingo kali za piano na vitufe, anza kwa kuipa `#piano` `border-radius` ya `10px`.
+
+# --hints--
+
+Kichaguzi chako cha `#piano` kinafaa kuwa na sifa ya `border-radius` iliyowekwa kuwa `10px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.borderRadius === '10px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+--fcc-editable-region--
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+}
+--fcc-editable-region--
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb8e984cd73677a92b7e9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb8e984cd73677a92b7e9.md
new file mode 100644
index 00000000000..638d250ac8c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb8e984cd73677a92b7e9.md
@@ -0,0 +1,117 @@
+---
+id: 612eb8e984cd73677a92b7e9
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Kipe kichaguzi cha `.key` `border-radius` ya `0 0 3px 3px`.
+
+# --hints--
+
+Kichaguzi chako cha `.key` kinafaa kuwa na sifa ya `border-radius` iliyowekwa kuwa `0 0 3px 3px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.borderRadius === '0px 0px 3px 3px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+--fcc-editable-region--
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+}
+--fcc-editable-region--
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb934f64a4d6890a45518.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb934f64a4d6890a45518.md
new file mode 100644
index 00000000000..95bdf6cc957
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb934f64a4d6890a45518.md
@@ -0,0 +1,118 @@
+---
+id: 612eb934f64a4d6890a45518
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Kipe kichaguzi cha `.key.black--key::after` `border-radius` ya `0 0 3px 3px` ili kulinganisha vitufe.
+
+# --hints--
+
+Kichaguzi chako cha `.key.black--key::after` kinafaa kuwa na sifa ya `border-radius` iliyowekwa kuwa `0 0 3px 3px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.borderRadius === '0px 0px 3px 3px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+--fcc-editable-region--
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+}
+--fcc-editable-region--
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md
new file mode 100644
index 00000000000..4d1385b781e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md
@@ -0,0 +1,139 @@
+---
+id: 612ebcba99bfa46a15370b11
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Sheria ya `@media`, pia inajulikana kama media query, inatumika kuweka masharti kwa CSS. Media query hutumiwa kwa kawaida kuweka CSS kulingana na upana wa kituo cha kutazama kwa kutumia sifa za `max-width` na `min-width`.
+
+Katika mfano ulio hapa chini, padding inatumika kwa darasa la `.card` wakati eneo la kutazama ni `960px` pana na chini.
+
+```css
+@media (max-width: 960px) {
+ .card {
+ padding: 2rem;
+ }
+}
+```
+
+Ongeza media query ambayo itatumika wakati kituo cha kutazama kikiwa na upana na chini ya `768px`.
+
+# --hints--
+
+Unapaswa kuongeza `@media` query mpya.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.length === 1);
+```
+
+`@media` uery yako inapaswa kuwa na `max-width` ya `768px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')[0]?.media?.mediaText === '(max-width: 768px)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+ border-radius: 0 0 3px 3px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebe7fe6d07e6b76d1cae2.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebe7fe6d07e6b76d1cae2.md
new file mode 100644
index 00000000000..40dacbe6258
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebe7fe6d07e6b76d1cae2.md
@@ -0,0 +1,133 @@
+---
+id: 612ebe7fe6d07e6b76d1cae2
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Ongeza kichaguzi kipya cha `#piano` ndani ya `@media` uery yako, na uweke `width` kuwa `358px`.
+
+# --hints--
+
+Sheria yako ya `@media` inapaswa kuwa na kichaguzi `#piano`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 768px)');
+const piano = rules?.find(rule => rule.selectorText === '#piano');
+assert(piano);
+```
+
+Kichaguzi chako cha kipya cha `#piano` kinafaa kuwa na `width` iliyowekwa kuwa `358px`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 768px)');
+const piano = rules?.find(rule => rule.selectorText === '#piano');
+assert(piano?.style.width === '358px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+ border-radius: 0 0 3px 3px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+
+--fcc-editable-region--
+@media (max-width: 768px) {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebedec97e096c8bf64999.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebedec97e096c8bf64999.md
new file mode 100644
index 00000000000..990b5d98fa1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebedec97e096c8bf64999.md
@@ -0,0 +1,136 @@
+---
+id: 612ebedec97e096c8bf64999
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Ndani ya `@media` query, ongeza kichaguzi cha `.keys` na uweke `width` kuwa `318px`.
+
+# --hints--
+
+
+Sheria yako ya `@media` inapaswa kuwa na kichaguzi `.keys`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 768px)');
+const keys = rules?.find(rule => rule.selectorText === '.keys');
+assert(keys);
+```
+
+Kichaguzi chako cha kipya cha `.keys` kinafaa kuwa na `width` iliyowekwa kuwa `318px`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 768px)');
+const keys = rules?.find(rule => rule.selectorText === '.keys');
+assert(keys?.style.width === '318px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+ border-radius: 0 0 3px 3px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+
+--fcc-editable-region--
+@media (max-width: 768px) {
+ #piano {
+ width: 358px;
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebf9a210f2b6d77001e68.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebf9a210f2b6d77001e68.md
new file mode 100644
index 00000000000..023f343106c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebf9a210f2b6d77001e68.md
@@ -0,0 +1,139 @@
+---
+id: 612ebf9a210f2b6d77001e68
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Sasa ongeza kichaguzi cha `.logo` kwenye `@media` query, na uweke `width` kuwa `150px`.
+
+# --hints--
+
+Sheria yako ya `@media` inapaswa kuwa na kichaguzi cha `.logo`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 768px)');
+const logo = rules?.find(rule => rule.selectorText === '.logo');
+assert(logo);
+```
+
+Kichaguzi chako cha kipya cha `.logo` kinafaa kuwa na `width` iliyowekwa kuwa `150px`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 768px)');
+const logo = rules?.find(rule => rule.selectorText === '.logo');
+assert(logo?.style.width === '150px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+ border-radius: 0 0 3px 3px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+
+--fcc-editable-region--
+@media (max-width: 768px) {
+ #piano {
+ width: 358px;
+ }
+
+ .keys {
+ width: 318px;
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec0490ae8626e9adf82e4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec0490ae8626e9adf82e4.md
new file mode 100644
index 00000000000..edf2f7f9c31
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec0490ae8626e9adf82e4.md
@@ -0,0 +1,133 @@
+---
+id: 612ec0490ae8626e9adf82e4
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Huenda umeona funguo zinaanguka wakati onyesho la kivinjari ni dogo kuliko `768px`. Weka `overflow` iwe `hidden` katika kichaguzi cha kwanza cha `.keys`, ili kushughulikia suala hili. Sifa hii itaficha kipengele chochote ambacho kimesukumwa nje ya thamani iliyowekwa ya `width` ya `.keys`.
+
+# --hints--
+
+Kichaguzi chako asili cha `.keys` kinapaswa kuwa na sifa ya `overflow` iliyowekwa kuwa `hidden`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys')?.overflow === 'hidden');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+--fcc-editable-region--
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+}
+--fcc-editable-region--
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+ border-radius: 0 0 3px 3px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+
+@media (max-width: 768px) {
+ #piano {
+ width: 358px;
+ }
+
+ .keys {
+ width: 318px;
+ }
+
+ .logo {
+ width: 150px;
+ }
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md
new file mode 100644
index 00000000000..8da4786cfc7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md
@@ -0,0 +1,154 @@
+---
+id: 612ec19d5268da7074941f84
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Opereta ya kimantiki (Logical operators) zinaweza kutumika kuunda maswali changamano zaidi ya midia. Opereta ya kimantiki ya `and` inatumika kuuliza hali mbili za media.
+
+Kwa mfano, media query ambayo inalenga upana wa onyesho kati ya 500px na 1000px itakuwa:
+
+```css
+@media (min-width: 500px) and (max-width: 1000px){
+
+}
+```
+
+Ongeza sheria nyingine ya `@media` ili kutumia ikiwa onyesho la kivinjari ni pana kuliko `769px` lakini dogo kuliko `1199px`.
+
+# --hints--
+
+Unapaswa kuongeza `@media` query mpya.
+
+```js
+assert(new __helpers.CSSHelp(document).getCSSRules('media')?.length === 2);
+```
+
+`@media` yako inapaswa kuwa na `min-width` ya `769px` na `max-width` ya `1199px`.
+
+```js
+const mediaText = new __helpers.CSSHelp(document).getCSSRules('media')[1]?.media?.mediaText;
+assert(mediaText === '(max-width: 1199px) and (min-width: 769px)' || mediaText === '(min-width: 769px) and (max-width: 1199px)');
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+ overflow: hidden;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+ border-radius: 0 0 3px 3px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+
+@media (max-width: 768px) {
+ #piano {
+ width: 358px;
+ }
+
+ .keys {
+ width: 318px;
+ }
+
+ .logo {
+ width: 150px;
+ }
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec29c84b9a6718b1f5cec.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec29c84b9a6718b1f5cec.md
new file mode 100644
index 00000000000..f4dcadfb98f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec29c84b9a6718b1f5cec.md
@@ -0,0 +1,288 @@
+---
+id: 612ec29c84b9a6718b1f5cec
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Kwa sheria mpya ya `@media`, weka `width` ya `#piano` kuwa `675px` na `width` ya `.keys` kuwa `633px`.
+
+Kwa hiyo, piano yako imekamilika!
+
+# --hints--
+
+Sheria yako ya pili ya `@media` inapaswa kuwa na kichaguzi `#piano`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 1199px) and (min-width: 769px)');
+const piano = rules?.find(rule => rule.selectorText === '#piano');
+assert(piano);
+```
+
+Kichaguzi chako cha kipya cha `#piano` kinafaa kuwa na `width` iliyowekwa kuwa `675px`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 1199px) and (min-width: 769px)');
+const piano = rules?.find(rule => rule.selectorText === '#piano');
+assert(piano?.style.width === '675px');
+```
+
+Sheria yako ya pili ya `@media` inapaswa kuwa na kichaguzi `.keys`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 1199px) and (min-width: 769px)');
+const keys = rules?.find(rule => rule.selectorText === '.keys');
+assert(keys);
+```
+
+Kichaguzi chako cha kipya cha `.keys` kinafaa kuwa na `width` iliyowekwa kuwa `633px`.
+
+```js
+const rules = new __helpers.CSSHelp(document).getRuleListsWithinMedia('(max-width: 1199px) and (min-width: 769px)');
+const keys = rules?.find(rule => rule.selectorText === '.keys');
+assert(keys?.style.width === '633px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+ overflow: hidden;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+ border-radius: 0 0 3px 3px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+
+@media (max-width: 768px) {
+ #piano {
+ width: 358px;
+ }
+
+ .keys {
+ width: 318px;
+ }
+
+ .logo {
+ width: 150px;
+ }
+}
+
+--fcc-editable-region--
+@media (max-width: 1199px) and (min-width: 769px) {
+
+}
+--fcc-editable-region--
+```
+
+# --solutions--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+html {
+ box-sizing: border-box;
+}
+
+*, *::before, *::after {
+ box-sizing: inherit;
+}
+
+#piano {
+ background-color: #00471b;
+ width: 992px;
+ height: 290px;
+ margin: 80px auto;
+ padding: 90px 20px 0 20px;
+ position: relative;
+ border-radius: 10px;
+}
+
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+ padding-left: 2px;
+ overflow: hidden;
+}
+
+.key {
+ background-color: #ffffff;
+ position: relative;
+ width: 41px;
+ height: 175px;
+ margin: 2px;
+ float: left;
+ border-radius: 0 0 3px 3px;
+}
+
+.key.black--key::after {
+ background-color: #1d1e22;
+ content: "";
+ position: absolute;
+ left: -18px;
+ width: 32px;
+ height: 100px;
+ border-radius: 0 0 3px 3px;
+}
+
+.logo {
+ width: 200px;
+ position: absolute;
+ top: 23px;
+}
+
+@media (max-width: 768px) {
+ #piano {
+ width: 358px;
+ }
+
+ .keys {
+ width: 318px;
+ }
+
+ .logo {
+ width: 150px;
+ }
+}
+
+@media (max-width: 1199px) and (min-width: 769px) {
+ #piano {
+ width: 675px;
+ }
+
+ .keys {
+ width: 633px;
+ }
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996a.md
new file mode 100644
index 00000000000..6bf41a4b409
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996a.md
@@ -0,0 +1,55 @@
+---
+id: 60a3e3396c7b40068ad6996a
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Kufikia sasa, unapaswa kufahamu vipengele vya msingi ambavyo ukurasa wa HTML unapaswa kuwa navyo.
+
+Weka msimbo wako ya kwa tamko la `DOCTYPE`, kipengele cha `html` chenye lugha iliyowekwa kwa Kiingereza, kipengele cha `head` na kipengele cha `body`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na tamko la ``.
+
+```js
+assert(code.match(//i));
+```
+
+Unapaswa kuwa na tagi ya ufunguzi ya `` yenye sifa ya `lang` ya `en`.
+
+```js
+assert(code.match(//gi));
+```
+
+Unapaswa kuwa na kipengele cha `head` ndani ya kipengele chako cha `html`.
+
+```js
+assert(document.querySelectorAll('head').length === 1);
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `body` ndani ya kipengele cha `html`.
+
+```js
+assert(document.querySelectorAll('body').length === 1);
+```
+
+Kipengele chako cha `head` kinapaswa kuja kabla ya kipengele chako cha `body`.
+
+```js
+assert(document.querySelector('body').previousElementSibling.tagName === 'HEAD');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996b.md
new file mode 100644
index 00000000000..947b5525657
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996b.md
@@ -0,0 +1,65 @@
+---
+id: 60a3e3396c7b40068ad6996b
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Ndani ya kipengele cha `head`, ongeza tagi ya `meta` ambayo huweka `charset` kuwa `UTF-8`, na kipengele cha `title` chenye thamani ya `Rothko Painting`.
+
+Ndani ya kipengele cha `body`, ongeza kipengele cha `img` chenye `src` ya `https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-1.png`.
+# --hints--
+
+Unapaswa kuwa na tagi ya `meta`.
+
+```js
+assert(document.querySelectorAll('meta').length === 1);
+```
+
+Tagi ya `meta` inapaswa kuweka `charset` kuwa `UTF-8`.
+
+```js
+assert(document.querySelector('meta').getAttribute('charset')?.toLowerCase() === 'utf-8');
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `title`.
+
+```js
+assert(document.querySelectorAll('title').length === 1);
+```
+
+`title` inapaswa kuwa `Rothko Painting`.
+
+```js
+assert(document.querySelector('title').innerText === 'Rothko Painting');
+```
+
+Msimbo wako unapaswa kuwa na kipengele cha `img`.
+
+```js
+assert(document.querySelectorAll('img').length === 1);
+```
+
+Kipengele chako kipya cha `img` kinafaa kuwa na `src` ya `https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-1.png`.
+
+```js
+assert(document.querySelector('img').getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-1.png');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+--fcc-editable-region--
+
+
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996c.md
new file mode 100644
index 00000000000..d9184764d58
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996c.md
@@ -0,0 +1,42 @@
+---
+id: 60a3e3396c7b40068ad6996c
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Katika kisanduku cha CSS, kila kipengele cha HTML kinachukuliwa kama kisanduku chenye maeneo manne.
+
+Waza unapokea kisanduku kutoka kwa muuzaji wako unayempenda mtandaoni -- maudhui ni bidhaa iliyo kwenye kisanduku, au kwa upande wetu, kichwa, aya, au kipengele cha picha.
+
+Badilisha sifa ya `src` katika ` ` kutoka `https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-1.png` hadi `https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-2.png`.
+
+# --hints--
+
+Kipengele chako kipya cha `img` kinafaa kuwa na `src` ya `https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-2.png`
+
+```js
+assert(document.querySelector('img').getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-2.png');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Rothko Painting
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996d.md
new file mode 100644
index 00000000000..d794d78d04f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996d.md
@@ -0,0 +1,41 @@
+---
+id: 60a3e3396c7b40068ad6996d
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Maudhui yamezingirwa na nafasi inayoitwa padding, sawa na jinsi ufunikaji wa viputo unavyotenganisha kipengee kutoka kwa kisanduku kinachokizunguka.
+
+Chukulia mpaka kama sanduku la kadibodi la bidhaa yako iliyosafirishwa ndani.
+
+Badilisha sifa ya `src` iwe `https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-3.png`
+
+# --hints--
+
+Kipengele chako cha `img` kinafaa kuwa na `src` ya `https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-3.png`
+
+```js
+assert(document.querySelector('img').getAttribute('src') === 'https://cdn.freecodecamp.org/curriculum/css-box-model/diagram-3.png');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Rothko Painting
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996e.md
new file mode 100644
index 00000000000..b63eb3f3497
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996e.md
@@ -0,0 +1,43 @@
+---
+id: 60a3e3396c7b40068ad6996e
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Pambizo ni eneo la nje ya kisanduku, na linaweza kutumika kudhibiti nafasi kati ya visanduku vingine au vipengee.
+
+Hapa kipengele cha chini kina ukingo mkubwa wa juu, ukisukuma zaidi chini ya ukurasa.
+
+Sasa kwa kuwa umeelewa mfano wa kisanduku cha CSS, wacha tuanze kufanyia kazi mchoro wa Rothko.
+
+Ondoa kipengele cha ` `.
+
+# --hints--
+
+Hupaswi kuwa na kipengele cha `img` katika msimbo wako.
+
+```js
+assert(document.querySelector('img') === null);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Rothko Painting
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996f.md
new file mode 100644
index 00000000000..8a92521b073
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996f.md
@@ -0,0 +1,47 @@
+---
+id: 60a3e3396c7b40068ad6996f
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Ongeza kipengele cha `div` katika `body`.
+
+Weka sifa ya `class` sawa na `canvas`. Kwa mfano, ``.
+
+Hii itafanya kazi kama turubai(canvas) ya mchoro wako.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha `div`.
+
+```js
+assert(document.querySelectorAll('div').length === 1)
+```
+
+Kipengele chako cha `div` kinafaa kuwa na sifa ya `class` yenye thamani ya `canvas`.
+
+```js
+assert(document.querySelector('div').className.split(' ').includes('canvas'))
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69970.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69970.md
new file mode 100644
index 00000000000..ca80a8b99e1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69970.md
@@ -0,0 +1,53 @@
+---
+id: 60a3e3396c7b40068ad69970
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Kabla ya kuanza kutengeneza `div` uliyoongeza, unahitaji kuunganisha CSS yako kwenye HTML yako.
+
+Ongeza kipengele cha `link` ili kuunganisha faili yako ya `styles.css`. Weka `href` kuwa `styles.css`, na kumbuka kuweka sifa ya `rel` kuwa `stylesheet`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kipengele cha `link`.
+
+```js
+assert(/
+
+
+
+
Rothko Painting
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69971.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69971.md
new file mode 100644
index 00000000000..ac4fd9b2a94
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69971.md
@@ -0,0 +1,67 @@
+---
+id: 60a3e3396c7b40068ad69971
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Muda wa CSS.
+
+Ingawa `
` yako haina maandishi, bado inachukuliwa kama kisanduku chenye maudhui. Andika sheria ya CSS inayotumia kichaguzi cha darasa `.canvas` na uweke `width` kuwa pikseli 500. Hapa kuna sheria ya CSS inayoweka upana wa `card` ya darasa hadi pikseli 300:
+
+```css
+.card {
+ width: 300px;
+}
+```
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kichaguzi cha `.canvas`.
+
+```js
+const hasCanvas = new __helpers.CSSHelp(document).getStyle('.canvas');
+assert(hasCanvas)
+```
+
+Unapaswa kuweka sifa ya `width` kuwa `500px`.
+
+```js
+const hasWidth = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.width === '500px')
+assert(hasWidth);
+```
+
+Kipengele chako cha `.canvas` kinapaswa kuwa na `width` ya `500px`.
+
+```js
+const width = new __helpers.CSSHelp(document).getStyle('.canvas')?.getPropertyValue('width');
+assert(width === '500px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69972.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69972.md
new file mode 100644
index 00000000000..55fd20b21c8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69972.md
@@ -0,0 +1,54 @@
+---
+id: 60a3e3396c7b40068ad69972
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Ongeza sifa ya `height` yenye thamani `600px` kwa sheria yako ya `.canvas`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `height` kuwa `600px`.
+
+```js
+const hasHeight = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.height === '600px');
+assert(hasHeight);
+```
+
+Kipengele chako cha `.canvas` kinapaswa kuwa na `height` ya `600px`.
+
+```js
+const canvasHeight = new __helpers.CSSHelp(document).getStyle('.canvas')?.getPropertyValue('height');
+assert(canvasHeight === '600px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69973.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69973.md
new file mode 100644
index 00000000000..a0aea8abbba
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69973.md
@@ -0,0 +1,55 @@
+---
+id: 60a3e3396c7b40068ad69973
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Badilisha `background-color` ya turubai iwe `#4d0f00`.
+
+# --hints--
+
+Unapaswa kuweka sifa a `background-color` kuwa `#4d0f00`.
+
+```js
+const hasBackground = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['background-color'] === 'rgb(77, 15, 0)');
+assert(hasBackground);
+```
+
+Kipengele chako cha `.canvas` kinafaa kuwa na `background-color` ya `#4d0f00`.
+
+```js
+const canvasBackground = new __helpers.CSSHelp(document).getStyle('.canvas')?.getPropertyValue('background-color');
+assert(canvasBackground === 'rgb(77, 15, 0)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69974.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69974.md
new file mode 100644
index 00000000000..dbe9fa61c19
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69974.md
@@ -0,0 +1,67 @@
+---
+id: 60a3e3396c7b40068ad69974
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Kila mchoro unahitaji fremu.
+
+Funga kipengele cha `.canvas` katika `div` nyingine. Ipe `div` darasa la `frame`.
+# --hints--
+
+Unapaswa kuongeza kipengele kipya cha `div`.
+
+```js
+assert(document.querySelectorAll('div').length === 2)
+```
+
+Kipengee chako cha `.canvas` kinapaswa kuwekwa ndani ya kipengele kipya cha `div`.
+
+```js
+assert(document.querySelector('.canvas').parentElement.tagName === 'DIV');
+```
+
+Kipengele chako kipya cha `div` kinafaa kuwa na sifa ya `class` yenye thamani ya `frame`.
+
+```js
+assert(document.querySelector('div').className.split(' ').includes('frame'));
+```
+
+Kipengele chako kipya cha `div` kinapaswa kuwa ndani ya kipengele chako cha `body`.
+
+```js
+assert(document.querySelector('div').parentElement.tagName === 'BODY');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+--fcc-editable-region--
+
+
+
+
+--fcc-editable-region--
+
+ ```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69975.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69975.md
new file mode 100644
index 00000000000..4c0f1f65ff0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69975.md
@@ -0,0 +1,67 @@
+---
+id: 60a3e3396c7b40068ad69975
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Andika sheria mpya kwa kutumia kichaguzi cha darasa cha `.frame`.
+
+Tumia tamko la mkato `border` ili kukipa kipengele cha `.frame` mpaka thabiti na mweusi wenye upana wa `50px`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na kichaguzi cha `.frame`.
+
+```js
+const hasFrame = new __helpers.CSSHelp(document).getStyle('.frame');
+assert(hasFrame);
+```
+
+Unapaswa kuweka sifa ya `border` kuwa `50px solid black`.
+
+```js
+const hasBorder = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.border === '50px solid black');
+assert(hasBorder);
+```
+
+Kipengele chako cha `.frame` kinapaswa kuwa na `border` ya `50px solid black`.
+
+```js
+const frameBorder = new __helpers.CSSHelp(document).getStyle('.frame')?.getPropertyValue('border');
+assert(frameBorder === '50px solid black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69976.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69976.md
new file mode 100644
index 00000000000..7a2226bf7e2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69976.md
@@ -0,0 +1,64 @@
+---
+id: 60a3e3396c7b40068ad69976
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Fremu ni pana sana.
+
+Katika `.frame`, weka `width` kuwa pikseli 500.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `width` kuwa `500px`.
+
+```js
+const widthFilter = new __helpers.CSSHelp(document).getCSSRules().filter(x => x.style.width === '500px');
+assert(widthFilter.length === 2);
+```
+
+Kipengele chako cha `.frame` kinapaswa kuwa na `width` ya `500px`.
+
+```js
+const frameWidth = new __helpers.CSSHelp(document).getStyle('.frame')?.getPropertyValue('width');
+assert(frameWidth === '500px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+
+.frame {
+ border: 50px solid black;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69977.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69977.md
new file mode 100644
index 00000000000..7192b444d43
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69977.md
@@ -0,0 +1,65 @@
+---
+id: 60a3e3396c7b40068ad69977
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Tumia padding kurekebisha nafasi ndani ya kipengele.
+
+Katika `.frame`, tumia sifa ya mkato ya `padding` ili kuongeza nafasi kati ya vipengele vya `.frame` na `.canvas` kwa `50px`. Mkato huu utaongeza nafasi katika sehemu ya juu, chini, kushoto na kulia ya mpaka wa kipengele na turubai ndani.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `padding` kuwa `50px`.
+
+```js
+const hasPadding = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.padding === '50px');
+assert(hasPadding);
+```
+
+Kipengele chako cha `.frame` kinapaswa kuwa na thamani ya `padding` ya `50px`.
+
+```js
+const framePadding = new __helpers.CSSHelp(document).getStyle('.frame')?.getPropertyValue('padding');
+assert(framePadding === '50px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69978.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69978.md
new file mode 100644
index 00000000000..197fb695abb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69978.md
@@ -0,0 +1,66 @@
+---
+id: 60a3e3396c7b40068ad69978
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Tumia pambizo (margins) kurekebisha nafasi nje ya kipengele.
+
+Kwa kutumia kipengele cha `margin`, kipe kipengele cha `.frame` ukingo wima wa `20px`, na ukingo mlalo wa `auto`. Hii itasogeza fremu chini kwa pikseli 20 na kuiweka katikati kwa usawa kwenye ukurasa.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `margin` kuwa `20px auto`.
+
+```js
+const hasMargin = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.margin === '20px auto');
+assert(hasMargin);
+```
+
+Kipengele chako cha `.frame` kinapaswa kuwa na thamani ya `margin` ya `20px auto`.
+
+```js
+const frameMargin = new __helpers.CSSHelp(document).getStyle('.frame')?.getPropertyValue('margin');
+assert(frameMargin === '20px auto');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69979.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69979.md
new file mode 100644
index 00000000000..573892c9462
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69979.md
@@ -0,0 +1,71 @@
+---
+id: 60a3e3396c7b40068ad69979
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Ongeza kipengele kipya cha `div` ndani ya kipengele chako cha `.canvas`.
+
+Ipe `div` mpya sifa ya `class` yenye thamani ya `one`. Huu utakuwa mstatili wako wa kwanza.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+assert(document.querySelectorAll('div').length === 3);
+```
+
+Unapaswa kuweka kipengee kipya cha `div` ndani ya kipengele chako cha `.canvas`.
+
+```js
+assert(document.querySelector('.canvas').children[0].tagName === 'DIV');
+```
+
+Kipengele chako kipya cha `div` kinafaa kuwa na sifa ya `class` yenye thamani ya `one`.
+
+```js
+assert(document.querySelector('.canvas').children[0].className.split(' ').includes('one'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997a.md
new file mode 100644
index 00000000000..8188f880d36
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997a.md
@@ -0,0 +1,74 @@
+---
+id: 60a3e3396c7b40068ad6997a
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Andika sheria mpya inayolenga `.one` na uweke `width` kuwa pikseli 425.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.one`.
+
+```js
+const hasOne = new __helpers.CSSHelp(document).getStyle('.one');
+assert(hasOne);
+```
+
+Unapaswa kuweka sifa ya `width` kuwa `425px`.
+
+```js
+const hasWidth = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.width === '425px');
+assert(hasWidth);
+```
+
+Kipengele chako cha `.one` kinapaswa kuwa na thamani ya `width` ya `425px`.
+
+```js
+const oneWidth = new __helpers.CSSHelp(document).getStyle('.one')?.getPropertyValue('width');
+assert(oneWidth === '425px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997b.md
new file mode 100644
index 00000000000..db13b50f64b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997b.md
@@ -0,0 +1,70 @@
+---
+id: 60a3e3396c7b40068ad6997b
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Sasa weka `height` ya `.one` kuwa pikseli 150.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `height` kuwa `150px`.
+
+```js
+const hasHeight = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.height === '150px');
+assert(hasHeight);
+```
+
+Kipengele chako cha `.one` kinapaswa kuwa na thamani ya `height` ya `150px`.
+
+```js
+const oneHeight = new __helpers.CSSHelp(document).getStyle('.one')?.getPropertyValue('height');
+assert(oneHeight === '150px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997c.md
new file mode 100644
index 00000000000..7fc9627a177
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997c.md
@@ -0,0 +1,71 @@
+---
+id: 60a3e3396c7b40068ad6997c
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Weka `background-color` ya `.one` kuwa `#efb762`.
+
+# --hints--
+
+Unapaswa kuweka sifa a `background-color` kuwa `#efb762`.
+
+```js
+const hasBackground = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['background-color'] === 'rgb(239, 183, 98)');
+assert(hasBackground)
+```
+
+Kipengele chako cha `.one` kinafaa kuwa na `background-color` ya `#efb762`.
+
+```js
+const oneBackground = new __helpers.CSSHelp(document).getStyle('.one')?.getPropertyValue('background-color');
+assert(oneBackground === 'rgb(239, 183, 98)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997d.md
new file mode 100644
index 00000000000..6d5824a14fb
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997d.md
@@ -0,0 +1,74 @@
+---
+id: 60a3e3396c7b40068ad6997d
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Tumia pambizo ili kuweka kipengele cha `.one` kwenye turubai (canvas).
+
+Ongeza kipengele cha mkato cha `margin` chenye ukingo wima (vertical margin) wa `20px` na ukingo mlalo (horizontal margin) wa `auto`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `margin` kuwa `20px auto`.
+
+```js
+const marginFilter = new __helpers.CSSHelp(document).getCSSRules().filter(x => x.style.margin === '20px auto');
+assert(marginFilter.length === 2);
+```
+
+Kipengele chako cha `.one` kinapaswa kuwa na thamani ya `margin` ya `20px auto`.
+
+```js
+const oneMargin = new __helpers.CSSHelp(document).getStyle('.one')?.getPropertyValue('margin');
+assert(oneMargin === '20px auto');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997e.md
new file mode 100644
index 00000000000..78093232ed7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997e.md
@@ -0,0 +1,75 @@
+---
+id: 60a3e3396c7b40068ad6997e
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Sasa `.one` imewekwa katikati kwa mlalo, lakini ukingo wake wa juu unasukuma turubai na kuingia kwenye mpaka wa fremu, ikihamisha turubai nzima chini ya pikseli 20.
+
+Ongeza `padding` ya `1px` kwenye kipengele cha `.canvas` ili kukipa kipengele cha `.one` kitu thabiti cha kukisukuma.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `padding` kuwa `1px`.
+
+```js
+const hasPadding = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.padding === '1px');
+assert(hasPadding);
+```
+
+Kipengele chako cha `.canvas` kinapaswa kuwa na thamani ya `padding` ya `1px`.
+
+```js
+const canvasPadding = new __helpers.CSSHelp(document).getStyle('.canvas')?.getPropertyValue('padding');
+assert(canvasPadding === '1px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997f.md
new file mode 100644
index 00000000000..f9b0ff98bf0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6997f.md
@@ -0,0 +1,82 @@
+---
+id: 60a3e3396c7b40068ad6997f
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Kuongeza pikseli 1 ya padding ya juu, chini, kushoto na kulia kwa turubai kulibadilisha vipimo vyake hadi pikseli 502 x 602.
+
+Badilisha sifa ya `padding` na `overflow` iliyowekwa kuwa `hidden` - kubadilisha turubai hadi vipimo vyake asili.
+
+# --hints--
+
+Unapaswa kuondoa sifa ya `padding` kutoka kwa kichagusi cha `.canvas`.
+
+```js
+const canvasPadding = new __helpers.CSSHelp(document).getStyle('.canvas').getPropertyValue('padding');
+assert(!canvasPadding);
+```
+
+Unapaswa kuweka sifa ya `overflow` kuwa `hidden`.
+
+```js
+const hasOverflow = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.overflow === 'hidden');
+assert(hasOverflow);
+```
+
+Kipengele chako cha `.canvas` kinapaswa kuwa na thamani ya `overflow` ya `hidden`.
+
+```js
+const canvasOverflow = new __helpers.CSSHelp(document).getStyle('.canvas')?.getPropertyValue('overflow');
+assert(canvasOverflow === 'hidden')
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+--fcc-editable-region--
+ padding: 1px;
+--fcc-editable-region--
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69980.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69980.md
new file mode 100644
index 00000000000..889ff8bdb70
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69980.md
@@ -0,0 +1,84 @@
+---
+id: 60a3e3396c7b40068ad69980
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Ongeza `div` nyingine yenye thamani ya `class` ya `two` chini kidogo ya kipengele chako cha `one`. Huu utakuwa mstatili wako wa pili.
+
+# --hints--
+
+Hupaswi kubadilisha kipengele cha `.one` kilichopo.
+
+```js
+assert(document.querySelectorAll('.one').length === 1);
+```
+
+Unapaswa kuweka kipengee cha pili cha `div` ndani ya kipengele chako cha `.canvas`.
+
+```js
+assert(document.querySelector('.canvas').children[1].tagName === 'DIV');
+```
+
+Kipengele chako cha pili cha `div` kinapaswa kuwa na `class` iliyowekwa kuwa `two`.
+
+```js
+assert(document.querySelector('.canvas').children[1].className.split(' ').includes('two'));
+```
+
+Kipengele chako cha `.two` kinapaswa kuja baada ya kipengele chako cha `.one`.
+
+```js
+assert(document.querySelector('.two').previousElementSibling.className.split(' ').includes('one'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69981.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69981.md
new file mode 100644
index 00000000000..4688119cfb7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69981.md
@@ -0,0 +1,84 @@
+---
+id: 60a3e3396c7b40068ad69981
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Unda sheria mpya ya CSS ukitumia kichaguzi `.two` na uweke `width` kuwa pikseli 475.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.two`.
+
+```js
+const hasTwo = new __helpers.CSSHelp(document).getStyle('.two');
+assert(hasTwo);
+```
+
+Unapaswa kuweka sifa ya `width` kuwa `475px`.
+
+```js
+const hasWidth = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.width === '475px');
+assert(hasWidth);
+```
+
+Kipengele chako cha `.two` kinapaswa kuwa na thamani ya `width` ya `475px`.
+
+```js
+const twoWidth = new __helpers.CSSHelp(document).getStyle('.two')?.getPropertyValue('width');
+assert(twoWidth === '475px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69982.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69982.md
new file mode 100644
index 00000000000..da1046624f3
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69982.md
@@ -0,0 +1,79 @@
+---
+id: 60a3e3396c7b40068ad69982
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Weka `height` wa kipengele cha `.two` kuwa pikseli 200.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `height` kuwa `200px`.
+
+```js
+const hasHeight = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.height === '200px');
+assert(hasHeight);
+```
+
+Kipengele chako cha `.two` kinapaswa kuwa na thamani ya `height` ya `200px`.
+
+```js
+const twoHeight = new __helpers.CSSHelp(document).getStyle('.two')?.getPropertyValue('height');
+assert(twoHeight === '200px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69983.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69983.md
new file mode 100644
index 00000000000..735a4feb35c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69983.md
@@ -0,0 +1,80 @@
+---
+id: 60a3e3396c7b40068ad69983
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Weka `background-color` ya `.two` kuwa `#8f0401`.
+
+# --hints--
+
+Unapaswa kuweka sifa a `background-color` kuwa `#8f0401`.
+
+```js
+const hasBackground = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['background-color'] === 'rgb(143, 4, 1)');
+assert(hasBackground);
+```
+
+Kipengele chako cha `.two` kinafaa kuwa na `background-color` ya `#8f0401`.
+
+```js
+const twoBackground = new __helpers.CSSHelp(document).getStyle('.two')?.getPropertyValue('background-color');
+assert(twoBackground === 'rgb(143, 4, 1)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69984.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69984.md
new file mode 100644
index 00000000000..56dc4f43e63
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69984.md
@@ -0,0 +1,81 @@
+---
+id: 60a3e3396c7b40068ad69984
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Weka kipengee cha `.two` kati kwa kuweka `margin` kuwa `auto`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `margin` kuwa `auto`.
+
+```js
+const hasMargin = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.margin === 'auto');
+assert(hasMargin);
+```
+
+Kipengele chako cha `.two` kinapaswa kuwa na thamani ya `margin` ya `auto`.
+
+```js
+const twoMargin = new __helpers.CSSHelp(document).getStyle('.two')?.getPropertyValue('margin');
+assert(twoMargin === 'auto');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69986.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69986.md
new file mode 100644
index 00000000000..e77cd2eb129
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69986.md
@@ -0,0 +1,93 @@
+---
+id: 60a3e3396c7b40068ad69986
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Unda `div` mpya yenye thamani ya `class` ya `three` chini ya kipengele cha `.two`. Huu utakuwa mstatili wako wa tatu.
+
+# --hints--
+
+Vipengele vyako vilivyopo vya `.one` na `.two` havipaswi kubadilishwa.
+
+```js
+assert(document.querySelectorAll('.one').length === 1);
+assert(document.querySelectorAll('.two').length === 1);
+```
+
+Kipengele chako kipya cha `div` kinapaswa kuwa ndani ya kipengele chako cha `.canvas`.
+
+```js
+assert(document.querySelector('.canvas').children[2].tagName === 'DIV');
+```
+
+Kipengele chako kipya cha `div` kinafaa kuja baada ya kipengele chako cha `.two`.
+
+```js
+assert(document.querySelector('.two').nextElementSibling.tagName === 'DIV');
+```
+
+Kipengele chako kipya cha `div` kinafaa kuwa na sifa ya `class` yenye thamani ya `three`.
+
+```js
+assert(document.querySelector('.canvas').children[2].className.split(' ').includes('three'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: auto;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69987.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69987.md
new file mode 100644
index 00000000000..c2e46291568
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69987.md
@@ -0,0 +1,94 @@
+---
+id: 60a3e3396c7b40068ad69987
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Si lazima kila wakati utumie pikseli wakati wa kuweka ukubwa wa kipengele.
+
+Unda sheria mpya, `.three` na uweke `width` kuwa `91%`.
+
+# --hints--
+
+Unapaswa kutumia kichaguzi cha `.three`.
+
+```js
+const hasThree = new __helpers.CSSHelp(document).getStyle('.three');
+assert(hasThree);
+```
+
+Unapaswa kuweka sifa ya `width` kuwa `91%`.
+
+```js
+const hasWidth = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.width === '91%');
+assert(hasWidth);
+```
+
+Kipengele chako cha `.three` kinapaswa kuwa na thamani ya `width` ya `91%`.
+
+```js
+const threeWidth = new __helpers.CSSHelp(document).getStyle('.three')?.getPropertyValue('width');
+assert(threeWidth === '91%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: auto;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69988.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69988.md
new file mode 100644
index 00000000000..b4584e8617e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69988.md
@@ -0,0 +1,87 @@
+---
+id: 60a3e3396c7b40068ad69988
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Weka `height` ya `.three` kuwa `28%`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `height` kuwa `28%`.
+
+```js
+const hasHeight = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.height === '28%');
+assert(hasHeight);
+```
+
+Kipengele chako cha `.three` kinapaswa kuwa na thamani ya `height` ya `28%`.
+
+```js
+const threeHeight = new __helpers.CSSHelp(document).getStyle('.three')?.getPropertyValue('height');
+assert(threeHeight === '28%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: auto;
+}
+
+.three {
+ width: 91%;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69989.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69989.md
new file mode 100644
index 00000000000..31a9145df08
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69989.md
@@ -0,0 +1,88 @@
+---
+id: 60a3e3396c7b40068ad69989
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Badilisha `background-color` ya `.three` kuwa `#b20403`.
+
+# --hints--
+
+Unapaswa kuweka sifa a `background-color` kuwa `#b20403`.
+
+```js
+const hasBackground = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['background-color'] === 'rgb(178, 4, 3)');
+assert(hasBackground);
+```
+
+Kipengele chako cha `.three` kinafaa kuwa na `background-color` ya `#b20403`.
+
+```js
+const threeBackground = new __helpers.CSSHelp(document).getStyle('.three')?.getPropertyValue('background-color');
+assert(threeBackground === 'rgb(178, 4, 3)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: auto;
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998a.md
new file mode 100644
index 00000000000..be481e34718
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998a.md
@@ -0,0 +1,89 @@
+---
+id: 60a3e3396c7b40068ad6998a
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Weka kati kipengee cha `.three` kwenye turubai kwa kuweka `margin` kuwa `auto`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `margin` kuwa `auto`.
+
+```js
+const marginFilter = new __helpers.CSSHelp(document).getCSSRules().filter(x => x.style.margin === 'auto');
+assert(marginFilter.length === 2);
+```
+
+Kipengele chako cha `.three` kinapaswa kuwa na thamani ya `margin` ya `auto`.
+
+```js
+const threeMargin = new __helpers.CSSHelp(document).getStyle('.three')?.getPropertyValue('margin');
+assert(threeMargin === 'auto');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: auto;
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998b.md
new file mode 100644
index 00000000000..8e0c0dc7014
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998b.md
@@ -0,0 +1,93 @@
+---
+id: 60a3e3396c7b40068ad6998b
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Inasaidia kuweka kando ukingo wako kwa kuusukuma kwa mwelekeo mmoja.
+
+Katika hali hii, ukingo wa chini wa kipengele cha `.one` husukuma `.two` chini pikseli 20.
+
+Katika kichaguzi cha `.two`, tumia sifa ya mkato ya `margin` kuweka ukingo wa juu kuwa `0`, ukingo mlalo hadi `auto`, na ukingo wa chini hadi `20px`. Hii itaondoa ukingo wake wa juu, na kuiweka katikati mwa mlalo, na kuweka ukingo wake wa chini hadi pikseli 20.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `margin` kuwa `0 auto 20px`.
+
+```js
+const hasMargin = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.margin === '0px auto 20px');
+assert(hasMargin);
+```
+
+Kipengele chako cha `.two` kinapaswa kuwa na thamani ya `margin` ya `0 auto 20px`.
+
+```js
+const twoMargin = new __helpers.CSSHelp(document).getStyle('.two')?.getPropertyValue('margin');
+assert(twoMargin === '0px auto 20px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+--fcc-editable-region--
+ margin: auto;
+--fcc-editable-region--
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998c.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998c.md
new file mode 100644
index 00000000000..0fdf667cb6e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998c.md
@@ -0,0 +1,100 @@
+---
+id: 60a3e3396c7b40068ad6998c
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Rangi na maumbo ya uchoraji wako ni mkali sana kupita kama Rothko.
+
+Tumia sifa ya `filter` kutia `blur` kwa mchoro kwa `2px` katika kipengele cha `.canvas`.
+
+Huu hapa ni mfano wa sheria inayoongeza 3px ya `blur`:
+
+```css
+p {
+ filter: blur(3px);
+}
+```
+
+# --hints--
+
+Unapaswa kuweka sifa ya `filter` kuwa `blur(2px)`.
+
+```js
+const hasFilter = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.filter === 'blur(2px)');
+assert(hasFilter);
+```
+
+Kipengele chako cha `.canvas` kinapaswa kuwa na thamani ya `filter` ya `blur(2px)`.
+
+```js
+const canvasFilter = new __helpers.CSSHelp(document).getStyle('.canvas')?.getPropertyValue('filter');
+assert(canvasFilter === 'blur(2px)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998d.md
new file mode 100644
index 00000000000..8333831e631
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998d.md
@@ -0,0 +1,108 @@
+---
+id: 60a3e3396c7b40068ad6998d
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Unda sheria ambayo inalenga `.one` na `.two` na kuongeza athari zao za `blur` kwa pikseli 1.
+
+# --hints--
+
+Unapaswa kuwa na orodha ya kichaguzi cha `.one, .two`.
+
+```js
+const oneTwo = new __helpers.CSSHelp(document).getStyle('.one, .two');
+assert(oneTwo);
+```
+
+Unapaswa kuweka sifa ya `filter` kuwa `blur(1px)`.
+
+```js
+const hasFilter = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.filter === 'blur(1px)');
+assert(hasFilter)
+```
+
+Kipengele chako cha `.one` kinapaswa kuwa na thamani ya `filter` ya `blur(1px)`.
+
+```js
+const one = document.querySelector('.one');
+const oneFilter = getComputedStyle(one).filter;
+assert(oneFilter === 'blur(1px)');
+```
+
+Kipengele chako cha `.two` kinapaswa kuwa na thamani ya `filter` ya `blur(1px)`.
+
+```js
+const two = document.querySelector('.two');
+const twoFilter = getComputedStyle(two).filter;
+assert(twoFilter === 'blur(1px)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998e.md
new file mode 100644
index 00000000000..2ed36711f38
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998e.md
@@ -0,0 +1,95 @@
+---
+id: 60a3e3396c7b40068ad6998e
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Ongeza `blur` ya `.three` kuwa pikseli 2.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `filter` kuwa `blur(2px)`.
+
+```js
+const filterFilter = new __helpers.CSSHelp(document).getCSSRules().filter(x => x.style.filter === 'blur(2px)');
+assert(filterFilter.length === 2);
+```
+
+Kipengele chako cha `.three` kinapaswa kuwa na thamani ya `filter` ya `blur(2px)`.
+
+```js
+const threeFilter = new __helpers.CSSHelp(document).getStyle('.three')?.getPropertyValue('filter');
+assert(threeFilter === 'blur(2px)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998f.md
new file mode 100644
index 00000000000..ff4a4e390c1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6998f.md
@@ -0,0 +1,98 @@
+---
+id: 60a3e3396c7b40068ad6998f
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Mistatili ni ndogo sana na kingo zake hazina ubora laini wa mchoro.
+
+Ongeza eneo na ulainishe kingo za `.one` kwa kuweka `box-shadow` kuwa `0 0 3px 3px #efb762`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `box-shadow` kuwa `0 0 3px 3px #efb762`.
+
+```js
+const hasBoxShadow = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['box-shadow'] === 'rgb(239, 183, 98) 0px 0px 3px 3px');
+assert(hasBoxShadow);
+```
+
+Kipengele chako cha `.one` kinapaswa kuwa na thamani ya `box-shadow` ya `0 0 3px 3px #efb762`.
+
+```js
+const oneShadow = new __helpers.CSSHelp(document).getStyle('.one')?.getPropertyValue('box-shadow');
+assert(oneShadow === 'rgb(239, 183, 98) 0px 0px 3px 3px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69990.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69990.md
new file mode 100644
index 00000000000..4731b7d9dd9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69990.md
@@ -0,0 +1,97 @@
+---
+id: 60a3e3396c7b40068ad69990
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Tumia tamko sawa la `box-shadow` kwa `.two`, lakini ubadilishe rangi kutoka `#efb762` hadi `#8f0401`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `box-shadow` kuwa `0 0 3px 3px #8f0401`.
+
+```js
+const hasBoxShadow = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['box-shadow'] === 'rgb(143, 4, 1) 0px 0px 3px 3px');
+assert(hasBoxShadow);
+```
+
+Kipengele chako cha `.two` kinapaswa kuwa na thamani ya `box-shadow` ya `0 0 3px 3px #8f0401`.
+
+```js
+const twoShadow = new __helpers.CSSHelp(document).getStyle('.two')?.getPropertyValue('box-shadow');
+assert(twoShadow === 'rgb(143, 4, 1) 0px 0px 3px 3px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69991.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69991.md
new file mode 100644
index 00000000000..81fd3349b0a
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69991.md
@@ -0,0 +1,98 @@
+---
+id: 60a3e3396c7b40068ad69991
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Ongeza `box-shadow` kwa `.three` yenye thamani `0 0 5px 5px #b20403`.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `box-shadow` kuwa `0 0 5px 5px #b20403`.
+
+```js
+const hasBoxShadow = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['box-shadow'] === 'rgb(178, 4, 3) 0px 0px 5px 5px');
+assert(hasBoxShadow);
+```
+
+Kipengele chako cha `.three` kinapaswa kuwa na thamani ya `box-shadow` ya `0 0 5px 5px #b20403`.
+
+```js
+const threeShadow = new __helpers.CSSHelp(document).getStyle('.three')?.getPropertyValue('box-shadow');
+assert(threeShadow === 'rgb(178, 4, 3) 0px 0px 5px 5px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+ box-shadow: 0 0 3px 3px #8f0401;
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69992.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69992.md
new file mode 100644
index 00000000000..f3d408982f4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69992.md
@@ -0,0 +1,101 @@
+---
+id: 60a3e3396c7b40068ad69992
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Pembe za kila mstatili bado ni kali sana.
+
+Zungusha kila kona ya kipengele cha `.one` kwa pikseli 9, ukitumia kipengele cha `border-radius`.
+
+# --hints--
+
+Unapaswa kuweka sifa cha `border-radius` kuwa `9px`.
+
+```js
+const hasBorderRadius = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['border-radius'] === '9px');
+assert(hasBorderRadius);
+```
+
+Kipengele chako cha `.one` kinapaswa kuwa na thamani ya `border-radius` ya `9px`.
+
+```js
+const oneBorderRadius =new __helpers.CSSHelp(document).getStyle('.one')?.getPropertyValue('border-radius');
+assert(oneBorderRadius === '9px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+ box-shadow: 0 0 3px 3px #8f0401;
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+ box-shadow: 0 0 5px 5px #b20403;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69993.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69993.md
new file mode 100644
index 00000000000..934c4a5f729
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69993.md
@@ -0,0 +1,100 @@
+---
+id: 60a3e3396c7b40068ad69993
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Tumia sifa ya `border-radius` kwenye kichaguzi cha `.two`, ili kuweka radius yake ya juu-kushoto na radius ya chini kulia kuwa `8px`, na radius ya juu-kulia na radius ya chini-kushoto kuwa `10px`.
+
+# --hints--
+
+Unapaswa kuweka sifa cha `border-radius` kuwa `8px 10px`.
+
+```js
+const hasBorderRadius = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['border-radius'] === '8px 10px');
+assert(hasBorderRadius);
+```
+
+Kipengele chako cha `.two` kinapaswa kuwa na thamani ya `border-radius` ya `8px 10px`.
+
+```js
+const twoBorderRadius = new __helpers.CSSHelp(document).getStyle('.two')?.getPropertyValue('border-radius');
+assert(twoBorderRadius === '8px 10px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+ border-radius: 9px;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+ box-shadow: 0 0 3px 3px #8f0401;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+ box-shadow: 0 0 5px 5px #b20403;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69994.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69994.md
new file mode 100644
index 00000000000..471d5077154
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69994.md
@@ -0,0 +1,103 @@
+---
+id: 60a3e3396c7b40068ad69994
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Sifa ya `border-radius` inakubali hadi thamani nne ili kuzungusha pembe za juu-kushoto, juu-kulia, chini-kulia na chini-kushoto.
+
+Zungusha kona ya juu kushoto ya `.three` kwa pikseli 30, juu kulia kwa pikseli 25, chini kulia kwa pikseli 60, na chini kushoto kwa pikseli 12.
+
+# --hints--
+
+Unapaswa kuweka sifa cha `border-radius` kuwa `30px 25px 60px 12px`.
+
+```js
+const hasBorderRadius = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style['border-radius'] === '30px 25px 60px 12px');
+assert(hasBorderRadius);
+```
+
+Kipengele chako cha `.three` kinapaswa kuwa na thamani ya `border-radius` ya `30px 25px 60px 12px`.
+
+```js
+const threeBorderRadius = new __helpers.CSSHelp(document).getStyle('.three')?.getPropertyValue('border-radius');
+assert(threeBorderRadius === '30px 25px 60px 12px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+ border-radius: 9px;
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+ box-shadow: 0 0 3px 3px #8f0401;
+ border-radius: 8px 10px;
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+ box-shadow: 0 0 5px 5px #b20403;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69995.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69995.md
new file mode 100644
index 00000000000..95006aca2c9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69995.md
@@ -0,0 +1,104 @@
+---
+id: 60a3e3396c7b40068ad69995
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Zungusha kila mstatili ili kuwapa mwonekano usio kamili, uliopakwa kwa mkono.
+
+Tumia kipengele cha `transform` kwenye kichaguzi cha `.one` ili kui `rotate` kinyume cha saa kwa digrii 0.6.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `transform` kuwa `rotate(-0.6deg)`.
+
+```js
+const hasTransform = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.transform === 'rotate(-0.6deg)');
+assert(hasTransform);
+```
+
+Kipengele chako cha `.one` kinapaswa kuwa na thamani ya `transform` ya `rotate(-0.6deg)`.
+
+```js
+const oneTransform = new __helpers.CSSHelp(document).getStyle('.one')?.getPropertyValue('transform');
+assert(oneTransform === 'rotate(-0.6deg)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+ border-radius: 9px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+ box-shadow: 0 0 3px 3px #8f0401;
+ border-radius: 8px 10px;
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+ box-shadow: 0 0 5px 5px #b20403;
+ border-radius: 30px 25px 60px 12px;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69996.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69996.md
new file mode 100644
index 00000000000..99321b9c741
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69996.md
@@ -0,0 +1,103 @@
+---
+id: 60a3e3396c7b40068ad69996
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Zungusha kipengele cha `.two` mwendo wa saa kwa digrii 0.4.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `transform` kuwa `rotate(0.4deg)`.
+
+```js
+const hasTransform = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.transform === 'rotate(0.4deg)');
+assert(hasTransform);
+```
+
+Kipengele chako cha `.two` kinapaswa kuwa na thamani ya `transform` ya `rotate(0.4deg)`.
+
+```js
+const twoTransform = new __helpers.CSSHelp(document).getStyle('.two')?.getPropertyValue('transform');
+assert(twoTransform === 'rotate(0.4deg)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+ border-radius: 9px;
+ transform: rotate(-0.6deg);
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+ box-shadow: 0 0 3px 3px #8f0401;
+ border-radius: 8px 10px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+ box-shadow: 0 0 5px 5px #b20403;
+ border-radius: 30px 25px 60px 12px;
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69997.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69997.md
new file mode 100644
index 00000000000..3879d183cd7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad69997.md
@@ -0,0 +1,180 @@
+---
+id: 60a3e3396c7b40068ad69997
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Zungusha kipengele cha `.three` kinyume cha saa kwa digrii 0.2.
+
+Kwa hatua hii ya mwisho, mchoro wako wa Rothko sasa umekamilika.
+
+# --hints--
+
+Unapaswa kuweka sifa ya `transform` kuwa `rotate(-0.2deg)`.
+
+```js
+const hasTransform = new __helpers.CSSHelp(document).getCSSRules().some(x => x.style.transform === 'rotate(-0.2deg)');
+assert(hasTransform);
+```
+
+Kipengele chako cha `.three` kinapaswa kuwa na thamani ya `transform` ya `rotate(-0.2deg)`.
+
+```js
+const threeTransform = new __helpers.CSSHelp(document).getStyle('.three')?.getPropertyValue('transform');
+assert(threeTransform === 'rotate(-0.2deg)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+ border-radius: 9px;
+ transform: rotate(-0.6deg);
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+ box-shadow: 0 0 3px 3px #8f0401;
+ border-radius: 8px 10px;
+ transform: rotate(0.4deg);
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+ box-shadow: 0 0 5px 5px #b20403;
+ border-radius: 30px 25px 60px 12px;
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+```
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
+
+## --solutions--
+
+```html
+
+
+
+
+
Rothko Painting
+
+
+
+
+
+
+```
+
+```css
+.canvas {
+ width: 500px;
+ height: 600px;
+ background-color: #4d0f00;
+ overflow: hidden;
+ filter: blur(2px);
+}
+
+.frame {
+ border: 50px solid black;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+}
+
+.one {
+ width: 425px;
+ height: 150px;
+ background-color: #efb762;
+ margin: 20px auto;
+ box-shadow: 0 0 3px 3px #efb762;
+ border-radius: 9px;
+ transform: rotate(-0.6deg);
+}
+
+.two {
+ width: 475px;
+ height: 200px;
+ background-color: #8f0401;
+ margin: 0 auto 20px;
+ box-shadow: 0 0 3px 3px #8f0401;
+ border-radius: 8px 10px;
+ transform: rotate(0.4deg);
+}
+
+.one, .two {
+ filter: blur(1px);
+}
+
+.three {
+ width: 91%;
+ height: 28%;
+ background-color: #b20403;
+ margin: auto;
+ filter: blur(2px);
+ box-shadow: 0 0 5px 5px #b20403;
+ border-radius: 30px 25px 60px 12px;
+ transform: rotate(-0.2deg);
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f2abbe7d18d49a1e0e1c8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f2abbe7d18d49a1e0e1c8.md
new file mode 100644
index 00000000000..506022fb439
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f2abbe7d18d49a1e0e1c8.md
@@ -0,0 +1,57 @@
+---
+id: 615f2abbe7d18d49a1e0e1c8
+title: Hatua ya 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Tumekuandalia mfano wa msingi wa HTML.
+
+Unda kipengele cha `h1` ndani ya kipengele chako cha `body` na ukipe maandishi `Nutrition Facts`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele kipya cha `h1`.
+
+```js
+assert.exists(document.querySelector('h1'));
+```
+
+Kipengele chako cha `h1` kinapaswa kuwa ndani ya kipengele chako cha `body`.
+
+```js
+assert(document.querySelector('h1')?.parentElement?.localName === 'body');
+```
+
+Kipengele chako cha `h1` kinapaswa kuwa na maandishi `Nutrition Facts`.
+
+```js
+assert(document.querySelector('h1')?.innerText === 'Nutrition Facts');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f2d4150fe0d4cbd0f2628.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f2d4150fe0d4cbd0f2628.md
new file mode 100644
index 00000000000..6ec01e12e3c
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f2d4150fe0d4cbd0f2628.md
@@ -0,0 +1,62 @@
+---
+id: 615f2d4150fe0d4cbd0f2628
+title: Hatua ya 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Chini ya kipengele chako cha `h1`, ongeza kipengele cha `p` chenye maandishi `8 servings per container`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele kipya cha `p`.
+
+```js
+assert.exists(document.querySelector('p'));
+```
+
+Kipengele chako cha `p` kinapaswa kuwa ndani ya kipengele chako cha `body`.
+
+```js
+assert(document.querySelector('p')?.parentElement?.localName === 'body');
+```
+
+Kipengele chako cha `p` kinapaswa kuja baada ya kipengele chako cha `h1`.
+
+```js
+assert(document.querySelector('p')?.previousElementSibling?.localName === 'h1');
+```
+
+Kipengele chako cha `p` kinapaswa kuwa na maandishi `8 servings per container`.
+
+```js
+assert(document.querySelector('p')?.innerText === '8 servings per container');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+
+
+
Nutrition Label
+
+
+
+
Nutrition Facts
+
+
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f34948891834dd77655a6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f34948891834dd77655a6.md
new file mode 100644
index 00000000000..eb287d5561d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f34948891834dd77655a6.md
@@ -0,0 +1,63 @@
+---
+id: 615f34948891834dd77655a6
+title: Hatua ya 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Ongeza kipengele cha pili cha `p` chenye maandishi `Serving size 2/3 cup (55g)`.
+
+# --hints--
+
+Unapaswa kuongeza kipengele cha pili cha `p`.
+
+```js
+assert(document.querySelectorAll('p')?.length === 2);
+```
+
+Kipengele chako cha pili cha `p` kinapaswa kuwa ndani ya kipengele chako cha `body`.
+
+```js
+assert(document.querySelectorAll('p')?.[1]?.parentElement?.localName === 'body');
+```
+
+Kipengele chako cha pili cha `p` kinapaswa kuja baada ya kipengele chako cha `p` kilichopo.
+
+```js
+assert(document.querySelectorAll('p')?.[1]?.previousElementSibling?.localName === 'p');
+```
+
+Kipengele chako cha pili cha `p` kinapaswa kuwa na maandishi `Serving size 2/3 cup (55g)`.
+
+```js
+assert(document.querySelectorAll('p')?.[1]?.innerText === 'Serving size 2/3 cup (55g)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+
+
+
Nutrition Label
+
+
+
+
Nutrition Facts
+
8 servings per container
+
+
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f34ecc1091b4fd5a8a484.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f34ecc1091b4fd5a8a484.md
new file mode 100644
index 00000000000..4054e93916e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f34ecc1091b4fd5a8a484.md
@@ -0,0 +1,70 @@
+---
+id: 615f34ecc1091b4fd5a8a484
+title: Hatua ya 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `head`, ongeza kipengele cha `link` chenye sifa ya `rel` iliyowekwa kuwa `stylesheet` na sifa ya `href` iliyowekwa kuwa `https://fonts.googleapis.com/css?family=Open+Sans:400,700,800`.
+
+Hii italeta familia ya fonti ya `Open Sans`, yenye thamani za uzito wa fonti `400`, `700` na `800`.
+
+Pia ongeza kipengele cha `link` ili kuunganisha faili yako ya `styles.css`.
+
+# --hints--
+
+Msimbo wako unapaswa kuwa na vipengele viwili vya kujifunga vya `link`.
+
+```js
+assert(document.querySelectorAll('link').length === 2);
+```
+
+Vipengele vyako vyote viwili vya `link` vinapaswa kuwa na sifa ya `rel` iliyowekwa kuwa `stylesheet`.
+
+```js
+const links = [...document.querySelectorAll('link')];
+assert(links.every(link => link.getAttribute('rel') === 'stylesheet'));
+```
+
+Moja ya vipengele vyako vya `link` lazima kiwe na sifa ya `href` yenye thamani `./styles.css`.
+
+```js
+assert(code.match(/
link?.getAttribute('href') === 'https://fonts.googleapis.com/css?family=Open+Sans:400,700,800'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+--fcc-editable-region--
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f357957e370510f21ea16.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f357957e370510f21ea16.md
new file mode 100644
index 00000000000..f9ff9f7925f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f357957e370510f21ea16.md
@@ -0,0 +1,55 @@
+---
+id: 615f357957e370510f21ea16
+title: Hatua ya 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Unda kichaguzi cha `body`, na uweke sifa ya `font-family` kuwa `Open Sans` na njia mbadala ya `sans-serif`.
+
+Kumbuka kwamba fonti zilizo na nafasi katika jina lazima zifungwe kwa nukuu za CSS.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `body`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body'));
+```
+
+Kichaguzi chako cha `body` kinafaa kuwa na sifa ya `font-family` yenye thamani ya `"Open Sans", sans-serif`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('body')?.fontFamily === '"Open Sans", sans-serif');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f378014c2da526a109c81.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f378014c2da526a109c81.md
new file mode 100644
index 00000000000..96283a2d5d2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f378014c2da526a109c81.md
@@ -0,0 +1,57 @@
+---
+id: 615f378014c2da526a109c81
+title: Hatua ya 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Fonti ni ndogo kidogo. Unda kichaguzi cha `html` na uweke fonti kuwa na ukubwa wa `16px`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `html`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html'));
+```
+
+Kichaguzi chako cha `html` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `16px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html')?.fontSize === '16px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f38279e5c3d53692ea441.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f38279e5c3d53692ea441.md
new file mode 100644
index 00000000000..11d1850b55d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f38279e5c3d53692ea441.md
@@ -0,0 +1,66 @@
+---
+id: 615f38279e5c3d53692ea441
+title: Hatua ya 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Funga vipengee vyako vya `h1` na `p` ndani ya kipengele cha `div`. Ipe `div` sifa ya `class` iliyowekwa kuwa `label`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+assert(document.querySelector('div'));
+```
+
+Kipengele chako cha kipya cha `div` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `label`.
+
+```js
+assert(document.querySelector('div')?.classList?.contains('label'));
+```
+
+Vipengele vyako vya `h1` na `p` vinapaswa kuwa ndani ya kipengele chako kipya cha `.label`.
+
+```js
+const children = [...document.querySelectorAll('h1'), ...document.querySelectorAll('p')];
+assert(children?.every(child => child?.parentElement?.classList?.contains('label')));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+--fcc-editable-region--
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+--fcc-editable-region--
+
+```
+
+```css
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f38cabc64e3556f98cc1a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f38cabc64e3556f98cc1a.md
new file mode 100644
index 00000000000..54e76b21eb2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f38cabc64e3556f98cc1a.md
@@ -0,0 +1,65 @@
+---
+id: 615f38cabc64e3556f98cc1a
+title: Hatua ya 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Mipaka inaweza kutumika kupanga na kuweka kipaumbele maudhui.
+
+Unda kichaguzi cha `.label` na ukipe `border` iliyowekwa kuwa `2px solid black`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.label`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.label'));
+```
+
+Kichaguzi chako cha `.label` kinapaswa kuwa na sifa ya `border` iliyowekwa kuwa `2px solid black`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.label')?.border === '2px solid black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3949f58e12577dcefb00.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3949f58e12577dcefb00.md
new file mode 100644
index 00000000000..c5384fcf2db
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3949f58e12577dcefb00.md
@@ -0,0 +1,61 @@
+---
+id: 615f3949f58e12577dcefb00
+title: Hatua ya 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Matumizi mazuri ya nafasi nyeupe yanaweza kuleta umakini kwa vipengele muhimu vya ukurasa wako, na kusaidia kuelekeza macho ya mtumiaji wako kupitia maandishi yako.
+
+Kipe kichaguzi cha `.label` sifa ya `width` iliyowekwa kuwa `270px`.
+
+# --hints--
+
+Kichaguzi chako cha `.label` kinafaa kuwa na sifa ya `width` iliyowekwa kuwa `270px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.label')?.width === '270px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+--fcc-editable-region--
+.label {
+ border: 2px solid black;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f39d7da41b15851fa3fb9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f39d7da41b15851fa3fb9.md
new file mode 100644
index 00000000000..76aa14f86ba
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f39d7da41b15851fa3fb9.md
@@ -0,0 +1,66 @@
+---
+id: 615f39d7da41b15851fa3fb9
+title: Hatua ya 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Kipe kichaguzi cha `.label` sifa ya `margin` iliyowekwa kuwa `20px auto` na sifa ya `padding` iliyowekwa kuwa `0 7px`.
+
+# --hints--
+
+Kichaguzi chako cha `.label` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `20px auto`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.label')?.margin === '20px auto');
+```
+
+Kichaguzi chako cha `.label` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0 7px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.label')?.padding === '0px 7px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+--fcc-editable-region--
+.label {
+ border: 2px solid black;
+ width: 270px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3b091162165948e1cb33.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3b091162165948e1cb33.md
new file mode 100644
index 00000000000..e65019f730d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3b091162165948e1cb33.md
@@ -0,0 +1,72 @@
+---
+id: 615f3b091162165948e1cb33
+title: Hatua ya 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Ukikagua kipengele chako cha `.label` kwa zana za wasanidi za kivinjari chako, unaweza kugundua kuwa kina upana wa pikseli 288 badala ya 270. Hii ni kwa sababu, kwa chaguo-msingi, kivinjari kinajumuisha mpaka na pedi wakati wa kuamua ukubwa wa kipengele.
+
+Ili kusuluhisha hili, weka upya muundo wa kisanduku kwa kuunda kichaguzi cha `*` na ukipe `box-sizing` ya `border-box`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `*`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*'));
+```
+
+Kichaguzi chako cha `*` kinafaa kuwa na sifa ya `box-sizing` iliyowekwa kuwa `border-box`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*')?.boxSizing === 'border-box');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3cafd794015aa9547a6d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3cafd794015aa9547a6d.md
new file mode 100644
index 00000000000..ca47c2d4ba7
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3cafd794015aa9547a6d.md
@@ -0,0 +1,76 @@
+---
+id: 615f3cafd794015aa9547a6d
+title: Hatua ya 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Kumbuka kwamba matumizi ya `h1`, `h2`, na tagi zinazofanana huamua muundo wa kisemantiki wa HTML yako. Hata hivyo, unaweza kurekebisha CSS ya vipengele hivi ili kudhibiti mtiririko na muundo wa kuonekana.
+
+Unda sheria ya `h1` na uweke sifa ya `font-weight` kuwa `800`. Hii itafanya maandishi yako ya `h1` kuwa mazito zaidi (bolder).
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `h1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1'));
+```
+
+Kichaguzi chako cha `h1` kinafaa kuwa na sifa ya `font-weight` iliyowekwa kuwa `800`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.fontWeight === '800');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3d9e59db4b5b8e960762.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3d9e59db4b5b8e960762.md
new file mode 100644
index 00000000000..d3823820fd1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3d9e59db4b5b8e960762.md
@@ -0,0 +1,70 @@
+---
+id: 615f3d9e59db4b5b8e960762
+title: Hatua ya 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Kipe kichaguzi chako cha `h1` sifa ya `text-align` ya `center`.
+
+# --hints--
+
+Kichaguzi chako cha `h1` kinafaa kuwa na sifa ya `text-align` iliyowekwa kuwa `center`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.textAlign === 'center');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+--fcc-editable-region--
+h1 {
+ font-weight: 800;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3e1b7233ee5c7595771f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3e1b7233ee5c7595771f.md
new file mode 100644
index 00000000000..25a5212f50d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3e1b7233ee5c7595771f.md
@@ -0,0 +1,71 @@
+---
+id: 615f3e1b7233ee5c7595771f
+title: Hatua ya 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Rekebisha uwekaji wa `h1` yako kwa kuipa ukingo wa juu na chini wa `-4px` na ukingo wa kushoto na kulia wa `0`.
+
+# --hints--
+
+Kichaguzi chako cha `h1` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `-4px 0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.margin === '-4px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+--fcc-editable-region--
+h1 {
+ font-weight: 800;
+ text-align: center;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3e4af8008c5d494d3afe.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3e4af8008c5d494d3afe.md
new file mode 100644
index 00000000000..c7d7d377095
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3e4af8008c5d494d3afe.md
@@ -0,0 +1,80 @@
+---
+id: 615f3e4af8008c5d494d3afe
+title: Hatua ya 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Unda kichaguzi cha `p` na uondoe pambizo zote.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `p`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('p'));
+```
+
+Kichaguzi chako cha `p` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('p')?.margin === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+h1 {
+ font-weight: 800;
+ text-align: center;
+ margin: -4px 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3ed16592445e57941aec.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3ed16592445e57941aec.md
new file mode 100644
index 00000000000..eb8910895dc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3ed16592445e57941aec.md
@@ -0,0 +1,96 @@
+---
+id: 615f3ed16592445e57941aec
+title: Hatua ya 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Mistari inaweza kusaidia kutenganisha na kupanga maudhui muhimu, hasa wakati nafasi ni chache.
+
+Unda kipengele cha `div` chini ya kipengele chako `h1` na ukipe sifa ya `class` iliyowekwa kuwa `divider`.
+
+# --hints--
+
+Unapaswa kuunda `div` mpya.
+
+```js
+assert(document.querySelectorAll('div')?.length === 2);
+```
+
+`div` yako mpya inafaa kuwa na sifa ya `class` iliyowekwa kuwa `divider`.
+
+```js
+assert(document.querySelectorAll('div')?.[1]?.classList?.contains('divider'));
+```
+
+Kipengele chako cha `.divider` kinapaswa kuwa ndani ya kipengele chako cha `.label`.
+
+```js
+assert(document.querySelector('.label')?.querySelector('.divider'));
+```
+
+Kipengele chako cha `.divider` kinapaswa kuja baada ya kipengele chako cha `h1`.
+
+```js
+assert(document.querySelector('.divider')?.previousElementSibling?.localName === 'h1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+--fcc-editable-region--
+
+
Nutrition Facts
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+--fcc-editable-region--
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+h1 {
+ font-weight: 800;
+ text-align: center;
+ margin: -4px 0;
+}
+
+p {
+ margin: 0;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f405b89a7ec5f8e2d11f4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f405b89a7ec5f8e2d11f4.md
new file mode 100644
index 00000000000..c4014b09040
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f405b89a7ec5f8e2d11f4.md
@@ -0,0 +1,91 @@
+---
+id: 615f405b89a7ec5f8e2d11f4
+title: Hatua ya 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Unda kichaguzi chako kipya cha `.divider` na uweke `border-bottom` kuwa `1px solid #888989`. Pia ipe ukingo wa juu na chini wa `2px`. Haipaswi kuwa na ukingo wowote wa kushoto au kulia.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.divider`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.divider'));
+```
+
+Kichaguzi chako cha `.divider` kinapaswa kuwa na sifa ya `border-bottom` iliyowekwa kuwa `1px solid #888989`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.divider')?.borderBottom === '1px solid rgb(136, 137, 137)');
+```
+
+Kichaguzi chako cha `.divider` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `2px 0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.divider')?.margin === '2px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+h1 {
+ font-weight: 800;
+ text-align: center;
+ margin: -4px 0;
+}
+
+p {
+ margin: 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f40b01f680e608d360ed4.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f40b01f680e608d360ed4.md
new file mode 100644
index 00000000000..5e45ce268ab
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f40b01f680e608d360ed4.md
@@ -0,0 +1,84 @@
+---
+id: 615f40b01f680e608d360ed4
+title: Hatua ya 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Kipengele cha `letter-spacing` kinaweza kutumika kurekebisha nafasi kati ya kila herufi ya maandishi katika kipengele.
+
+Kipe kichaguzi chako cha `h1` `letter-spacing` iliyowekwa `0.15px` ili kuzitenganisha kidogo.
+
+# --hints--
+
+Kichaguzi chako cha `h1` kinafaa kuwa na sifa ya `letter-spacing` iliyowekwa kuwa `0.15px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.letterSpacing === '0.15px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+--fcc-editable-region--
+h1 {
+ font-weight: 800;
+ text-align: center;
+ margin: -4px 0;
+}
+--fcc-editable-region--
+
+p {
+ margin: 0;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4172e9eec061d6456221.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4172e9eec061d6456221.md
new file mode 100644
index 00000000000..f22b736670b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4172e9eec061d6456221.md
@@ -0,0 +1,91 @@
+---
+id: 615f4172e9eec061d6456221
+title: Hatua ya 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Lebo za lishe zina maandishi mengi mazito ili kuvutia habari muhimu. Badala ya kulenga kila kipengele kinachohitaji kuwa na uzito, ni bora zaidi kutumia darasa kutumia mtindo wa uzito kwa kila kipengele.
+
+Kipe kipengele chako cha pili cha `p` sifa ya `class` iliyowekwa kuwa `bold`.
+
+# --hints--
+
+Kipengele chako cha pili cha `p` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelectorAll('p')?.[1]?.classList?.contains('bold'));
+```
+
+Kipengele chako cha kwanza cha `p` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(!document.querySelector('p')?.classList?.contains('bold'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+--fcc-editable-region--
+
+
Nutrition Facts
+
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+--fcc-editable-region--
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+h1 {
+ font-weight: 800;
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px;
+}
+
+p {
+ margin: 0;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f41c979787462e76dab90.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f41c979787462e76dab90.md
new file mode 100644
index 00000000000..69ec8c79309
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f41c979787462e76dab90.md
@@ -0,0 +1,104 @@
+---
+id: 615f41c979787462e76dab90
+title: Hatua ya 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Darasa lako jipya bado halina mtindo wowote. Unda kichaguzi cha `.bold` na ukipe `font-weight` iliyowekwa kuwa `800` ili kufanya maandishi kuwa ya mazito.
+
+Endelea na uondoe kipengele cha `font-weight` kutoka kwa kichaguzi chako cha `h1` pia.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.bold`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.bold'));
+```
+
+Kichaguzi chako cha `.bold` kinafaa kuwa na sifa ya `font-weight` iliyowekwa kuwa `800`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.bold')?.fontWeight === '800');
+```
+
+Kichaguzi chako cha `h1` hakipaswi kuwa na sifa ya `font-weight`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1')?.fontWeight === "");
+```
+
+Hupaswi kuondoa kichaguzi chako cha `h1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('h1'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+--fcc-editable-region--
+h1 {
+ font-weight: 800;
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px;
+}
+
+p {
+ margin: 0;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f423cf65d5864132a0956.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f423cf65d5864132a0956.md
new file mode 100644
index 00000000000..7dfbfd704ae
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f423cf65d5864132a0956.md
@@ -0,0 +1,86 @@
+---
+id: 615f423cf65d5864132a0956
+title: Hatua ya 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Kipe kipengele cha `h1` sifa ya `class` iliyowekwa kuwa `bold`. Hii itafanya maandishi kuwa mazito tena.
+
+# --hints--
+
+Kipengele chako cha `h1` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('h1')?.classList?.contains('bold'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+--fcc-editable-region--
+
+
Nutrition Facts
+
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+--fcc-editable-region--
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f42a021625f656101ef93.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f42a021625f656101ef93.md
new file mode 100644
index 00000000000..550f811bd1d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f42a021625f656101ef93.md
@@ -0,0 +1,100 @@
+---
+id: 615f42a021625f656101ef93
+title: Hatua ya 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Umbali wa usawa kati ya vipengele vinavyofanana unasaidia kuongeza uwezo wa kusoma maandishi yako.
+
+Funga maandishi `2/3 cup (55g)` ndani ya kipengele cha `span`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kimoja cha `span`.
+
+```js
+assert(document.querySelector('span'));
+```
+
+Kipengele chako cha `span` kinapaswa kuwa na maandishi `2/3 cup (55g)`.
+
+```js
+assert(document.querySelector('span')?.textContent?.trim() === '2/3 cup (55g)');
+```
+
+Kipengele chako cha `p` bado kinapaswa kuwa na maandishi `Serving size 2/3 cup (55g)`.
+
+```js
+assert(document.querySelectorAll('p')?.[1]?.innerText === 'Serving size 2/3 cup (55g)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+--fcc-editable-region--
+
+
Nutrition Facts
+
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+--fcc-editable-region--
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4bfb9de4a16703b56eb6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4bfb9de4a16703b56eb6.md
new file mode 100644
index 00000000000..16d54c48cb9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4bfb9de4a16703b56eb6.md
@@ -0,0 +1,92 @@
+---
+id: 615f4bfb9de4a16703b56eb6
+title: Hatua ya 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Sasa tunaweza kuongeza nafasi mlalo kwa kutumia `flex`. Katika kichaguzi chako cha `p`, ongeza sifa ya `display` iliyowekwa kuwa `flex` na sifa ya `justify-content` iliyowekwa kuwa `space-between`.
+
+# --hints--
+
+Kichaguzi chako cha `p` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `flex`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('p')?.display === 'flex');
+```
+
+Kichaguzi chako cha `p` kinapaswa kuwa na sifa ya `justify-content` iliyowekwa kuwa `space-between`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('p')?.justifyContent === 'space-between');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
Nutrition Facts
+
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+--fcc-editable-region--
+p {
+ margin: 0;
+}
+--fcc-editable-region--
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4ce9d877b668417c0c42.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4ce9d877b668417c0c42.md
new file mode 100644
index 00000000000..d880525fea0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4ce9d877b668417c0c42.md
@@ -0,0 +1,104 @@
+---
+id: 615f4ce9d877b668417c0c42
+title: Hatua ya 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Funga kila kitu ndani ya kipengele cha `.label` katika kipengele kipya cha `header`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `header`.
+
+```js
+assert(document.querySelector('header'));
+```
+
+Kipengele chako cha `header` kinapaswa kuwa ndani ya kipengele chako cha `.label`.
+
+```js
+assert(document.querySelector('header')?.parentElement?.classList?.contains('label'));
+```
+
+Vipengele vyako vya `h1`, `div` na `p` vinapaswa kuwa ndani ya kipengele chako kipya cha `header`.
+
+```js
+const children = document.querySelector('header')?.children;
+assert(children?.[0]?.localName === 'h1');
+assert(children?.[1]?.localName === 'div');
+assert(children?.[2]?.localName === 'p');
+assert(children?.[3]?.localName === 'p');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+--fcc-editable-region--
+
+
Nutrition Facts
+
+
8 servings per container
+
Serving size 2/3 cup (55g)
+
+--fcc-editable-region--
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4dde9d72e3694cb9ee3b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4dde9d72e3694cb9ee3b.md
new file mode 100644
index 00000000000..c8fa9137edc
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4dde9d72e3694cb9ee3b.md
@@ -0,0 +1,105 @@
+---
+id: 615f4dde9d72e3694cb9ee3b
+title: Hatua ya 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Sasa sasisha kichaguzi chako cha `h1` kuwa `header h1` ili kulenga kipengee chako cha `h1` ndani ya `header` yako mpya.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `header h1`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('header h1'));
+```
+
+Hupaswi kuwa na kichaguzi cha `h1`.
+
+```js
+assert.isNull(new __helpers.CSSHelp(document).getStyle('h1'));
+```
+
+Haupaswi kubadilisha sifa zozote kwenye kichaguzi.
+
+```js
+const style = new __helpers.CSSHelp(document).getStyle('header h1');
+assert(style?.textAlign === 'center');
+assert(style?.margin === '-4px 0px');
+assert(style?.letterSpacing === '0.15px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+--fcc-editable-region--
+h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+--fcc-editable-region--
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4ec58334106a4170c2a8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4ec58334106a4170c2a8.md
new file mode 100644
index 00000000000..f82b5239ae0
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4ec58334106a4170c2a8.md
@@ -0,0 +1,105 @@
+---
+id: 615f4ec58334106a4170c2a8
+title: Hatua ya 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Unda kipengele kipya cha `div` chini ya kipengele chako `header` na ukipe sifa ya `class` iliyowekwa kuwa `divider large`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div`.
+
+```js
+assert(document.querySelectorAll('div')?.length === 3);
+```
+
+Kipengele chako kipya cha `div` kinafaa kuja baada ya kipengele chako cha `header`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.localName === 'div');
+```
+
+Kipengele chako cha `div` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider large`.
+
+```js
+const div = document.querySelector('.label')?.lastElementChild;
+assert(div?.classList?.contains('divider'));
+assert(div?.classList?.contains('large'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4f9e4a40566b776a8f38.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4f9e4a40566b776a8f38.md
new file mode 100644
index 00000000000..200bd60532f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f4f9e4a40566b776a8f38.md
@@ -0,0 +1,111 @@
+---
+id: 615f4f9e4a40566b776a8f38
+title: Hatua ya 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Unda kichaguzi kipya cha `.large` na ukipe sifa ya `height` iliyowekwa kuwa `10px`. Pia unda kichaguzi cha `.large, .medium` na uweke `background-color` kuwa `black`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi kipya cha `.large`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.large'));
+```
+
+Kichaguzi chako cha `.large` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `10px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.large')?.height === '10px');
+```
+
+Unapaswa kuwa na kichaguzi cha `.large, .medium`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.large, .medium'));
+```
+
+Kichaguzi chako cha `.large, .medium` kinafaa kuwa na sifa ya `background-color` iliyowekwa kuwa `black`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.large, .medium')?.backgroundColor === 'black');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f50473cc0196c6dd3892a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f50473cc0196c6dd3892a.md
new file mode 100644
index 00000000000..ae5f2c9755b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f50473cc0196c6dd3892a.md
@@ -0,0 +1,101 @@
+---
+id: 615f50473cc0196c6dd3892a
+title: Hatua ya 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Unaweza kuona bado kuna mpaka mdogo chini ya kipengele chako cha `.large`. Ili kuweka upya hii, kipe kichaguzi chako cha `.large, .medium` `border` iliyowekwa kuwa `0`.
+
+Kumbuka: darasa la `medium`(medium) litatumika baadaye kwa sehemu nyembamba za lebo ya lishe.
+
+# --hints--
+
+Kichaguzi chako cha `.large, .medium` kinafaa kuwa na sifa ya `border` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.large, .medium')?.borderWidth === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+--fcc-editable-region--
+.large, .medium {
+ background-color: black;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f51257a8a516d80b6c743.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f51257a8a516d80b6c743.md
new file mode 100644
index 00000000000..5a5155df58b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f51257a8a516d80b6c743.md
@@ -0,0 +1,113 @@
+---
+id: 615f51257a8a516d80b6c743
+title: Hatua ya 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Unda `div` mpya chini ya kipengele chako cha `.large` na ukipe sifa ya `class` iliyowekwa kuwa `calories-info`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kingine cha `div`.
+
+```js
+assert(document.querySelectorAll('div')?.length === 4);
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `calories-info`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.classList?.contains('calories-info'));
+```
+
+`div` yako mpya inapaswa kuja baada ya kipengele cha `.large`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.previousElementSibling?.classList?.contains('large'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f51e4e5b24a6e80eccce1.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f51e4e5b24a6e80eccce1.md
new file mode 100644
index 00000000000..ed8da2c5208
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f51e4e5b24a6e80eccce1.md
@@ -0,0 +1,128 @@
+---
+id: 615f51e4e5b24a6e80eccce1
+title: Hatua ya 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Ndani ya kipengele chako cha `.calories-info`, tengeneza kipengele cha `div`. Kipe kipengele hicho cha `div` sifa ya `class` iliyowekwa kuwa `left-container`. Ndani ya kipengele kipya cha `div`, unda kipengele cha `h2` chenye maandishi `Amount per serving`. Kipe kipengele cha `h2` sifa ya `class` iliyowekwa kuwa `bold small-text`.
+
+# --hints--
+
+Unapaswa kuwa na kipengele kipya cha `div` ndani ya kipengele chako cha `.calories-info`.
+
+```js
+assert(document.querySelector('.calories-info')?.children?.[0]?.localName === 'div');
+```
+
+Kipengele chako kipya cha `div` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `left-container`.
+
+```js
+assert(document.querySelector('.calories-info')?.children?.[0]?.classList.contains('left-container'));
+```
+
+Unapaswa kuunda kipengele kipya cha `h2` ndani ya kipengele chako cha `.left-container`.
+
+```js
+assert(document.querySelector('.left-container')?.children?.[0]?.localName === 'h2');
+```
+
+Kipengele chako kipya cha `h2` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `bold small-text`.
+
+```js
+assert(document.querySelector('.left-container')?.children?.[0]?.classList.contains('bold'));
+assert(document.querySelector('.left-container')?.children?.[0]?.classList.contains('small-text'));
+```
+
+Kipengele chako kipya cha `h2` kinafaa kuwa na maandishi `Amount per serving`.
+
+```js
+assert(document.querySelector('.left-container')?.children?.[0]?.innerText === 'Amount per serving');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f522dea4f776f64dc3e91.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f522dea4f776f64dc3e91.md
new file mode 100644
index 00000000000..8cb363a69c2
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f522dea4f776f64dc3e91.md
@@ -0,0 +1,115 @@
+---
+id: 615f522dea4f776f64dc3e91
+title: Hatua ya 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Kitengo cha `rem` kinasimama `root em`, na kinahusiana na saizi ya fonti ya kipengele cha `html`.
+
+Unda kichaguzi cha `.small-text` na uweke `font-size` kuwa `0.85rem`, ambayo itakokotoa hadi takriban `13.6px` (kumbuka kwamba uliweka `html` yako kuwa na `font-size` ya `16px`).
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.small-text`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.small-text'));
+```
+
+Kichaguzi chako cha `.small-text` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `0.85rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.small-text')?.fontSize === '0.85rem');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5486b8fd4b71633f69b0.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5486b8fd4b71633f69b0.md
new file mode 100644
index 00000000000..9a4b10fd35d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5486b8fd4b71633f69b0.md
@@ -0,0 +1,143 @@
+---
+id: 615f5486b8fd4b71633f69b0
+title: Hatua ya 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Chini ya kipengele chako cha `.small-text`, unda kipengele kipya cha `p` chenye class ya `Calories`. Pia chini ya kipengele cha `.left-container`, unda kipengele kipya cha `span` chenye maandishi `230`.
+
+# --hints--
+
+Unapaswa kuwa na kipengele kipya cha `p` ndani ya kipengele chako cha `.calories-info`.
+
+```js
+assert(document.querySelector('.calories-info')?.querySelector('p'))
+```
+
+Unapaswa kuwa na kipengele kipya cha `span` ndani ya kipengele chako cha `.calories-info`.
+
+```js
+assert(document.querySelector('.calories-info')?.querySelector('span'))
+```
+
+Kipengele chako cha `p` kinapaswa kuja baada ya kipengele chako cha `.small-text`.
+
+```js
+assert(document.querySelector('.small-text')?.nextElementSibling?.localName === 'p');
+```
+
+Kipengele chako cha `span` kinapaswa kuja baada ya kipengele chako cha `.left-container`.
+
+```js
+assert(document.querySelector('.left-container')?.nextElementSibling?.localName ==='span');
+```
+
+Kipengele chako cha `p` kinapaswa kuwa na maandishi `Calories`.
+
+```js
+assert(document.querySelector('.small-text')?.nextElementSibling?.innerText === 'Calories');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na maandishi `230`.
+
+```js
+assert(document.querySelector('.left-container')?.nextElementSibling?.innerText === '230');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+--fcc-editable-region--
+
+
+
Amount per serving
+
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f575b50b91e72af079480.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f575b50b91e72af079480.md
new file mode 100644
index 00000000000..fab3e7d817e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f575b50b91e72af079480.md
@@ -0,0 +1,144 @@
+---
+id: 615f575b50b91e72af079480
+title: Hatua ya 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Unda kichaguzi kipya cha `.left-container p` ukiweka ukingo wa juu na chini kuwa `-5px`, na ukingo wa kushoto na kulia kuwa `-2px`. Pia weka `font-size` kuwa `2em` na `font-weight` kuwa `700`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi kipya cha `.left-container p`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.left-container p'));
+```
+
+Kichaguzi chako kipya cha `.left-container p` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `-5px -2px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-container p')?.marginTop, '-5px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-container p')?.marginBottom, '-5px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-container p')?.marginLeft, '-2px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.left-container p')?.marginRight, '-2px');
+```
+
+Kichaguzi chako kipya cha `.left-container p` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `2em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.left-container p')?.fontSize === '2em');
+```
+
+Kichaguzi chako kipya cha `.left-container p` kinafaa kuwa na sifa ya `font-weight` iliyowekwa kuwa `700`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.left-container p')?.fontWeight === '700');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5af373a68e744a3c5a76.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5af373a68e744a3c5a76.md
new file mode 100644
index 00000000000..c922a02225e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5af373a68e744a3c5a76.md
@@ -0,0 +1,141 @@
+---
+id: 615f5af373a68e744a3c5a76
+title: Hatua ya 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Unda kichaguzi cha `.calories-info span`, weka `font-size` kuwa `2.4em` na `font-weight` kuwa `700`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.calories-info span`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info span'));
+```
+
+Kichaguzi chako cha `.calories-info span` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `2.4em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info span')?.fontSize === '2.4em');
+```
+
+Kichaguzi chako cha `.calories-info span` kinapaswa kuwa na sifa ya `font-weight` iliyowekwa kuwa `700`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info span')?.fontWeight === '700');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5fd85d0062761f288364.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5fd85d0062761f288364.md
new file mode 100644
index 00000000000..64d33b3ac4d
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5fd85d0062761f288364.md
@@ -0,0 +1,134 @@
+---
+id: 615f5fd85d0062761f288364
+title: Hatua ya 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Taipografia mara nyingi ni sanaa kuliko sayansi. Unaweza kulazimika kurekebisha vitu kama upatanishi hadi ionekane kuwa sawa.
+
+Kipe kichaguzi chako cha `.calories-info span` `margin` iliyowekwa kuwa `-7px -2px`. Hii itahamishia maandishi yako ya `230` mahali pake.
+
+# --hints--
+
+Kichaguzi chako cha `.calories-info span` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `-7px -2px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info span')?.margin === '-7px -2px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+--fcc-editable-region--
+.calories-info span {
+ font-size: 2.4em;
+ font-weight: 700;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f61338c8ca176d6445574.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f61338c8ca176d6445574.md
new file mode 100644
index 00000000000..6d402ea873e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f61338c8ca176d6445574.md
@@ -0,0 +1,141 @@
+---
+id: 615f61338c8ca176d6445574
+title: Hatua ya 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Chini ya kipengele chako cha `.calories-info`, ongeza `div` yenye sifa ya `class` iliyowekwa `divider medium`.
+
+# --hints--
+
+Unapaswa kuunda `div` mpya ndani ya kipengele chako cha `.label`.
+
+```js
+assert(document.querySelectorAll('.label > div')?.length === 3)
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider medium`. Div hii inapaswa kuwa kipengele cha mwisho katika kipengele chako cha `.label`.
+
+```js
+const div = document.querySelector('.label')?.lastElementChild;
+assert(div?.classList?.contains('divider') && div?.classList?.contains('medium'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f666ac5edea782feb7e75.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f666ac5edea782feb7e75.md
new file mode 100644
index 00000000000..8ab89350915
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f666ac5edea782feb7e75.md
@@ -0,0 +1,142 @@
+---
+id: 615f666ac5edea782feb7e75
+title: Hatua ya 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Unda kichaguzi kipya cha `.medium` na ukipe sifa ya `height` iliyowekwa kuwa `5px`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.medium`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.medium'));
+```
+
+Kichaguzi chako cha `.medium` kinafaa kuwa na sifa ya `height` iliyowekwa kuwa `5px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.medium')?.height === '5px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f671b6d1919792745aa5d.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f671b6d1919792745aa5d.md
new file mode 100644
index 00000000000..56e1c01c5a4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f671b6d1919792745aa5d.md
@@ -0,0 +1,167 @@
+---
+id: 615f671b6d1919792745aa5d
+title: Hatua ya 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Unda kipengele kipya cha `div` chini ya kipengele chako cha `.medium`. Ipe sifa ya `class` iliyowekwa kwa `daily-value small-text`. Ndani ya `div` hii mpya, ongeza kipengele cha `p` chenye maandishi `% Daily Value *`, na uweke sifa ya `class` kuwa `bold right`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div` baada ya kipengele chako cha `.medium`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.localName === 'div');
+assert(document.querySelector('.label')?.lastElementChild?.previousElementSibling?.classList?.contains('divider'));
+assert(document.querySelector('.label')?.lastElementChild?.previousElementSibling?.classList?.contains('medium'));
+```
+
+Kipengele chako kipya cha `div` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `daily-value small-text`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.classList?.contains('daily-value'));
+assert(document.querySelector('.label')?.lastElementChild?.classList?.contains('small-text'));
+```
+
+Kipengele chako kipya cha `div` kinafaa kuwa na kipengele cha `p`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.firstElementChild?.localName === 'p');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `% Daily Value *`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.firstElementChild?.textContent === '% Daily Value *');
+```
+
+Kipengele chako cha kipya cha `p` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `bold right`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.firstElementChild?.classList?.contains('bold'));
+assert(document.querySelector('.label')?.lastElementChild?.firstElementChild?.classList?.contains('right'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+ --fcc-editable-region--
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6823d0815b7a991f2a75.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6823d0815b7a991f2a75.md
new file mode 100644
index 00000000000..81baddba3c1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6823d0815b7a991f2a75.md
@@ -0,0 +1,157 @@
+---
+id: 615f6823d0815b7a991f2a75
+title: Hatua ya 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Tumia kipengele chako cha `.divider` kilichopo kama mfano ili kuongeza kigawanyaji kipya baada ya kipengele cha `p`.
+
+# --hints--
+
+Unapaswa kuunda `div` mpya ndani ya kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelectorAll('.daily-value.small-text > div')?.length === 1)
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text > div')?.classList?.contains('divider'))
+```
+
+Kipengele chako kipya cha `div` kinafaa kuja baada ya kipengele chako cha `p`.
+
+```js
+assert(document.querySelector('.daily-value.small-text > div')?.previousElementSibling?.localName === 'p');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6b2d164f81809efd9bdc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6b2d164f81809efd9bdc.md
new file mode 100644
index 00000000000..793e188a780
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6b2d164f81809efd9bdc.md
@@ -0,0 +1,188 @@
+---
+id: 615f6b2d164f81809efd9bdc
+title: Hatua ya 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Baada ya kipengele chako cha mwisho cha `.divider`, unda kipengele cha `p` na ukipe maandishi `Total Fat 8g 10%`. Funga maandishi `Total Fat` katika kipengele cha `span` chenye sifa ya `class` iliyowekwa kuwa `bold`. Funga maandishi `10%` katika kipengele kingine cha `span` chenye `class` ya `bold`. Hatimaye, weka kipengee cha `span` cha `Total Fat` na maandishi `8g` katika kipengele cha ziada cha `span` kwa ajili ya kupanga.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` mwisho wa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Total Fat 8g 10%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText?.match(/Total Fat[\s|\n]+8g[\s|\n]+10%/));
+```
+
+Kipengele chako cha `p` kinafaa kuwa na vipengele vitatu vya `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')?.length === 3);
+```
+
+Kipengele kimoja cha `span` kinapaswa kufungia maandishi `Total Fat`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('span > span')?.innerText === 'Total Fat');
+```
+
+Kipengele cha `span` cha `Total Fat` kinapaswa kuwa na `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('span > span')?.className === 'bold');
+```
+
+Kipengele cha `span` kinafaa kufungia maandishi `10%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('span + span')?.innerText === '10%');
+```
+
+Kipengele cha `span` cha `10%` kinapaswa kuwa na `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')?.[1]?.className === 'bold');
+```
+
+Kipengele cha `span` kinapaswa kuwa na maandishi `Total Fat 8g`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText?.match(/Total Fat[\s|\n]+8g/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6cc778f7698258467596.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6cc778f7698258467596.md
new file mode 100644
index 00000000000..79edc4f256b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6cc778f7698258467596.md
@@ -0,0 +1,172 @@
+---
+id: 615f6cc778f7698258467596
+title: Hatua ya 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Chini ya kipengele chako chenye maandishi ya `Total Fat`, unda kipengele kipya cha `p` chenye maandishi `Saturated Fat 1g 5%`. Funga `5%` katika `span` yenye sifa ya `class` iliyowekwa kuwa `bold`. Katika hali hii, hii inatosha kupanga asilimia kwa `5%`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` chini ya kipengele chako chenye maandishi ya `Total Fat`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.innerText.match(/Total Fat 8g\s*10%/));
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Saturated Fat 1g 5%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText.match(/Saturated Fat 1g\s*5%/));
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na kipengele cha `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.lastElementChild?.localName === 'span');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.lastElementChild?.classList?.contains('bold'));
+```
+
+Kipengele cha `span` kinafaa kufungia maandishi `5%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.lastElementChild?.innerText === "5%");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6fddaac1e083502d3e6a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6fddaac1e083502d3e6a.md
new file mode 100644
index 00000000000..d4457275d03
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6fddaac1e083502d3e6a.md
@@ -0,0 +1,148 @@
+---
+id: 615f6fddaac1e083502d3e6a
+title: Hatua ya 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Kipengele hiki kipya cha `p` kitahitaji kuingizwa ndani. Ipe `class` iliyowekwa kwa `indent`.
+
+# --hints--
+
+Kipengele chako cha `p` chenye maandishi `Saturated Fat 1g 5%` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `indent`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('indent'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f70077a4ff98424236c1e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f70077a4ff98424236c1e.md
new file mode 100644
index 00000000000..117ee3cc0d4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f70077a4ff98424236c1e.md
@@ -0,0 +1,156 @@
+---
+id: 615f70077a4ff98424236c1e
+title: Hatua ya 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Unda kichaguzi kipya cha `.indent` na ukipe sifa ya `margin-left` iliyowekwa kuwa `1em`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi kipya cha `.indent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.indent'));
+```
+
+Kichaguzi chako kipya cha `.indent` kinapaswa kuwa na sifa ya `margin-left` iliyowekwa kuwa `1em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.indent')?.marginLeft === '1em');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f72a872354a850d4f533e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f72a872354a850d4f533e.md
new file mode 100644
index 00000000000..0da2a50c5c5
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f72a872354a850d4f533e.md
@@ -0,0 +1,160 @@
+---
+id: 615f72a872354a850d4f533e
+title: Hatua ya 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Unda kichaguzi cha `.daily-value p` ili kulenga vipengele vyako vyote vya `p` katika sehemu ya `daily-value`. Kipe kichaguzi hiki kipya `border-bottom` iliyowekwa kuwa `1px solid #888989`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi kipya cha `.daily-value p`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.daily-value p'));
+```
+
+Kichaguzi chako cha `.daily-value p` kinapaswa kuwa na sifa ya `border-bottom` iliyowekwa kuwa `1px solid #888989`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.daily-value p')?.borderBottom === '1px solid rgb(136, 137, 137)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f74a71f1e498619e38ee8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f74a71f1e498619e38ee8.md
new file mode 100644
index 00000000000..3e1fe4dad8b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f74a71f1e498619e38ee8.md
@@ -0,0 +1,166 @@
+---
+id: 615f74a71f1e498619e38ee8
+title: Hatua ya 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Mipaka ya chini, chini ya vipengee vyako vya `% Daily Value *` na `Saturated Fat 1g 5%` haziongezi upana kamili wa lebo. Ongeza `no-divider` kwa vipengele hivi viwili vya `class`.
+
+# --hints--
+
+Kipengele chako cha `p` chenye maandishi `% Daily Value *` kinapaswa kuwa na `no-divider` iliyoongezwa kwenye sifa ya `class`. Usiondoe madarasa yaliyopo.
+
+```js
+const p = document.querySelector('.daily-value.small-text')?.firstElementChild;
+assert(p?.classList?.contains('no-divider'));
+assert(p?.classList?.contains('bold'));
+```
+
+Kipengele chako cha `p` chenye maandishi `Saturated Fat 1g 5%` kinapaswa kuwa na `no-divider` iliyoongezwa kwenye sifa ya `class`. Usiondoe madarasa yaliyopo.
+
+```js
+const p = document.querySelector('.daily-value.small-text')?.lastElementChild;
+assert(p?.classList?.contains('no-divider'));
+assert(p?.classList?.contains('indent'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7ad94380408d971d14f6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7ad94380408d971d14f6.md
new file mode 100644
index 00000000000..48225d3e239
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7ad94380408d971d14f6.md
@@ -0,0 +1,181 @@
+---
+id: 615f7ad94380408d971d14f6
+title: Hatua ya 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Pseudo-selector ya `:not` inaweza kutumika kuchagua vipengele vyote ambavyo havilingani na sheria ya CSS.
+
+```css
+div:not(#example) {
+ color: red;
+}
+```
+
+Yaliyo hapo juu huchagua vipengele vyote vya `div` visivyo na `id` ya `example`.
+
+Rekebisha kichaguzi chako cha `.daily-value p` ili kutenga vipengele vya `.no-divider`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.daily-value p:not(.no-divider)`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.daily-value p:not(.no-divider)'));
+```
+
+Hupaswi kuwa na kichaguzi cha `.daily-value p`.
+
+```js
+assert(!new __helpers.CSSHelp(document).getStyle('.daily-value p'));
+```
+
+Hupaswi kubadilisha sifa katika kichaguzi cha `.daily-value p:not(.no-divider)`.
+
+```js
+const style = new __helpers.CSSHelp(document).getStyle('.daily-value p:not(.no-divider)');
+assert(style?.borderBottom === '1px solid rgb(136, 137, 137)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+--fcc-editable-region--
+.daily-value p {
+ border-bottom: 1px solid #888989;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7bc680f7168ea01ebf99.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7bc680f7168ea01ebf99.md
new file mode 100644
index 00000000000..12e583bc18f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7bc680f7168ea01ebf99.md
@@ -0,0 +1,165 @@
+---
+id: 615f7bc680f7168ea01ebf99
+title: Hatua ya 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+Sasa itabidi uongeze vigawanyiko tofauti chini ya vipengele vyako vya `.no-divider`.
+
+Kipengele chako cha kwanza cha `.no-divider` kina `.divider` baada yake. Unda `.divider` nyingine baada ya kipengele chako cha pili cha `.no-divider`.
+
+# --hints--
+
+Unapaswa kuunda `div` mpya mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'div');
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('divider'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7c71eab8218f846e4503.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7c71eab8218f846e4503.md
new file mode 100644
index 00000000000..2b2fa9a4ce1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7c71eab8218f846e4503.md
@@ -0,0 +1,196 @@
+---
+id: 615f7c71eab8218f846e4503
+title: Hatua ya 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Baada ya `.divider` yako ya mwisho, unda kipengele kingine cha `p` chenye maandishi `Trans Fat 0g`. Tariki neno `Trans` kwa kuifunga katika kipengele cha `i`. Kipe kipengele kipya cha `p` sifa ya `class` iliyowekwa kuwa `indent no-divider`. Funga `Trans Fat 0g` katika kipengele cha `span` ili kipangwe.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Trans Fat 0g`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText === 'Trans Fat 0g');
+```
+
+Kipengele chako cha `p` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `indent no-divider`.
+
+```js
+const p = document.querySelector('.daily-value.small-text')?.lastElementChild;
+assert(p?.classList?.contains('indent'));
+assert(p?.classList?.contains('no-divider'));
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na kipengele cha `i`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('i'));
+```
+
+Kipengele chako cha `i` kinapaswa kufunika maandishi `Trans`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('i')?.innerText === 'Trans');
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na kipengele cha `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('span'));
+```
+
+Kipengele chako cha `span` kinapaswa kufunika maandishi `Trans Fat 0g`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('span')?.innerText?.match(/Trans[\s|\n]+Fat 0g/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7d489a581590d1350288.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7d489a581590d1350288.md
new file mode 100644
index 00000000000..1eea051a33b
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7d489a581590d1350288.md
@@ -0,0 +1,165 @@
+---
+id: 615f7d489a581590d1350288
+title: Hatua ya 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Unda `.divider` nyingine baada ya kipengele chako cha mwisho cha `p`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `div` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'div');
+```
+
+Kipengele chako cha kipya cha `div` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('divider'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7de4487b64919bb4aa5e.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7de4487b64919bb4aa5e.md
new file mode 100644
index 00000000000..5774b1d5855
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7de4487b64919bb4aa5e.md
@@ -0,0 +1,213 @@
+---
+id: 615f7de4487b64919bb4aa5e
+title: Hatua ya 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Baada ya `.divider` yako ya mwisho, unda kipengele kipya cha `p` chenye maandishi `Cholesterol 0mg 0%`. Funga maandishi `Cholesterol` katika kipengele cha `span`, na ukipe kipengele hicho cha `span` `class` ya `bold`. Funga maandishi `0%` katika kipengele kingine cha `span`, chenye `class` ya `bold`. Hatimaye, weka kipengee cha `Cholesterol` `span` na maandishi `0mg` katika kipengele cha ziada cha `span` kwa ajili ya kupanga.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Cholesterol 0mg 0%`.
+
+```js
+const text = document.querySelector('.daily-value.small-text')?.lastElementChild?.textContent?.trim()?.replace(/\n/g, ' ')?.replace(/\s\s+/g, ' ');
+assert(text === 'Cholesterol 0mg 0%');
+```
+
+Kipengele chako cha `p` kinafaa kuwa na vipengele vitatu vya `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')?.length === 3);
+```
+
+Maandishi `Cholesterol` yanapaswa kuwekwa katika `span`.
+
+```js
+const spans = [...document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')];
+const cholesterolSpan = spans.filter(span => span?.innerHTML?.match(/^[\s\n]*Cholesterol[\s\n]*$/));
+assert(cholesterolSpan.length === 1);
+```
+
+`Cholesterol` `span` inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+const spans = [...document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')];
+const cholesterolSpan = spans.filter(span => span?.innerHTML?.match(/^[\s\n]*Cholesterol[\s\n]*$/));
+assert(cholesterolSpan[0]?.classList?.contains('bold'));
+```
+
+Maandishi `0%` yanapaswa kuwekwa katika `span`.
+
+```js
+const spans = [...document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')];
+const zeroPercentSpan = spans.filter(span => span?.innerHTML?.match(/^[\s\n]*0%[\s\n]*$/));
+assert(zeroPercentSpan.length === 1);
+```
+
+`0%` `span` inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+const spans = [...document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')];
+const zeroPercentSpan = spans.filter(span => span?.innerHTML?.match(/^[\s\n]*0%[\s\n]*$/));
+assert(zeroPercentSpan[0]?.classList?.contains('bold'));
+```
+
+`Cholesterol` `span` na maandishi yako ya `0mg` yanapaswa kufungwa katika `span`.
+
+```js
+const spans = [...document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')];
+const cholesterolZeroSpan = spans.filter(span => span?.innerText === 'Cholesterol 0mg');
+assert(cholesterolZeroSpan.length === 1);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7e7281626a92bbd62da8.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7e7281626a92bbd62da8.md
new file mode 100644
index 00000000000..8bbf6be98b1
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7e7281626a92bbd62da8.md
@@ -0,0 +1,203 @@
+---
+id: 615f7e7281626a92bbd62da8
+title: Hatua ya 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Baada ya kipengele chako cha `p` cha mwisho, unda kipengele kingine cha `p` chenye maandishi `Sodium 160mg 7%`. Funga maandishi `Sodium` katika kipengele cha `span` chenye sifa ya `class` iliyowekwa kuwa `bold`. Funga maandishi `7%` katika kipengele kingine cha `span` chenye `class` ya `bold`. Pia ongeza kipengele cha ziada cha `span` karibu na `Sodium 160mg` ili kukipanga kwa usahihi.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Sodium 160mg 7%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText?.match(/Sodium[\s|\n]160mg[\s|\n]+7%/));
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na vipengele vitatu vya `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')?.length === 3);
+```
+
+Kipengele cha `span` kinafaa kufungia maandishi `Sodium 360mg`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.firstElementChild?.innerText?.match(/Sodium[\s|\n]160mg/));
+```
+
+Kipengele cha `span` kinafaa kufungia maandishi `Sodium`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.firstElementChild?.firstElementChild?.innerText === "Sodium");
+```
+
+`span` iliyo karibu na `Sodium` inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.firstElementChild?.firstElementChild?.classList?.contains('bold'));
+```
+
+Kipengele cha `span` kinafaa kufungia maandishi `7%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.lastElementChild?.innerText === '7%');
+```
+
+Kipengele cha `span` cha `7%` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.lastElementChild?.classList?.contains('bold'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7ecb09de9a938ef94756.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7ecb09de9a938ef94756.md
new file mode 100644
index 00000000000..55b3647dbd8
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7ecb09de9a938ef94756.md
@@ -0,0 +1,210 @@
+---
+id: 615f7ecb09de9a938ef94756
+title: Hatua ya 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Ongeza kipengele kingine cha `p` chenye maandishi `Total Carbohydrate 37g 13%`. Kama hapo awali, tumia vipengee vya `span` ili kufanya maandishi `Total Carbohydrate` na `13%` kuwa nzito. Pia ongeza kipengee cha ziada cha `span` ili kufunga maandishi ya `Total Carbohydrate 37g` katika kipengele cha span ili kiwe kimepangiliwa kushoto, na `13%` kulia.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Total Carbohydrate 37g 13%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText?.match(/Total Carbohydrate[\s|\n]+37g[\s|\n]+13%/));
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na vipengele vitatu vya `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')?.length === 3);
+```
+
+Kipengele kimoja cha `span` kinapaswa kufungia maandishi `Total Carbohydrate 37g`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.firstElementChild?.innerText?.match(/Total Carbohydrate[\s|\n]+37g/));
+```
+
+Kipengele kimoja cha `span` kinapaswa kufungia maandishi `Total Carbohydrate`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.firstElementChild?.firstElementChild?.innerText === 'Total Carbohydrate');
+```
+
+Kipengele cha `span` cha `Total Carbohydrate` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.firstElementChild?.firstElementChild?.classList?.contains('bold'));
+```
+
+Kipengele cha `span` kinafaa kufungia maandishi `13%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.lastElementChild?.innerText === '13%');
+```
+
+Kipengele cha `span` cha `13%` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.lastElementChild?.classList?.contains('bold'));
+```
+
+Kipengele chako cha pili cha `span` kinapaswa kuwa na maandishi `13%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.lastElementChild?.innerText === '13%');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7fa959ab75948f96a0d6.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7fa959ab75948f96a0d6.md
new file mode 100644
index 00000000000..0a10f05b4e9
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f7fa959ab75948f96a0d6.md
@@ -0,0 +1,183 @@
+---
+id: 615f7fa959ab75948f96a0d6
+title: Hatua ya 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Chini ya kipengele chako cha mwisho cha `p`, ongeza kipengele kingine cha `p` chenye maandishi `Dietary Fiber 4g`. Kipe kipengele cha `p` `class` muhimu ili kujongeza na kuondoa mpaka wa kugawanya. Kisha unda kigawanyaji chini ya kipengele hicho cha `p`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` na `div` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.localName === 'p');
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'div');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Dietary Fiber 4g`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.innerText.match(/Dietary Fiber[\s|\n]+4g/));
+```
+
+Kipengele chako cha `p` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `indent no-divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.classList?.contains('indent'));
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.classList?.contains('no-divider'));
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('divider'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f808d85793195b0f53be9.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f808d85793195b0f53be9.md
new file mode 100644
index 00000000000..1e234921844
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f808d85793195b0f53be9.md
@@ -0,0 +1,185 @@
+---
+id: 615f808d85793195b0f53be9
+title: Hatua ya 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Unda kipengele kingine cha `p` baada ya `.divider` yako ya mwisho, na ukipe maandishi `Total Sugars 12g`. Tengeneza kwamba kipengee cha `p` cha `class` thamani zinazohitajika ili kujongeza na kuondoa mpaka wa chini. Kisha uunde `.divider` nyingine chini ya kipengele chako kipya cha `p`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` na `div` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.localName === 'p');
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'div');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Total Sugars 12g`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.innerText.match(/Total Sugars[\s|\n]+12g/));
+```
+
+Kipengele chako cha `p` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `indent no-divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.classList?.contains('indent'));
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.classList?.contains('no-divider'));
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('divider'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f829d07b18f96f6f6684b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f829d07b18f96f6f6684b.md
new file mode 100644
index 00000000000..fe46c3ce282
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f829d07b18f96f6f6684b.md
@@ -0,0 +1,169 @@
+---
+id: 615f829d07b18f96f6f6684b
+title: Hatua ya 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Umuhimu wa kuunda vigawanyiko hivi ni kwamba unaweza kutumia madarasa mahususi ili kuvitengeneza kibinafsi. Ongeza `double-indent` kwenye `class` kwa `.divider` yako ya mwisho.
+
+# --hints--
+
+Kipengele chako cha mwisho cha `.divider` kinafaa kuongezewa `double-indent` kwenye `class`. Usiondoe thamani iliyopo.
+
+```js
+const last = document.querySelector('.daily-value.small-text')?.lastElementChild;
+assert(last?.classList?.contains('double-indent'));
+assert(last?.classList?.contains('divider'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f83ef928ec9982b785b6a.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f83ef928ec9982b785b6a.md
new file mode 100644
index 00000000000..6642cb97e0e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f83ef928ec9982b785b6a.md
@@ -0,0 +1,175 @@
+---
+id: 615f83ef928ec9982b785b6a
+title: Hatua ya 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Unda kichaguzi cha `.double-indent` na ukipe ukingo wa kushoto wa `2em`.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi kipya cha `.double-indent`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.double-indent'));
+```
+
+Kichaguzi chako cha `.double-indent` kinapaswa kuwa na sifa ya `margin-left` iliyowekwa kuwa `2em`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.double-indent')?.marginLeft === '2em');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f84f246e8ba98e3cd97be.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f84f246e8ba98e3cd97be.md
new file mode 100644
index 00000000000..93d35acb18f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f84f246e8ba98e3cd97be.md
@@ -0,0 +1,211 @@
+---
+id: 615f84f246e8ba98e3cd97be
+title: Hatua ya 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Chini ya kipengele chako cha `.double-indent`, ongeza kipengele kipya cha `p` chenye maandishi `Includes 10g Added Sugars 20%`. Kipengele chako kipya cha `p` kinafaa pia kuingizwa ndani mara mbili (double indented), na hakina mpaka wa chini. Tumia `span` ili kuifanya `20%` bold na kupangwa kulia.
+
+Kisha unda kigawanyaji kingine baada ya kipengele hicho cha `p`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` na `div` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.localName === 'p');
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'div');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Includes 10g Added Sugars 20%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.innerText.match(/Includes 10g Added Sugars[\s|\n]+20%/));
+```
+
+Kipengele chako cha `p` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `double-indent no-divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.classList?.contains('double-indent'));
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.classList?.contains('no-divider'));
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na kipengele cha `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.firstElementChild?.localName === 'span');
+```
+
+Kipengele chako cha `span` kinafaa kuwa na sifa ya `class` iliyowekwa kuwa `bold`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.firstElementChild?.classList?.contains('bold'));
+```
+
+Kipengele chako cha `span` kinafaa kufungia maandishi `20%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type span')?.innerText === '20%');
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('divider'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f887466db4ba14b5342cc.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f887466db4ba14b5342cc.md
new file mode 100644
index 00000000000..efbbb689a73
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f887466db4ba14b5342cc.md
@@ -0,0 +1,195 @@
+---
+id: 615f887466db4ba14b5342cc
+title: Hatua ya 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Baada ya divider yako ya mwisho, unda kipengele kingine cha `p` chenye maandishi `Protein 3g`. Tumia madarasa yanayohitajika ili kuondoa mpaka wa chini, na `span` ili kufanya `Protein` kuwa na uzito.
+
+Kufuatia kipengele hiki, tengeneza mgawanyiko mkubwa.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` na `div` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.localName === 'p');
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'div');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Protein 3g`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.innerText.match(/Protein[\s|\n]+3g/));
+```
+
+Kipengele chako cha kipya cha `p` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `no-divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text p:last-of-type')?.classList?.contains('no-divider'));
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider large`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('divider'));
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('large'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
Includes 10g Added Sugars 20%
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f89e055040ba294719d2f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f89e055040ba294719d2f.md
new file mode 100644
index 00000000000..0326c8e8123
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f89e055040ba294719d2f.md
@@ -0,0 +1,195 @@
+---
+id: 615f89e055040ba294719d2f
+title: Hatua ya 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Unda kipengele kingine cha `p` chini ya kigawanyaji chako kikubwa. Kipe kipengele cha `p` maandishi `Vitamin D 2mcg 10%`.
+
+Kipengele cha `p` kina maandishi pekee, unaweza kufunika asilimia katika kipengele cha `span` ili kichukuliwe kuwa huluki tofauti na maandishi mengine, na kihamishwe hadi kulia.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Vitamin D 2mcg 10%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText?.match(/Vitamin D 2mcg[\s|\n]+10%/));
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na kipengele cha `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')?.length === 1);
+```
+
+Kipengele chako cha `span` hakipaswi kuwa na herufi nzito.
+
+```js
+assert(!document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('span')?.classList?.contains('bold'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
Includes 10g Added Sugars 20%
+
+
Protein 3g
+
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8bfe0f30a1a3c340356b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8bfe0f30a1a3c340356b.md
new file mode 100644
index 00000000000..9b01875142f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8bfe0f30a1a3c340356b.md
@@ -0,0 +1,219 @@
+---
+id: 615f8bfe0f30a1a3c340356b
+title: Hatua ya 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Unda kipengele kingine cha `p`, na ukipe maandishi `Calcium 260mg 20%`. Pangilia `20%` kulia. Chini ya hapo, unda kipengele cha `p` chenye maandishi `Iron 8mg 45%`, ukiipanga `45%` kulia.
+
+# --hints--
+
+Unapaswa kuunda vipengele viwili vipya vya `p` mwishoni mwa kipengee chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.localName === 'p');
+```
+
+Kipengele chako kipya cha kwanza cha `p` kinapaswa kuwa na maandishi `Calcium 260mg 20%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.innerText?.match(/Calcium 260mg[\s|\n]+20%/));
+```
+
+Kipengele chako kipya cha kwanza cha `p` kinapaswa kuwa na kipengele cha `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.firstElementChild?.localName === 'span');
+```
+
+Kipengele chako cha kwanza cha `span` hakipaswi kuwa na herufi nzito.
+
+```js
+assert(!document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.firstElementChild?.classList?.contains('bold'));
+```
+
+Kipengele chako cha kwanza cha `span` kinapaswa kuwa na maandishi `20%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.previousElementSibling?.firstElementChild?.innerText === '20%');
+```
+
+Kipengele chako cha pili cha `p` kinapaswa kuwa na maandishi `Iron 8mg 45%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText?.match(/Iron 8mg[\s|\n]+45%/));
+```
+
+Kipengele chako kipya cha pili cha `p` kinapaswa kuwa na kipengele cha `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.firstElementChild?.localName === 'span');
+```
+
+Kipengele chako cha pili cha `span` hakipaswi kuwa na herufi nzito.
+
+```js
+assert(!document.querySelector('.daily-value.small-text')?.lastElementChild?.firstElementChild?.classList?.contains('bold'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
Includes 10g Added Sugars 20%
+
+
Protein 3g
+
+
Vitamin D 2mcg 10%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8f1223601fa546e93f31.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8f1223601fa546e93f31.md
new file mode 100644
index 00000000000..3dd32f905f6
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f8f1223601fa546e93f31.md
@@ -0,0 +1,202 @@
+---
+id: 615f8f1223601fa546e93f31
+title: Hatua ya 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+Unda kipengele cha mwisho cha `p` cha sehemu yako ya `.daily-value`. Ipe maandishi `Potassium 235mg 6%`. Pangilia maandishi ya `6%` kulia, na uondoe mpaka wa chini wa kipengele cha `p`.
+
+# --hints--
+
+Unapaswa kuunda kipengele kipya cha `p` mwishoni mwa kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.localName === 'p');
+```
+
+Kipengele chako cha kipya cha `p` kinapaswa kuwa na sifa ya `class` iliyowekwa kuwa `no-divider`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.classList?.contains('no-divider'));
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi `Potassium 235mg 6%`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.innerText?.match(/Potassium 235mg[\s|\n]+6%/));
+```
+
+Kipengele chako kipya cha `p` kinafaa kuwa na kipengele cha `span`.
+
+```js
+assert(document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelectorAll('span')?.length === 1);
+```
+
+Kipengele chako cha `span` hakipaswi kuwa na herufi nzito.
+
+```js
+assert(!document.querySelector('.daily-value.small-text')?.lastElementChild?.querySelector('span')?.classList?.contains('bold'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+ --fcc-editable-region--
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
Includes 10g Added Sugars 20%
+
+
Protein 3g
+
+
Vitamin D 2mcg 10%
+
Calcium 260mg 20%
+
Iron 8mg 45%
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f905fbd1017a65ca224eb.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f905fbd1017a65ca224eb.md
new file mode 100644
index 00000000000..5d2028fd56e
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f905fbd1017a65ca224eb.md
@@ -0,0 +1,211 @@
+---
+id: 615f905fbd1017a65ca224eb
+title: Hatua ya 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Ongeza kigawanyaji cha wastani baada ya kipengele chako cha `.daily-value`. Chini ya kigawanyaji hicho kipya, unda kipengele cha `p` chenye sifa ya `class` iliyowekwa `note`.
+
+Kipe kipengele cha `p` maandishi yafuatayo:
+
+```markup
+* The % Daily Value (DV) tells you how much a nutrient in a serving of food contributes to a daily diet. 2,000 calories a day is used for general nutrition advice.
+```
+
+# --hints--
+
+Unapaswa kuunda `div` mpya baada ya kipengele chako cha `.daily-value`.
+
+```js
+assert(document.querySelector('.daily-value').nextElementSibling?.localName === 'div');
+```
+
+`div` yako mpya inapaswa kuwa na sifa ya `class` iliyowekwa kuwa `divider medium`.
+
+```js
+assert(document.querySelector('.daily-value')?.nextElementSibling?.classList?.contains('divider'));
+assert(document.querySelector('.daily-value')?.nextElementSibling?.classList?.contains('medium'));
+```
+
+Unapaswa kuunda kipengele cha `p` baada ya kipengele chako cha `div`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.localName === 'p');
+```
+
+Kipengee chako kipya cha `p` kinapaswa kuwa na `class` iliyowekwa kuwa `note`.
+
+```js
+assert(document.querySelector('.label')?.lastElementChild?.classList?.contains('note'));
+```
+
+Kipengele chako kipya cha `p` kinapaswa kuwa na maandishi yaliyotolewa.
+
+```js
+assert.equal(document.querySelector('.label')?.lastElementChild?.innerText, '* The % Daily Value (DV) tells you how much a nutrient in a serving of food contributes to a daily diet. 2,000 calories a day is used for general nutrition advice.');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
Includes 10g Added Sugars 20%
+
+
Protein 3g
+
+
Vitamin D 2mcg 10%
+
Calcium 260mg 20%
+
Iron 8mg 45%
+
Potassium 235mg 6%
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f94786869e1a7fec54375.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f94786869e1a7fec54375.md
new file mode 100644
index 00000000000..99f947e694f
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f94786869e1a7fec54375.md
@@ -0,0 +1,196 @@
+---
+id: 615f94786869e1a7fec54375
+title: Hatua ya 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Unda kichaguzi cha `.note`, na uweke ukubwa wa fonti kuwa `0.6rem`. Pia weka pambizo za juu na chini kuwa `5px`, ukiondoa pambizo za kushoto na kulia.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi kipya cha `.note`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.note'));
+```
+
+Kichaguzi chako cha `.note` kinafaa kuwa na sifa ya `font-size` iliyowekwa kuwa `0.6rem`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.note')?.fontSize === '0.6rem');
+```
+
+Kichaguzi chako cha `.note` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `5px 0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.note')?.margin === '5px 0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
Includes 10g Added Sugars 20%
+
+
Protein 3g
+
+
Vitamin D 2mcg 10%
+
Calcium 260mg 20%
+
Iron 8mg 45%
+
Potassium 235mg 6%
+
+
+
* The % Daily Value (DV) tells you how much a nutrient in a serving of food contributes to a daily
+ diet. 2,000 calories a day is used for general nutrition advice.
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f951dff9317a900ef683f.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f951dff9317a900ef683f.md
new file mode 100644
index 00000000000..1a69c612157
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f951dff9317a900ef683f.md
@@ -0,0 +1,365 @@
+---
+id: 615f951dff9317a900ef683f
+title: Hatua ya 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Kipe kichaguzi `.note` pedi ya kushoto na kulia ya `8px`, ukiondoa pedi za juu na chini. Pia weka sifa ya `text-indent` kuwa `-8px`.
+
+Kwa mabadiliko haya ya mwisho, lebo yako ya lishe imekamilika!
+
+# --hints--
+
+Kichaguzi chako cha `.note` kinafaa kuwa na sifa ya `padding` iliyowekwa kuwa `0 8px`.
+
+```js
+assert.equal(new __helpers.CSSHelp(document).getStyle('.note')?.paddingTop, '0px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.note')?.paddingBottom, '0px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.note')?.paddingLeft, '8px');
+assert.equal(new __helpers.CSSHelp(document).getStyle('.note')?.paddingRight, '8px');
+```
+
+Kichaguzi chako cha `.note` kinafaa kuwa na sifa ya `text-indent` iliyowekwa kuwa `-8px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.note')?.textIndent === '-8px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
Includes 10g Added Sugars 20%
+
+
Protein 3g
+
+
Vitamin D 2mcg 10%
+
Calcium 260mg 20%
+
Iron 8mg 45%
+
Potassium 235mg 6%
+
+
+
* The % Daily Value (DV) tells you how much a nutrient in a serving of food contributes to a daily
+ diet. 2,000 calories a day is used for general nutrition advice.
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+
+--fcc-editable-region--
+.note {
+ font-size: 0.6rem;
+ margin: 5px 0;
+}
+--fcc-editable-region--
+```
+
+## --solutions--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
% Daily Value *
+
+
Total Fat 8g 10%
+
Saturated Fat 1g 5%
+
+
Trans Fat 0g
+
+
Cholesterol 0mg 0%
+
Sodium 160mg 7%
+
Total Carbohydrate 37g 13%
+
Dietary Fiber 4g
+
+
Total Sugars 12g
+
+
Includes 10g Added Sugars 20%
+
+
Protein 3g
+
+
Vitamin D 2mcg 10%
+
Calcium 260mg 20%
+
Iron 8mg 45%
+
Potassium 235mg 6%
+
+
+
* The % Daily Value (DV) tells you how much a nutrient in a serving of food contributes to a daily
+ diet. 2,000 calories a day is used for general nutrition advice.
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+.right {
+ justify-content: flex-end;
+}
+
+.indent {
+ margin-left: 1em;
+}
+
+.double-indent {
+ margin-left: 2em;
+}
+
+.daily-value p:not(.no-divider) {
+ border-bottom: 1px solid #888989;
+}
+
+.note {
+ font-size: 0.6rem;
+ margin: 5px 0;
+ padding: 0 8px;
+ text-indent: -8px;
+}
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md
new file mode 100644
index 00000000000..d16753a81df
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md
@@ -0,0 +1,153 @@
+---
+id: 635bde33c91c80540eae239b
+title: Hatua ya 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Maandishi `* Daily Value %` yanapaswa kupangiliwa kulia. Unda kichaguzi cha `.right` na utumie kipengele cha `justify-content` kuifanya.
+
+# --hints--
+
+Unapaswa kuwa na kichaguzi cha `.right`.
+
+```js
+const hasRight = new __helpers.CSSHelp(document).getStyle('.right');
+assert(hasRight);
+
+```
+
+Kichaguzi chako cha `.right` kinapaswa kuwa na sifa ya `justify-content` iliyowekwa kuwa `flex-end`.
+
+```js
+const rightJustifyContent = new __helpers.CSSHelp(document).getStyle('.right')?.getPropertyValue('justify-content');
+assert(rightJustifyContent === 'flex-end');
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.medium {
+ height: 5px;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+.calories-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.calories-info h2 {
+ margin: 0;
+}
+
+.left-container p {
+ margin: -5px -2px;
+ font-size: 2em;
+ font-weight: 700;
+}
+
+.calories-info span {
+ margin: -7px -2px;
+ font-size: 2.4em;
+ font-weight: 700;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md
new file mode 100644
index 00000000000..a0037d8f3c4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md
@@ -0,0 +1,117 @@
+---
+id: 6395d33ab5d91bf317107c48
+title: Hatua ya 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Unda kichaguzi cha `.calories-info h2` na uondoe pambizo zote.
+
+# --hints--
+
+Unda kichaguzi cha `.calories-info h2`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info h2'));
+```
+
+Kichaguzi chako cha `.calories-info h2` kinafaa kuwa na sifa ya `margin` iliyowekwa kuwa `0`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info h2')?.margin === '0px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md
new file mode 100644
index 00000000000..1ae54331df4
--- /dev/null
+++ b/curriculum/challenges/swahili/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md
@@ -0,0 +1,135 @@
+---
+id: 6396e33fe478dd264ebbf278
+title: Hatua ya 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Unda kichaguzi kipya cha `.calories-info` na ukipe sifa ya `display` iliyowekwa kuwa `flex`. Pia ipe sifa ya `justify-content` iliyowekwa kuwa `space-between` na sifa ya `align-items` iliyowekwa kuwa `flex-end`.
+
+# --hints--
+
+Unapaswa kuunda kichaguzi cha `.calories-info`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info'));
+```
+
+Kichaguzi chako cha `.calories-info` kinapaswa kuwa na sifa ya `display` iliyowekwa kuwa `flex`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info')?.display === 'flex');
+```
+
+Kichaguzi chako cha `.calories-info` kinapaswa kuwa na sifa ya `justify-content` iliyowekwa kuwa `space-between`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info')?.justifyContent === 'space-between');
+```
+
+Kichaguzi chako cha `.calories-info` kinapaswa kuwa na sifa ya `align-items` iliyowekwa kuwa `flex-end`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.calories-info')?.alignItems === 'flex-end');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Nutrition Label
+
+
+
+
+
+
+
+
+
+
+
Amount per serving
+
Calories
+
+
230
+
+
+
+
+```
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+html {
+ font-size: 16px;
+}
+
+body {
+ font-family: 'Open Sans', sans-serif;
+}
+
+.label {
+ border: 2px solid black;
+ width: 270px;
+ margin: 20px auto;
+ padding: 0 7px;
+}
+
+header h1 {
+ text-align: center;
+ margin: -4px 0;
+ letter-spacing: 0.15px
+}
+
+p {
+ margin: 0;
+ display: flex;
+ justify-content: space-between;
+}
+
+.divider {
+ border-bottom: 1px solid #888989;
+ margin: 2px 0;
+}
+
+.bold {
+ font-weight: 800;
+}
+
+.large {
+ height: 10px;
+}
+
+.large, .medium {
+ background-color: black;
+ border: 0;
+}
+
+.small-text {
+ font-size: 0.85rem;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+.calories-info h2 {
+ margin: 0;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md
new file mode 100644
index 00000000000..46c493ad260
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-caesars-cipher-project/caesars-cipher.md
@@ -0,0 +1,88 @@
+---
+id: 56533eb9ac21ba0edf2244e2
+title: Build a Caesars Cipher
+challengeType: 5
+forumTopicId: 16003
+dashedName: build-a-caesars-cipher
+---
+
+# --description--
+
+One of the simplest and most widely known
ciphers is a
Caesar cipher , also known as a
shift cipher . In a shift cipher the meanings of the letters are shifted by some set amount.
+
+A common modern use is the
ROT13 cipher, where the values of the letters are shifted by 13 places. Thus `A ↔ N`, `B ↔ O` and so on.
+
+Write a function which takes a
ROT13 encoded string as input and returns a decoded string.
+
+All letters will be uppercase. Do not transform any non-alphabetic character (i.e. spaces, punctuation), but do pass them on.
+
+# --hints--
+
+`rot13("SERR PBQR PNZC")` should decode to the string `FREE CODE CAMP`
+
+```js
+assert(rot13('SERR PBQR PNZC') === 'FREE CODE CAMP');
+```
+
+`rot13("SERR CVMMN!")` should decode to the string `FREE PIZZA!`
+
+```js
+assert(rot13('SERR CVMMN!') === 'FREE PIZZA!');
+```
+
+`rot13("SERR YBIR?")` should decode to the string `FREE LOVE?`
+
+```js
+assert(rot13('SERR YBIR?') === 'FREE LOVE?');
+```
+
+`rot13("GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.")` should decode to the string `THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.`
+
+```js
+assert(
+ rot13('GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.') ===
+ 'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.'
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function rot13(str) {
+ return str;
+}
+
+rot13("SERR PBQR PNZC");
+```
+
+# --solutions--
+
+```js
+var lookup = {
+ 'A': 'N','B': 'O','C': 'P','D': 'Q',
+ 'E': 'R','F': 'S','G': 'T','H': 'U',
+ 'I': 'V','J': 'W','K': 'X','L': 'Y',
+ 'M': 'Z','N': 'A','O': 'B','P': 'C',
+ 'Q': 'D','R': 'E','S': 'F','T': 'G',
+ 'U': 'H','V': 'I','W': 'J','X': 'K',
+ 'Y': 'L','Z': 'M'
+};
+
+function rot13(encodedStr) {
+ var codeArr = encodedStr.split(""); // String to Array
+ var decodedArr = []; // Your Result goes here
+ // Only change code below this line
+
+ decodedArr = codeArr.map(function(letter) {
+ if(lookup.hasOwnProperty(letter)) {
+ letter = lookup[letter];
+ }
+ return letter;
+ });
+
+ // Only change code above this line
+ return decodedArr.join(""); // Array to String
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-cash-register-project/cash-register.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-cash-register-project/cash-register.md
new file mode 100644
index 00000000000..4653f6358b1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-cash-register-project/cash-register.md
@@ -0,0 +1,252 @@
+---
+id: aa2e6f85cab2ab736c9a9b24
+title: Build A Cash Register
+challengeType: 5
+forumTopicId: 16012
+dashedName: build-a-cash-register
+---
+
+# --description--
+
+Design a cash register drawer function `checkCashRegister()` that accepts purchase price as the first argument (`price`), payment as the second argument (`cash`), and cash-in-drawer (`cid`) as the third argument.
+
+`cid` is a 2D array listing available currency.
+
+The `checkCashRegister()` function should always return an object with a `status` key and a `change` key.
+
+Return `{status: "INSUFFICIENT_FUNDS", change: []}` if cash-in-drawer is less than the change due, or if you cannot return the exact change.
+
+Return `{status: "CLOSED", change: [...]}` with cash-in-drawer as the value for the key `change` if it is equal to the change due.
+
+Otherwise, return `{status: "OPEN", change: [...]}`, with the change due in coins and bills, sorted in highest to lowest order, as the value of the `change` key.
+
+
Currency Unit Amount Penny $0.01 (PENNY) Nickel $0.05 (NICKEL) Dime $0.1 (DIME) Quarter $0.25 (QUARTER) Dollar $1 (ONE) Five Dollars $5 (FIVE) Ten Dollars $10 (TEN) Twenty Dollars $20 (TWENTY) One-hundred Dollars $100 (ONE HUNDRED)
+
+See below for an example of a cash-in-drawer array:
+
+```js
+[
+ ["PENNY", 1.01],
+ ["NICKEL", 2.05],
+ ["DIME", 3.1],
+ ["QUARTER", 4.25],
+ ["ONE", 90],
+ ["FIVE", 55],
+ ["TEN", 20],
+ ["TWENTY", 60],
+ ["ONE HUNDRED", 100]
+]
+```
+
+# --hints--
+
+`checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` should return an object.
+
+```js
+assert.deepEqual(
+ Object.prototype.toString.call(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 1.01],
+ ['NICKEL', 2.05],
+ ['DIME', 3.1],
+ ['QUARTER', 4.25],
+ ['ONE', 90],
+ ['FIVE', 55],
+ ['TEN', 20],
+ ['TWENTY', 60],
+ ['ONE HUNDRED', 100]
+ ])
+ ),
+ '[object Object]'
+);
+```
+
+`checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` should return `{status: "OPEN", change: [["QUARTER", 0.5]]}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 1.01],
+ ['NICKEL', 2.05],
+ ['DIME', 3.1],
+ ['QUARTER', 4.25],
+ ['ONE', 90],
+ ['FIVE', 55],
+ ['TEN', 20],
+ ['TWENTY', 60],
+ ['ONE HUNDRED', 100]
+ ]),
+ { status: 'OPEN', change: [['QUARTER', 0.5]] }
+);
+```
+
+`checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` should return `{status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(3.26, 100, [
+ ['PENNY', 1.01],
+ ['NICKEL', 2.05],
+ ['DIME', 3.1],
+ ['QUARTER', 4.25],
+ ['ONE', 90],
+ ['FIVE', 55],
+ ['TEN', 20],
+ ['TWENTY', 60],
+ ['ONE HUNDRED', 100]
+ ]),
+ {
+ status: 'OPEN',
+ change: [
+ ['TWENTY', 60],
+ ['TEN', 20],
+ ['FIVE', 15],
+ ['ONE', 1],
+ ['QUARTER', 0.5],
+ ['DIME', 0.2],
+ ['PENNY', 0.04]
+ ]
+ }
+);
+```
+
+`checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` should return `{status: "INSUFFICIENT_FUNDS", change: []}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 0.01],
+ ['NICKEL', 0],
+ ['DIME', 0],
+ ['QUARTER', 0],
+ ['ONE', 0],
+ ['FIVE', 0],
+ ['TEN', 0],
+ ['TWENTY', 0],
+ ['ONE HUNDRED', 0]
+ ]),
+ { status: 'INSUFFICIENT_FUNDS', change: [] }
+);
+```
+
+`checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` should return `{status: "INSUFFICIENT_FUNDS", change: []}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 0.01],
+ ['NICKEL', 0],
+ ['DIME', 0],
+ ['QUARTER', 0],
+ ['ONE', 1],
+ ['FIVE', 0],
+ ['TEN', 0],
+ ['TWENTY', 0],
+ ['ONE HUNDRED', 0]
+ ]),
+ { status: 'INSUFFICIENT_FUNDS', change: [] }
+);
+```
+
+`checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` should return `{status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}`.
+
+```js
+assert.deepEqual(
+ checkCashRegister(19.5, 20, [
+ ['PENNY', 0.5],
+ ['NICKEL', 0],
+ ['DIME', 0],
+ ['QUARTER', 0],
+ ['ONE', 0],
+ ['FIVE', 0],
+ ['TEN', 0],
+ ['TWENTY', 0],
+ ['ONE HUNDRED', 0]
+ ]),
+ {
+ status: 'CLOSED',
+ change: [
+ ['PENNY', 0.5],
+ ['NICKEL', 0],
+ ['DIME', 0],
+ ['QUARTER', 0],
+ ['ONE', 0],
+ ['FIVE', 0],
+ ['TEN', 0],
+ ['TWENTY', 0],
+ ['ONE HUNDRED', 0]
+ ]
+ }
+);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function checkCashRegister(price, cash, cid) {
+ let change;
+ return change;
+}
+
+checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);
+```
+
+# --solutions--
+
+```js
+const denom = [
+ { name: "ONE HUNDRED", val: 100 },
+ { name: "TWENTY", val: 20 },
+ { name: "TEN", val: 10 },
+ { name: "FIVE", val: 5 },
+ { name: "ONE", val: 1 },
+ { name: "QUARTER", val: 0.25 },
+ { name: "DIME", val: 0.1 },
+ { name: "NICKEL", val: 0.05 },
+ { name: "PENNY", val: 0.01 },
+];
+
+function checkCashRegister(price, cash, cid) {
+ const output = { status: null, change: [] };
+ let change = cash - price;
+ const register = cid.reduce(
+ function (acc, curr) {
+ acc.total += curr[1];
+ acc[curr[0]] = curr[1];
+ return acc;
+ },
+ { total: 0 }
+ );
+ if (register.total === change) {
+ output.status = "CLOSED";
+ output.change = cid;
+ return output;
+ }
+ if (register.total < change) {
+ output.status = "INSUFFICIENT_FUNDS";
+ return output;
+ }
+ const change_arr = denom.reduce(function (acc, curr) {
+ let value = 0;
+ while (register[curr.name] > 0 && change >= curr.val) {
+ change -= curr.val;
+ register[curr.name] -= curr.val;
+ value += curr.val;
+ change = Math.round(change * 100) / 100;
+ }
+ if (value > 0) {
+ acc.push([curr.name, value]);
+ }
+ return acc;
+ }, []);
+ if (change_arr.length < 1 || change > 0) {
+ output.status = "INSUFFICIENT_FUNDS";
+ return output;
+ }
+ output.status = "OPEN";
+ output.change = change_arr;
+ return output;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-palindrome-checker-project/palindrome-checker.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-palindrome-checker-project/palindrome-checker.md
new file mode 100644
index 00000000000..5f7ca896a8c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-palindrome-checker-project/palindrome-checker.md
@@ -0,0 +1,125 @@
+---
+id: aaa48de84e1ecc7c742e1124
+title: Build A Palindrome Checker
+challengeType: 5
+forumTopicId: 16004
+dashedName: build-a-palindrome-checker
+---
+
+# --description--
+
+Return `true` if the given string is a palindrome. Otherwise, return `false`.
+
+A
palindrome is a word or sentence that's spelled the same way both forward and backward, ignoring punctuation, case, and spacing.
+
+**Note:** You'll need to remove **all non-alphanumeric characters** (punctuation, spaces and symbols) and turn everything into the same case (lower or upper case) in order to check for palindromes.
+
+We'll pass strings with varying formats, such as `racecar`, `RaceCar`, and `race CAR` among others.
+
+We'll also pass strings with special symbols, such as `2A3*3a2`, `2A3 3a2`, and `2_A3*3#A2`.
+
+# --hints--
+
+`palindrome("eye")` should return a boolean.
+
+```js
+assert(typeof palindrome('eye') === 'boolean');
+```
+
+`palindrome("eye")` should return `true`.
+
+```js
+assert(palindrome('eye') === true);
+```
+
+`palindrome("_eye")` should return `true`.
+
+```js
+assert(palindrome('_eye') === true);
+```
+
+`palindrome("race car")` should return `true`.
+
+```js
+assert(palindrome('race car') === true);
+```
+
+`palindrome("not a palindrome")` should return `false`.
+
+```js
+assert(palindrome('not a palindrome') === false);
+```
+
+`palindrome("A man, a plan, a canal. Panama")` should return `true`.
+
+```js
+assert(palindrome('A man, a plan, a canal. Panama') === true);
+```
+
+`palindrome("never odd or even")` should return `true`.
+
+```js
+assert(palindrome('never odd or even') === true);
+```
+
+`palindrome("nope")` should return `false`.
+
+```js
+assert(palindrome('nope') === false);
+```
+
+`palindrome("almostomla")` should return `false`.
+
+```js
+assert(palindrome('almostomla') === false);
+```
+
+`palindrome("My age is 0, 0 si ega ym.")` should return `true`.
+
+```js
+assert(palindrome('My age is 0, 0 si ega ym.') === true);
+```
+
+`palindrome("1 eye for of 1 eye.")` should return `false`.
+
+```js
+assert(palindrome('1 eye for of 1 eye.') === false);
+```
+
+`palindrome("0_0 (: /-\ :) 0-0")` should return `true`.
+
+```js
+assert(palindrome('0_0 (: /- :) 0-0') === true);
+```
+
+`palindrome("five|\_/|four")` should return `false`.
+
+```js
+assert(palindrome('five|_/|four') === false);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function palindrome(str) {
+ return true;
+}
+
+palindrome("eye");
+```
+
+# --solutions--
+
+```js
+function palindrome(str) {
+ var string = str.toLowerCase().split(/[^A-Za-z0-9]/gi).join('');
+ var aux = string.split('');
+ if (aux.join('') === aux.reverse().join('')){
+ return true;
+ }
+
+ return false;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-roman-numeral-converter-project/roman-numeral-converter.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-roman-numeral-converter-project/roman-numeral-converter.md
new file mode 100644
index 00000000000..06f0c991879
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-roman-numeral-converter-project/roman-numeral-converter.md
@@ -0,0 +1,215 @@
+---
+id: a7f4d8f2483413a6ce226cac
+title: Build A Roman Numeral Converter
+challengeType: 5
+forumTopicId: 16044
+dashedName: build-a-roman-numeral-converter
+---
+
+# --description--
+
+Convert the given number into a roman numeral.
+
+| Roman numerals | Arabic numerals |
+| -------------- | --------------- |
+| M | 1000 |
+| CM | 900 |
+| D | 500 |
+| CD | 400 |
+| C | 100 |
+| XC | 90 |
+| L | 50 |
+| XL | 40 |
+| X | 10 |
+| IX | 9 |
+| V | 5 |
+| IV | 4 |
+| I | 1 |
+
+All roman numerals answers should be provided in upper-case.
+
+# --hints--
+
+`convertToRoman(2)` should return the string `II`.
+
+```js
+assert.deepEqual(convertToRoman(2), 'II');
+```
+
+`convertToRoman(3)` should return the string `III`.
+
+```js
+assert.deepEqual(convertToRoman(3), 'III');
+```
+
+`convertToRoman(4)` should return the string `IV`.
+
+```js
+assert.deepEqual(convertToRoman(4), 'IV');
+```
+
+`convertToRoman(5)` should return the string `V`.
+
+```js
+assert.deepEqual(convertToRoman(5), 'V');
+```
+
+`convertToRoman(9)` should return the string `IX`.
+
+```js
+assert.deepEqual(convertToRoman(9), 'IX');
+```
+
+`convertToRoman(12)` should return the string `XII`.
+
+```js
+assert.deepEqual(convertToRoman(12), 'XII');
+```
+
+`convertToRoman(16)` should return the string `XVI`.
+
+```js
+assert.deepEqual(convertToRoman(16), 'XVI');
+```
+
+`convertToRoman(29)` should return the string `XXIX`.
+
+```js
+assert.deepEqual(convertToRoman(29), 'XXIX');
+```
+
+`convertToRoman(44)` should return the string `XLIV`.
+
+```js
+assert.deepEqual(convertToRoman(44), 'XLIV');
+```
+
+`convertToRoman(45)` should return the string `XLV`.
+
+```js
+assert.deepEqual(convertToRoman(45), 'XLV');
+```
+
+`convertToRoman(68)` should return the string `LXVIII`
+
+```js
+assert.deepEqual(convertToRoman(68), 'LXVIII');
+```
+
+`convertToRoman(83)` should return the string `LXXXIII`
+
+```js
+assert.deepEqual(convertToRoman(83), 'LXXXIII');
+```
+
+`convertToRoman(97)` should return the string `XCVII`
+
+```js
+assert.deepEqual(convertToRoman(97), 'XCVII');
+```
+
+`convertToRoman(99)` should return the string `XCIX`
+
+```js
+assert.deepEqual(convertToRoman(99), 'XCIX');
+```
+
+`convertToRoman(400)` should return the string `CD`
+
+```js
+assert.deepEqual(convertToRoman(400), 'CD');
+```
+
+`convertToRoman(500)` should return the string `D`
+
+```js
+assert.deepEqual(convertToRoman(500), 'D');
+```
+
+`convertToRoman(501)` should return the string `DI`
+
+```js
+assert.deepEqual(convertToRoman(501), 'DI');
+```
+
+`convertToRoman(649)` should return the string `DCXLIX`
+
+```js
+assert.deepEqual(convertToRoman(649), 'DCXLIX');
+```
+
+`convertToRoman(798)` should return the string `DCCXCVIII`
+
+```js
+assert.deepEqual(convertToRoman(798), 'DCCXCVIII');
+```
+
+`convertToRoman(891)` should return the string `DCCCXCI`
+
+```js
+assert.deepEqual(convertToRoman(891), 'DCCCXCI');
+```
+
+`convertToRoman(1000)` should return the string `M`
+
+```js
+assert.deepEqual(convertToRoman(1000), 'M');
+```
+
+`convertToRoman(1004)` should return the string `MIV`
+
+```js
+assert.deepEqual(convertToRoman(1004), 'MIV');
+```
+
+`convertToRoman(1006)` should return the string `MVI`
+
+```js
+assert.deepEqual(convertToRoman(1006), 'MVI');
+```
+
+`convertToRoman(1023)` should return the string `MXXIII`
+
+```js
+assert.deepEqual(convertToRoman(1023), 'MXXIII');
+```
+
+`convertToRoman(2014)` should return the string `MMXIV`
+
+```js
+assert.deepEqual(convertToRoman(2014), 'MMXIV');
+```
+
+`convertToRoman(3999)` should return the string `MMMCMXCIX`
+
+```js
+assert.deepEqual(convertToRoman(3999), 'MMMCMXCIX');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function convertToRoman(num) {
+ return num;
+}
+
+convertToRoman(36);
+```
+
+# --solutions--
+
+```js
+function convertToRoman(num) {
+ var ref = [['M', 1000], ['CM', 900], ['D', 500], ['CD', 400], ['C', 100], ['XC', 90], ['L', 50], ['XL', 40], ['X', 10], ['IX', 9], ['V', 5], ['IV', 4], ['I', 1]];
+ var res = [];
+ ref.forEach(function(p) {
+ while (num >= p[1]) {
+ res.push(p[0]);
+ num -= p[1];
+ }
+ });
+ return res.join('');
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-telephone-number-validator-project/telephone-number-validator.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-telephone-number-validator-project/telephone-number-validator.md
new file mode 100644
index 00000000000..282f77b4be9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/build-a-telephone-number-validator-project/telephone-number-validator.md
@@ -0,0 +1,217 @@
+---
+id: aff0395860f5d3034dc0bfc9
+title: Build a Telephone Number Validator
+challengeType: 5
+forumTopicId: 16090
+dashedName: build-a-telephone-number-validator
+---
+
+# --description--
+
+Return `true` if the passed string looks like a valid US phone number.
+
+The user may fill out the form field any way they choose as long as it has the format of a valid US number. The following are examples of valid formats for US numbers (refer to the tests below for other variants):
+
+
555-555-5555 (555)555-5555 (555) 555-5555 555 555 5555 5555555555 1 555 555 5555
+
+For this challenge you will be presented with a string such as `800-692-7753` or `8oo-six427676;laskdjf`. Your job is to validate or reject the US phone number based on any combination of the formats provided above. The area code is required. If the country code is provided, you must confirm that the country code is `1`. Return `true` if the string is a valid US phone number; otherwise return `false`.
+
+# --hints--
+
+`telephoneCheck("555-555-5555")` should return a boolean.
+
+```js
+assert(typeof telephoneCheck('555-555-5555') === 'boolean');
+```
+
+`telephoneCheck("1 555-555-5555")` should return `true`.
+
+```js
+assert(telephoneCheck('1 555-555-5555') === true);
+```
+
+`telephoneCheck("1 (555) 555-5555")` should return `true`.
+
+```js
+assert(telephoneCheck('1 (555) 555-5555') === true);
+```
+
+`telephoneCheck("5555555555")` should return `true`.
+
+```js
+assert(telephoneCheck('5555555555') === true);
+```
+
+`telephoneCheck("555-555-5555")` should return `true`.
+
+```js
+assert(telephoneCheck('555-555-5555') === true);
+```
+
+`telephoneCheck("(555)555-5555")` should return `true`.
+
+```js
+assert(telephoneCheck('(555)555-5555') === true);
+```
+
+`telephoneCheck("1(555)555-5555")` should return `true`.
+
+```js
+assert(telephoneCheck('1(555)555-5555') === true);
+```
+
+`telephoneCheck("555-5555")` should return `false`.
+
+```js
+assert(telephoneCheck('555-5555') === false);
+```
+
+`telephoneCheck("5555555")` should return `false`.
+
+```js
+assert(telephoneCheck('5555555') === false);
+```
+
+`telephoneCheck("1 555)555-5555")` should return `false`.
+
+```js
+assert(telephoneCheck('1 555)555-5555') === false);
+```
+
+`telephoneCheck("1 555 555 5555")` should return `true`.
+
+```js
+assert(telephoneCheck('1 555 555 5555') === true);
+```
+
+`telephoneCheck("1 456 789 4444")` should return `true`.
+
+```js
+assert(telephoneCheck('1 456 789 4444') === true);
+```
+
+`telephoneCheck("123**&!!asdf#")` should return `false`.
+
+```js
+assert(telephoneCheck('123**&!!asdf#') === false);
+```
+
+`telephoneCheck("55555555")` should return `false`.
+
+```js
+assert(telephoneCheck('55555555') === false);
+```
+
+`telephoneCheck("(6054756961)")` should return `false`.
+
+```js
+assert(telephoneCheck('(6054756961)') === false);
+```
+
+`telephoneCheck("2 (757) 622-7382")` should return `false`.
+
+```js
+assert(telephoneCheck('2 (757) 622-7382') === false);
+```
+
+`telephoneCheck("0 (757) 622-7382")` should return `false`.
+
+```js
+assert(telephoneCheck('0 (757) 622-7382') === false);
+```
+
+`telephoneCheck("-1 (757) 622-7382")` should return `false`.
+
+```js
+assert(telephoneCheck('-1 (757) 622-7382') === false);
+```
+
+`telephoneCheck("2 757 622-7382")` should return `false`.
+
+```js
+assert(telephoneCheck('2 757 622-7382') === false);
+```
+
+`telephoneCheck("10 (757) 622-7382")` should return `false`.
+
+```js
+assert(telephoneCheck('10 (757) 622-7382') === false);
+```
+
+`telephoneCheck("27576227382")` should return `false`.
+
+```js
+assert(telephoneCheck('27576227382') === false);
+```
+
+`telephoneCheck("(275)76227382")` should return `false`.
+
+```js
+assert(telephoneCheck('(275)76227382') === false);
+```
+
+`telephoneCheck("2(757)6227382")` should return `false`.
+
+```js
+assert(telephoneCheck('2(757)6227382') === false);
+```
+
+`telephoneCheck("2(757)622-7382")` should return `false`.
+
+```js
+assert(telephoneCheck('2(757)622-7382') === false);
+```
+
+`telephoneCheck("555)-555-5555")` should return `false`.
+
+```js
+assert(telephoneCheck('555)-555-5555') === false);
+```
+
+`telephoneCheck("(555-555-5555")` should return `false`.
+
+```js
+assert(telephoneCheck('(555-555-5555') === false);
+```
+
+`telephoneCheck("(555)5(55?)-5555")` should return `false`.
+
+```js
+assert(telephoneCheck('(555)5(55?)-5555') === false);
+```
+
+`telephoneCheck("55 55-55-555-5")` should return `false`.
+
+```js
+assert(telephoneCheck('55 55-55-555-5') === false);
+```
+
+`telephoneCheck("11 555-555-5555")` should return `false`.
+
+```js
+assert(telephoneCheck('11 555-555-5555') === false);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function telephoneCheck(str) {
+ return true;
+}
+
+telephoneCheck("555-555-5555");
+```
+
+# --solutions--
+
+```js
+var re = /^([+]?1[\s]?)?((?:[(](?:[2-9]1[02-9]|[2-9][02-8][0-9])[)][\s]?)|(?:(?:[2-9]1[02-9]|[2-9][02-8][0-9])[\s.-]?)){1}([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2}[\s.-]?){1}([0-9]{4}){1}$/;
+
+function telephoneCheck(str) {
+ return re.test(str);
+}
+
+telephoneCheck("555-555-5555");
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635060a5c03c950f46174cb5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635060a5c03c950f46174cb5.md
new file mode 100644
index 00000000000..e85d882fe27
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635060a5c03c950f46174cb5.md
@@ -0,0 +1,127 @@
+---
+id: 635060a5c03c950f46174cb5
+title: Step 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+Statistics is a way of using math to make sense of data. It helps us understand patterns and trends in information, so we can make predictions and decisions based on that information.
+
+In this challenge, you will build a statistics calculator that takes a set of numbers and returns the mean, median, mode, standard deviation, and variance.
+
+The HTML and CSS have been provided for you. Feel free to explore the code – you may notice that the `calculate` function is called when the form is submitted. When you are ready, declare a `calculate` variable and assign it an empty function in the `script.js` file.
+
+# --hints--
+
+You should use the `const` keyword to declare a variable `calculate`.
+
+```js
+assert.match(code, /const\s*calculate/);
+```
+
+Your `calculate` variable should be a function.
+
+```js
+assert.isFunction(calculate);
+```
+
+Your `calculate` function should be empty.
+
+```js
+assert.match(calculate.toString(), /\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507b5ac8a55134223374c7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507b5ac8a55134223374c7.md
new file mode 100644
index 00000000000..00cf0fb28b7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507b5ac8a55134223374c7.md
@@ -0,0 +1,133 @@
+---
+id: 63507b5ac8a55134223374c7
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+To begin, the `calculate` function needs to find the number that was entered in the `#numbers` input field. To do this, use a `.querySelector` to locate the input field and then use the `.value` property to get the number entered.
+
+Store this in a `value` variable.
+
+# --hints--
+
+Your `calculate` function should have a `value` variable.
+
+```js
+assert.match(calculate.toString(), /value/);
+```
+
+Your `calculate` function should call `document.querySelector()` with `#numbers` as the argument.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(\s*("|')#numbers\1\s*\)/)
+```
+
+You should access the `value` property of your `document.querySelector()` call.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(\s*("|')#numbers\1\s*\)\.value/);
+```
+
+You should assign the `value` property to your `value` variable.
+
+```js
+assert.match(calculate.toString(), /value\s*=\s*document\.querySelector\(\s*("|')#numbers\1\s*\)\.value/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const calculate = () => {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507bcbfe4ede356e624395.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507bcbfe4ede356e624395.md
new file mode 100644
index 00000000000..28bf96fe1b6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507bcbfe4ede356e624395.md
@@ -0,0 +1,129 @@
+---
+id: 63507bcbfe4ede356e624395
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Now that you have the value of the input, you need to split it into an array of numbers. Use the `.split()` method to do this.
+
+The `.split()` method takes a string and splits it into an array of strings. You can pass it a string of characters or a RegEx to use as a separator. For example, `string.split(",")` would split the string at each comma and return an array of strings.
+
+Use a regex to split the `value` string by commas followed by any number of spaces. Store the array in an `array` variable.
+
+# --hints--
+
+Your `calculate` function should have an `array` variable.
+
+```js
+assert.match(code.toString(), /array/);
+```
+
+Your `calculate` function should call the `.split()` method on the `value` variable.
+
+```js
+assert.match(code.toString(), /value\.split()/);
+```
+
+Your `calculate` function should assign the result of the `.split()` method to the `array` variable.
+
+```js
+assert.match(code.toString(), /array\s*=\s*value\.split()/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507c19151201368ee3e16c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507c19151201368ee3e16c.md
new file mode 100644
index 00000000000..ca4b2482b97
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507c19151201368ee3e16c.md
@@ -0,0 +1,128 @@
+---
+id: 63507c19151201368ee3e16c
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+The value of an input element is always a string, even if the input type is `number`. You need to convert this array of strings into an array of numbers. To do this, you can use the `.map()` method.
+
+Create a `numbers` variable and assign it the value of `array.map()`. Remember that `.map()` creates a new array, instead of mutating the original array.
+
+# --hints--
+
+Your `calculate` function should have a `numbers` variable.
+
+```js
+assert.match(calculate.toString(), /numbers/);
+```
+
+You should use the `.map()` method on your `array` variable.
+
+```js
+assert.match(calculate.toString(), /array\.map\(\)/);
+```
+
+You should assign the result of your `.map()` call to your `numbers` variable.
+
+```js
+assert.match(calculate.toString(), /numbers\s*=\s*array.map()/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507c4b63731437227b0134.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507c4b63731437227b0134.md
new file mode 100644
index 00000000000..e6fa1b85dd4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507c4b63731437227b0134.md
@@ -0,0 +1,143 @@
+---
+id: 63507c4b63731437227b0134
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+The `.map()` method takes a callback function as its first argument. This callback function takes a few arguments, but the first one is the current element being processed. Here is an example:
+
+```js
+array.map(el => {
+
+})
+```
+
+The callback function needs to return a value. In this case, you want to return the value of each element converted to a number. You can do this by using the `Number()` constructor, passing the element as an argument.
+
+Add a callback function to your `.map()` method that converts each element to a number.
+
+# --hints--
+
+Your `.map()` method should have a callback function which takes an `el` argument.
+
+```js
+assert.match(calculate.toString(), /array\.map\(\(?\s*el\s*\)?\s*=>|array\.map\(function\s*\(?el\)\s*\{/)
+```
+
+Your callback function should use the `Number` constructor to convert `el` to a number.
+
+```js
+assert.match(calculate.toString(), /Number\(\s*el\s*\)/);
+```
+
+Your callback function should not use the `new` keyword with the `Number` constructor.
+
+```js
+assert.notMatch(calculate.toString(), /new/);
+```
+
+Your callback function should return the element converted to a number.
+
+```js
+assert.match(calculate.toString(), /(array\.map\(\(?\s*el\s*\)?\s*=>|array\.map\(function\s*\(?el\)\s*\{)\s*(return\s*)?Number\(\s*el\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map();
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507d810f1a2e38f1908fd8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507d810f1a2e38f1908fd8.md
new file mode 100644
index 00000000000..6fb1811b2c9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507d810f1a2e38f1908fd8.md
@@ -0,0 +1,131 @@
+---
+id: 63507d810f1a2e38f1908fd8
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+A user could put any text they want into the input box. You want to make sure that you are only working with numbers. The `Number()` constructor will return `NaN` (which stands for "not a number") if the value passed to it cannot be converted to a number.
+
+You need to filter these values out – thankfully, arrays have a method specifically for this. The `.filter()` method will allow you to filter elements out of an array, creating a new array in the process.
+
+Declare a `filtered` variable and assign `numbers.filter()` to it.
+
+# --hints--
+
+Your `calculate` function should have a `filtered` variable.
+
+```js
+assert.match(calculate.toString(), /filtered/);
+```
+
+Your `calculate` function should use the `.filter()` method on the `numbers` array.
+
+```js
+assert.match(calculate.toString(), /numbers\.filter\(\)/)
+```
+
+You should assign the result of `numbers.filter()` to the `filtered` variable.
+
+```js
+assert.match(calculate.toString(), /filtered\s*=\s*numbers.filter\(\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el));
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507e4562cdde3a28e8de1b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507e4562cdde3a28e8de1b.md
new file mode 100644
index 00000000000..e47d7580a32
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507e4562cdde3a28e8de1b.md
@@ -0,0 +1,140 @@
+---
+id: 63507e4562cdde3a28e8de1b
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Much like the `.map()` method, the `.filter()` method takes a callback function. The callback function takes the current element as its first argument.
+
+```js
+array.filter(el => {
+
+})
+```
+
+The callback function needs to return a Boolean value, which indicates whether the element should be included in the new array. In this case, you want to return `true` if the element is not `NaN` (not a number).
+
+However, you cannot check for equality here, because `NaN` is not equal to itself. Instead, you can use the `Number.isNaN()` method, which returns `true` if the argument is `NaN`.
+
+Add a callback function to your `.filter()` method that returns `true` if the element is not `NaN`.
+
+# --hints--
+
+Your `.filter()` method should have a callback which accepts `el` as an argument.
+
+```js
+assert.match(calculate.toString(), /numbers\.filter\(\(?\s*el\s*\)?\s*=>|numbers\.filter\(function\s*\(?el\)\s*\{/)
+```
+
+Your callback function should use `!` and `Number.isNaN()` to check if `el` is NOT `NaN`.
+
+```js
+assert.match(calculate.toString(), /!(Number\.)?isNaN\(\s*el\s*\)/);
+```
+
+Your callback function should return elements that are not `NaN`.
+
+```js
+assert.match(calculate.toString(), /(numbers\.filter\(\(?\s*el\s*\)?\s*=>|numbers\.filter\(function\s*\(?el\)\s*\{)\s*(return\s*)?!(Number\.)?isNaN\(\s*el\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el));
+ const filtered = numbers.filter();
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507ebb0c50ce3b9d669cd9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507ebb0c50ce3b9d669cd9.md
new file mode 100644
index 00000000000..8d66c847223
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507ebb0c50ce3b9d669cd9.md
@@ -0,0 +1,143 @@
+---
+id: 63507ebb0c50ce3b9d669cd9
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Array methods can often be chained together to perform multiple operations at once. As an example:
+
+```js
+array.map().filter();
+```
+
+The `.map()` method is called on the array, and then the `.filter()` method is called on the result of the `.map()` method. This is called method chaining.
+
+Following that example, remove your `filtered` variable, and chain your `.filter()` call to your `.map()` call above. Do not remove either of the callback functions.
+
+# --hints--
+
+You should remove the `filtered` variable.
+
+```js
+assert.notMatch(calculate.toString(), /filtered/);
+```
+
+You should chain your `.filter()` call to your `.map()` call.
+
+```js
+console.log(calculate.toString());
+assert.match(calculate.toString(), /array\.map\(.*\)\.filter\(/s);
+```
+
+You should not remove the `.map()` callback.
+
+```js
+assert.match(calculate.toString(), /(array\.map\(\(?\s*el\s*\)?\s*=>|array\.map\(function\s*\(?el\)\s*\{)\s*(return\s*)?Number\(\s*el\s*\)/);
+```
+
+You should not remove the `.filter()` callback.
+
+```js
+assert.match(calculate.toString(), /(\.filter\(\(?\s*el\s*\)?\s*=>|\.filter\(function\s*\(?el\)\s*\{)\s*(return\s*)?!(Number\.)?isNaN\(\s*el\s*\)/s);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el));
+ const filtered = numbers.filter(el => !isNaN(el));
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507fc6cc29083cc44df2fb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507fc6cc29083cc44df2fb.md
new file mode 100644
index 00000000000..11561c2cc95
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63507fc6cc29083cc44df2fb.md
@@ -0,0 +1,131 @@
+---
+id: 63507fc6cc29083cc44df2fb
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+That is as far as you can get with the calculate function for now. It is time to write your mean logic.
+
+Create an empty function called `getMean`. It should take a single parameter `array`.
+
+# --hints--
+
+You should declare a `getMean` function.
+
+```js
+assert.isFunction(getMean);
+```
+
+Your `getMean` function should take a single `array` argument.
+
+```js
+assert.match(getMean.toString(), /\(\s*array\s*\)/);
+```
+
+Your `getMean` function should be empty.
+
+```js
+assert.match(getMean.toString(), /\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350805fe0fe283dd347b0dc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350805fe0fe283dd347b0dc.md
new file mode 100644
index 00000000000..b28037ffcb8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350805fe0fe283dd347b0dc.md
@@ -0,0 +1,133 @@
+---
+id: 6350805fe0fe283dd347b0dc
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+The
mean is the average value of all numbers in a list. The first step in calculating the mean is to take the sum of all numbers in the list. Arrays have another method, called `.reduce()`, which is perfect for this situation. The `.reduce()` method takes an array and applies a callback function to condense the array into a single value.
+
+Declare a `sum` variable and assign `array.reduce()` to it.
+
+# --hints--
+
+Your `getMean` function should have a `sum` variable.
+
+```js
+assert.match(getMean.toString(), /sum/);
+```
+
+Your `getMean` function should use the `.reduce()` method of the `array` argument.
+
+```js
+assert.match(getMean.toString(), /array\.reduce\(\)/);
+```
+
+You should assign the result of `array.reduce()` to the `sum` variable.
+
+```js
+assert.match(getMean.toString(), /sum\s*=\s*array\.reduce\(\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const getMean = (array) => {
+
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635080d80b72803e973841da.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635080d80b72803e973841da.md
new file mode 100644
index 00000000000..196a32559cd
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635080d80b72803e973841da.md
@@ -0,0 +1,133 @@
+---
+id: 635080d80b72803e973841da
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Like the other methods, `.reduce()` takes a callback. This callback, however, takes at least two parameters. The first is the
accumulator , and the second is the current element in the array. The return value for the callback becomes the value of the accumulator on the next iteration.
+
+```js
+array.reduce((acc, el) => {
+
+});
+```
+
+For your `sum` variable, pass a callback to `.reduce()` that takes the accumulator and the current element as parameters. The callback should return the sum of the accumulator and the current element.
+
+# --hints--
+
+Your `reduce` method should have a callback function which takes an `acc` and an `el` argument.
+
+```js
+assert.match(getMean.toString(), /(array\.reduce\(\(acc\s*,\s*el\s*\)\s*=>|array\.reduce\(function\s*\(acc\s*,\s*el\)\s*\{)/)
+```
+
+Your `reduce` method should return the sum of `acc` and `el`.
+
+```js
+assert.match(getMean.toString(), /(array\.reduce\(\(acc\s*,\s*el\s*\)\s*=>|array\.reduce\(function\s*\(acc\s*,\s*el\)\s*\{)\s*(return)?\s*acc\s*\+\s*el/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const getMean = (array) => {
+ const sum = array.reduce();
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350854411ffb73feb6bb84e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350854411ffb73feb6bb84e.md
new file mode 100644
index 00000000000..b0dd8f59b53
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350854411ffb73feb6bb84e.md
@@ -0,0 +1,127 @@
+---
+id: 6350854411ffb73feb6bb84e
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+The `.reduce()` method takes a second parameter that is used as the initial value of the accumulator. Without a second parameter, the `.reduce()` method uses the first element of the array as the accumulator, which can lead to unexpected results.
+
+To be safe, it's best to set an initial value. Here is an example of setting the initial value to an empty string:
+
+```js
+array.reduce((acc, el) => acc + el.toLowerCase(), "");
+```
+
+Set the initial value of the accumulator to `0`.
+
+# --hints--
+
+Your `reduce` method should have `0` as the initial value.
+
+```js
+assert.match(getMean.toString(), /(array\.reduce\(\(acc\s*,\s*el\s*\)\s*=>|array\.reduce\(function\s*\(acc\s*,\s*el\)\s*\{)\s*(return)?\s*acc\s*\+\s*el;\s*\}?\s*,\s*0\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const getMean = (array) => {
+ const sum = array.reduce((acc, el) => acc + el);
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508577f69f41409275f877.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508577f69f41409275f877.md
new file mode 100644
index 00000000000..4839e059df3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508577f69f41409275f877.md
@@ -0,0 +1,127 @@
+---
+id: 63508577f69f41409275f877
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+The next step in calculating the mean is to divide the sum of numbers by the count of numbers in the list.
+
+Declare a `mean` variable and assign it the value of `sum` divided by the length of `array`.
+
+# --hints--
+
+Your `getMean` function should have a `mean` variable.
+
+```js
+assert.match(getMean.toString(), /mean\s*=/);
+```
+
+You should assign the value of `sum` divided by `array.length` to the `mean` variable.
+
+```js
+assert.match(getMean.toString(), /mean\s*=\s*sum\s*\/\s*array\.length/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const getMean = (array) => {
+ const sum = array.reduce((acc, el) => acc + el, 0);
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635085da54fc2041e0303e75.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635085da54fc2041e0303e75.md
new file mode 100644
index 00000000000..0ff64ecf7b7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635085da54fc2041e0303e75.md
@@ -0,0 +1,126 @@
+---
+id: 635085da54fc2041e0303e75
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Finally, you need to return the value of `mean`.
+
+# --hints--
+
+Your `getMean` function should use the `return` keyword.
+
+```js
+assert.match(getMean.toString(), /return/);
+```
+
+Your `getMean` function should return the value of `mean`.
+
+```js
+assert.match(getMean.toString(), /return\s*mean\s*/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const getMean = (array) => {
+ const sum = array.reduce((acc, el) => acc + el, 0);
+ const mean = sum / array.length;
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635085f80bd9b5429faa40c4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635085f80bd9b5429faa40c4.md
new file mode 100644
index 00000000000..d15924ec709
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635085f80bd9b5429faa40c4.md
@@ -0,0 +1,147 @@
+---
+id: 635085f80bd9b5429faa40c4
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+You can actually clean this logic up a bit. Using the implicit return of an arrow function, you can directly return the value of the `.reduce()` method divided by the length of the array, without having to assign any variables.
+
+Update your `getMean` function as described above.
+
+# --hints--
+
+You should remove the `sum` variable declaration.
+
+```js
+assert.notMatch(getMean.toString(), /sum\s*=/);
+```
+
+You should remove the `mean` variable declaration.
+
+```js
+assert.notMatch(getMean.toString(), /mean\s*=/);
+```
+
+You should not change the logic within the `reduce` method.
+
+```js
+assert.match(getMean.toString(), /(array\.reduce\(\(acc\s*,\s*el\s*\)\s*=>|array\.reduce\(function\s*\(acc\s*,\s*el\)\s*\{)\s*(return)?\s*acc\s*\+\s*el;\s*\}?\s*,\s*0\)/)
+```
+
+You should divide the result of the `reduce` method by the length of the array.
+
+```js
+assert.match(getMean.toString(), /(array\.reduce\(\(acc\s*,\s*el\s*\)\s*=>|array\.reduce\(function\s*\(acc\s*,\s*el\)\s*\{)\s*(return)?\s*acc\s*\+\s*el;\s*\}?\s*,\s*0\)\s*\/\s*array\.length/)
+```
+
+You should use implicit return syntax to directly return the result of `reduce` divided by the array length.
+
+```js
+assert.match(code, /const\s+getMean\s*=\s*\(?array\)?\s*=>\s*array\.reduce\(\(acc\s*,\s*el\)\s*=>\s*acc\s*\+\s*el\s*,\s*0\s*\)\s*\/\s*array\.length/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+--fcc-editable-region--
+const getMean = (array) => {
+ const sum = array.reduce((acc, el) => acc + el, 0);
+ const mean = sum / array.length;
+ return mean;
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350866cce4c6d43bdf607c8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350866cce4c6d43bdf607c8.md
new file mode 100644
index 00000000000..443f0323e73
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6350866cce4c6d43bdf607c8.md
@@ -0,0 +1,125 @@
+---
+id: 6350866cce4c6d43bdf607c8
+title: Step 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Now you need to use your new `getMean` function. In your `calculate` function, declare a `mean` variable and assign it the value of `getMean(numbers)`.
+
+# --hints--
+
+Your `calculate` function should have a `mean` variable.
+
+```js
+assert.match(calculate.toString(), /mean\s*=/);
+```
+
+Your `mean` variable should be assigned the value of `getMean(numbers)`.
+
+```js
+assert.match(calculate.toString(), /mean\s*=\s*getMean\(\s*numbers\s*\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+--fcc-editable-region--
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508750f040a348a440a0bf.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508750f040a348a440a0bf.md
new file mode 100644
index 00000000000..3180484e3eb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508750f040a348a440a0bf.md
@@ -0,0 +1,135 @@
+---
+id: 63508750f040a348a440a0bf
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+To display the value of `mean`, your app has a `#mean` element ready to go.
+
+Use a `.querySelector` to find that element, and then set its `.textContent` to the value of `mean`.
+
+# --hints--
+
+Your `calculate` function should use a `document.querySelector()`.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(/);
+```
+
+Your `.querySelector()` should target the `#mean` element.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(\s*('|")#mean\1\s*\)/);
+```
+
+Your `calculate` function should set the `#mean` element's `.textContent` to the value of `mean`.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(\s*('|")#mean\1\s*\)\s*\.textContent\s*=\s*mean;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+--fcc-editable-region--
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635089e3bd3e144f2db4094f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635089e3bd3e144f2db4094f.md
new file mode 100644
index 00000000000..f526d6e8f70
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635089e3bd3e144f2db4094f.md
@@ -0,0 +1,134 @@
+---
+id: 635089e3bd3e144f2db4094f
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+If you test your form with a list of numbers, you should see the mean display on the page. However, this only works because freeCodeCamp's iframe has special settings. Normally, when a form is submitted, the event triggers a page refresh.
+
+To resolve this, add `return false;` after your `calculate();` call in the `onsubmit` attribute.
+
+# --hints--
+
+Your `onsubmit` attribute should have a `return false;` statement.
+
+```js
+assert.match(document.querySelector("form").getAttribute("onsubmit"), /return\s+false;/);
+```
+
+Your `onsubmit` attribute should still call `calculate()`.
+
+```js
+assert.match(document.querySelector("form").getAttribute("onsubmit"), /calculate\(\s*\)/);
+```
+
+You should return `false` after you call `calculate()`.
+
+```js
+assert.match(document.querySelector("form").getAttribute("onsubmit"), /calculate\(\s*\);\s*return\s+false;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+--fcc-editable-region--
+
+--fcc-editable-region--
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508abbff1c4c5210d68cc5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508abbff1c4c5210d68cc5.md
new file mode 100644
index 00000000000..8b54840f3fc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508abbff1c4c5210d68cc5.md
@@ -0,0 +1,136 @@
+---
+id: 63508abbff1c4c5210d68cc5
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Time to start working on the
median calculation. The median is the midpoint of a set of numbers.
+
+Begin with an empty function called `getMedian`, which should take an `array` parameter.
+
+# --hints--
+
+You should define a `getMedian` function.
+
+```js
+assert.isFunction(getMedian);
+```
+
+Your `getMedian` function should take an `array` parameter.
+
+```js
+assert.match(getMedian.toString(), /\(\s*array\s*\)/);
+```
+
+Your `getMedian` function should be empty.
+
+```js
+assert.match(getMedian.toString(), /\(\s*array\s*\)\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508bb4afb069534e81f33b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508bb4afb069534e81f33b.md
new file mode 100644
index 00000000000..850a88d9cf2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508bb4afb069534e81f33b.md
@@ -0,0 +1,132 @@
+---
+id: 63508bb4afb069534e81f33b
+title: Step 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+The first step in calculating the median is to ensure the list of numbers is sorted from least to greatest. Once again, there is an array method ideal for this – the `.sort()` method.
+
+Declare a `sorted` variable and assign `array.sort()` to it.
+
+# --hints--
+
+Your `getMedian` function should have a `sorted` variable.
+
+```js
+assert.match(getMedian.toString(), /sorted\s*=/);
+```
+
+Your `getMedian` function should assign `array.sort()` to the `sorted` variable.
+
+```js
+assert.match(getMedian.toString(), /sorted\s*=\s*array\.sort\(\s*\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+--fcc-editable-region--
+const getMedian = (array) => {
+
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508c898d753754757bd5e3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508c898d753754757bd5e3.md
new file mode 100644
index 00000000000..edb42afc1bf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/63508c898d753754757bd5e3.md
@@ -0,0 +1,134 @@
+---
+id: 63508c898d753754757bd5e3
+title: Step 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+By default, the `.sort()` method converts the elements of an array into strings, then sorts them alphabetically. This works well for strings, but not so well for numbers. For example, `10` comes before `2` when sorted as strings, but `2` comes before `10` when sorted as numbers.
+
+To fix this, you can pass in a callback function to the `.sort()` method. This function takes two parameters, which represent the two elements being compared. The function should return a value less than `0` if the first element should come before the second element, a value greater than `0` if the first element should come after the second element, and `0` if the two elements should remain in their current positions.
+
+To sort your numbers from smallest to largest, pass a callback function that takes parameters `a` and `b`, and returns the result of subtracting `b` from `a`.
+
+# --hints--
+
+Your `sort` method should have a callback function which takes an `a` and a `b` argument.
+
+```js
+assert.match(getMedian.toString(), /(array\.sort\(\(\s*a\s*,\s*b\s*\)\s*=>|array\.sort\(function\s*\(\s*a\s*,\s*b\)\s*\{)/)
+```
+
+Your `sort` method should return the result of subtracting `b` from `a`.
+
+```js
+assert.match(getMedian.toString(), /(array\.sort\(\(\s*a\s*,\s*b\s*\)\s*=>|array\.sort\(function\s*\(\s*a\s*,\s*b\)\s*\{)\s*(return)?\s*a\s*\-\s*b/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+--fcc-editable-region--
+const getMedian = (array) => {
+ const sorted = array.sort();
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635090f47eb6d9563a6fed05.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635090f47eb6d9563a6fed05.md
new file mode 100644
index 00000000000..f6e0343b71c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635090f47eb6d9563a6fed05.md
@@ -0,0 +1,150 @@
+---
+id: 635090f47eb6d9563a6fed05
+title: Step 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+The next step is to find the number in the middle of the list. If the list has an odd number of numbers, the middle number is the median. If the list has an even number of numbers, the median is the average of the two middle numbers.
+
+You can check if a number is even or odd with the
modulus operator , which is represented by the `%` symbol. This operator returns the remainder of the division of two numbers. If the remainder is `0`, the number is even. If the remainder is `1`, the number is odd:
+
+```js
+array.length % 2 === 0;
+```
+
+Declare a `median` variable. Using the ternary operator, check if the length of `array` is even. If the length of `array` is even, find the two middle numbers and calculate the mean of those numbers. If the length of `array` is odd, find the middle number and assign it to the `median` variable.
+
+# --hints--
+
+Your `getMedian` function should have a `median` variable.
+
+```js
+assert.match(getMedian.toString(), /median\s*=/);
+```
+
+Your `median` variable should use a ternary operator to check if the `array.length` is even.
+
+```js
+assert.match(getMedian.toString(), /median\s*=\s*array\.length\s*%\s*2\s*===\s*0\s*\?/);
+```
+
+If the `array.length` is even, your `median` variable should use the `getMean` function to calculate the mean of the two middle numbers. Your first argument should be the value of `sorted` at `array.length / 2`, and the second at `array.length / 2 - 1`.
+
+```js
+assert.match(getMedian.toString(), /median\s*=\s*array\.length\s*%\s*2\s*===\s*0\s*\?\s*getMean\(\s*\[sorted\[array\.length\s*\/\s*2\]\s*,\s*sorted\[\s*array\.length\s*\/\s*2\s*-\s*1\]\]\)\s*\:/);
+```
+
+If the `array.length` is odd, your `median` variable should assign the middle number to the `median` variable. The middle number is the value of `sorted` at `Math.floor(array.length / 2)`.
+
+```js
+assert.match(getMedian.toString(), /median\s*=\s*array\.length\s*%\s*2\s*===\s*0\s*\?\s*getMean\(\s*\[sorted\[array\.length\s*\/\s*2\]\s*,\s*sorted\[\s*array\.length\s*\/\s*2\s*-\s*1\]\]\)\s*\:\s*sorted\[\s*Math\.floor\(\s*array\.length\s*\/\s*2\)\];/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+--fcc-editable-region--
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635091f8dbf554575fb5aa0c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635091f8dbf554575fb5aa0c.md
new file mode 100644
index 00000000000..5306ff72463
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635091f8dbf554575fb5aa0c.md
@@ -0,0 +1,130 @@
+---
+id: 635091f8dbf554575fb5aa0c
+title: Step 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Finally, return the value of `median`.
+
+Like the `getMean` function, you could condense this code into one line and reduce the number of variables you instantiate. However, it is important to remember that shorter code is not always better code. In this case, reducing the lines of code would make the code harder to read and understand, impacting future maintainability.
+
+# --hints--
+
+Your `getMedian` function should return the value of `median`.
+
+```js
+assert.match(getMedian.toString(), /return\s+median;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+--fcc-editable-region--
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e79d15aae30fac58f48e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e79d15aae30fac58f48e.md
new file mode 100644
index 00000000000..0f80bd629be
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e79d15aae30fac58f48e.md
@@ -0,0 +1,145 @@
+---
+id: 6352e79d15aae30fac58f48e
+title: Step 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Like you did with your `getMean` function, you need to add your `getMedian` function to your `calculate` logic.
+
+Declare a variable `median` and assign it the value of `getMedian(numbers)`. Then, query the DOM for the `#median` element and set the `textContent` to `median`.
+
+# --hints--
+
+Your `calculate` function should have a `median` variable.
+
+```js
+assert.match(calculate.toString(), /median\s*=/);
+```
+
+Your `median` variable should be assigned the value of `getMedian(numbers)`.
+
+```js
+assert.match(calculate.toString(), /median\s*=\s*getMedian\(numbers\)/);
+```
+
+Your `calculate` function should query the DOM for the `#median` element and set the `textContent` to `median`.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(('|")#median\1\)\.textContent\s*=\s*median/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+--fcc-editable-region--
+ const mean = getMean(numbers);
+
+
+ document.querySelector("#mean").textContent = mean;
+
+--fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e80e024e89111600edfb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e80e024e89111600edfb.md
new file mode 100644
index 00000000000..8a691bd9d5c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e80e024e89111600edfb.md
@@ -0,0 +1,146 @@
+---
+id: 6352e80e024e89111600edfb
+title: Step 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Your next calculation is the
mode , which is the number that appears most often in the list. To get started, declare a `getMode` function that takes the same `array` parameter you have been using.
+
+# --hints--
+
+You should declare a `getMode` function.
+
+```js
+assert.isFunction(getMode);
+```
+
+Your `getMode` function should take a parameter named `array`.
+
+```js
+assert.match(getMode.toString(), /\(\s*array\s*\)/);
+```
+
+Your `getMode` function should be empty.
+
+```js
+assert.match(getMode.toString(), /\(\s*array\s*\)\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e93db104661305c5f658.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e93db104661305c5f658.md
new file mode 100644
index 00000000000..8473932561c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e93db104661305c5f658.md
@@ -0,0 +1,142 @@
+---
+id: 6352e93db104661305c5f658
+title: Step 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+In your new function, declare an empty `counts` object. You will use this to track the number of times each number appears in the list.
+
+# --hints--
+
+Your `getMode` function should have a `counts` variable.
+
+```js
+assert.match(getMode.toString(), /counts\s*=/);
+```
+
+Your `counts` variable should be an empty object.
+
+```js
+assert.match(getMode.toString(), /counts\s*=\s*\{\s*\};/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+const getMode = (array) => {
+
+}
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e96d2604f813c656750b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e96d2604f813c656750b.md
new file mode 100644
index 00000000000..8f07fdfe9ee
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352e96d2604f813c656750b.md
@@ -0,0 +1,152 @@
+---
+id: 6352e96d2604f813c656750b
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Remember that the `.forEach()` method allows you to run a callback function for each element in the array.
+
+Use the `.forEach()` method to loop through the `array`. In the callback, use the `el` argument to access the `counts` object and increment the count for each number.
+
+# --hints--
+
+Your `getMode` function should use the `.forEach()` method.
+
+```js
+assert.match(getMode.toString(), /array\.forEach\(/);
+```
+
+Your `.forEach()` method should have a callback function which takes an `el` argument.
+
+```js
+console.log(getMode.toString());
+assert.match(getMode.toString(), /(array\.forEach\(\(?\s*el\s*\)?\s*=>|array\.forEach\(function\s*\(?el\)?\s*\{)/);
+```
+
+Your `.forEach()` method should increment the count for each number. Don't forget the fallback value.
+
+```js
+assert.match(getMode.toString(), /(array\.forEach\(\(?\s*el\s*\)?\s*=>|array\.forEach\(function\s*\(?el\)?\s*\{)\s*\{?\s*(return)?\s*counts\[\s*el\s*\]\s*=\s*\(\s*counts\[\s*el\s*\]\s*\|\|\s*0\s*\)\s*\+\s*1\s*\}?/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+const getMode = (array) => {
+ const counts = {};
+
+}
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ea3a5b79e614ee2282fd.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ea3a5b79e614ee2282fd.md
new file mode 100644
index 00000000000..fec7d654aa5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ea3a5b79e614ee2282fd.md
@@ -0,0 +1,162 @@
+---
+id: 6352ea3a5b79e614ee2282fd
+title: Step 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+There are a few edge cases to account for when calculating the mode of a dataset. First, if every value appears the same number of times, there is no mode.
+
+To calculate this, you will use a `Set`. A `Set` is a data structure that only allows unique values. If you pass an array into the `Set` constructor, it will remove any duplicate values.
+
+Start by creating an `if` statement. In the condition, create a `Set` with `new Set()` and pass it the `Object.values()` of your `counts` object. If the `size` property of this `Set` is equal to `1`, that tells you every value appears the same number of times. In this case, return `null` from your function.
+
+# --hints--
+
+Your `getMode` function should have an `if` statement.
+
+```js
+assert.match(getMode.toString(), /if\s*\(/);
+```
+
+Your `if` statement should create a new `Set` and pass the `Object.values()` of your `counts` object.
+
+```js
+assert.match(getMode.toString(), /if\s*\(\s*new\s+Set\s*\(\s*Object\.values\s*\(\s*counts\s*\)/);
+```
+
+Your `if` statement should check if the `size` property of the new `Set` is equal to `1`.
+
+```js
+assert.match(getMode.toString(), /if\s*\(\s*new\s+Set\s*\(\s*Object\.values\s*\(\s*counts\s*\)\s*\)\s*\.size\s*===\s*1/);
+```
+
+Your `if` statement should return `null` if the `size` property of the new `Set` is equal to `1`.
+
+```js
+assert.match(getMode.toString(), /if\s*\(\s*new\s+Set\s*\(\s*Object\.values\s*\(\s*counts\s*\)\s*\)\.size\s*===\s*1\s*\)\s*\{?\s*return\s+null;\s*\}?/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+
+}
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ebd3ab962c168a122e85.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ebd3ab962c168a122e85.md
new file mode 100644
index 00000000000..b7b8aa2f930
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ebd3ab962c168a122e85.md
@@ -0,0 +1,156 @@
+---
+id: 6352ebd3ab962c168a122e85
+title: Step 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Now you need to find the value that occurs with the highest frequency. You'll use the `Object.keys()` method for this.
+
+Start by declaring a `highest` variable, and assigning it the value of the `counts` object's `Object.keys()` method.
+
+# --hints--
+
+Your `getMode` function should have a `highest` variable.
+
+```js
+assert.match(getMode.toString(), /highest\s*=/);
+```
+
+Your `getMode` function should use the `Object.keys()` method to get the keys of the `counts` object.
+
+```js
+assert.match(getMode.toString(), /Object\.keys\(\s*counts\s*\)/);
+```
+
+Your `getMode` function should use the `Object.keys()` method to get the keys of the `counts` object and assign them to the `highest` variable.
+
+```js
+assert.match(getMode.toString(), /highest\s*=\s*Object\.keys\(\s*counts\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+}
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ec8b9c70fd17b8c7ba3f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ec8b9c70fd17b8c7ba3f.md
new file mode 100644
index 00000000000..cc699ca81f3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ec8b9c70fd17b8c7ba3f.md
@@ -0,0 +1,165 @@
+---
+id: 6352ec8b9c70fd17b8c7ba3f
+title: Step 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Now you need to sort the values properly. Chain the `.sort()` method to your `Object.keys()` call.
+
+For the callback, you'll need to use the `counts` object to compare the values of each key. You can use the `a` and `b` parameters to access the keys. Then, return the value of `counts[b]` minus the value of `counts[a]`.
+
+Finally, access the first element in the array using bracket notation to complete your `highest` variable.
+
+# --hints--
+
+Your `getMode` function should use the `sort` method to sort the `Object.keys()` array.
+
+```js
+assert.match(getMode.toString(), /highest\s*=\s*Object\.keys\(\s*counts\s*\)\.sort\(/)
+```
+
+Your `getMode` function should pass a callback to the `sort` method with parameters `a` and `b`.
+
+```js
+assert.match(getMode.toString(), /highest\s*=\s*Object\.keys\(\s*counts\s*\)\.sort\(function\s*\(\s*a\s*,\s*b\s*\)/)
+```
+
+Your `getMode` function should use the `sort` method to sort the `Object.keys()` array and return the value of `counts[b]` minus the value of `counts[a]`.
+
+```js
+assert.match(getMode.toString(), /highest\s*=\s*Object\.keys\(\s*counts\s*\)\.sort\(\s*function\s*\(\s*a\s*,\s*b\s*\)\s*\{\s*return\s*counts\[\s*b\s*\]\s*-\s*counts\[\s*a\s*\];?\s*\}\s*\)/)
+```
+
+Your `highest` variable should have the value of the first entry in the sorted `Object.keys(counts)` array.
+
+```js
+assert.match(getMode.toString(), /highest\s*=\s*Object\.keys\(\s*counts\s*\)\.sort\(\s*function\s*\(\s*a\s*,\s*b\s*\)\s*\{\s*return\s*counts\[\s*b\s*\]\s*-\s*counts\[\s*a\s*\];?\s*\}\s*\)\[0\];/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts);
+}
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ecef9f045519063da9b3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ecef9f045519063da9b3.md
new file mode 100644
index 00000000000..381683844e0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ecef9f045519063da9b3.md
@@ -0,0 +1,154 @@
+---
+id: 6352ecef9f045519063da9b3
+title: Step 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+If multiple numbers in a series occur at the same highest frequency, they are all considered the mode. Otherwise, the mode is the number that occurs most often, that single number is the mode.
+
+Thankfully, you can handle both of these cases at once with the `.filter()` method. Start by declaring a `mode` variable and assigning it the value of `Object.keys(counts)`.
+
+# --hints--
+
+Your `getMode` function should have a `mode` variable.
+
+```js
+assert.match(getMode.toString(), /mode\s*=/);
+```
+
+Your `getMode` function should use the `Object.keys()` method to get the keys of the `counts` object and assign them to the `mode` variable.
+
+```js
+assert.match(getMode.toString(), /mode\s*=\s*Object\.keys\(\s*counts\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+
+}
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352edee8a4de01ad693f0e4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352edee8a4de01ad693f0e4.md
new file mode 100644
index 00000000000..fa1ae3702f8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352edee8a4de01ad693f0e4.md
@@ -0,0 +1,158 @@
+---
+id: 6352edee8a4de01ad693f0e4
+title: Step 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Now chain the filter method to your latest `Object.keys()` call. The callback function should return whether the value of `counts[el]` is equal to your `counts[highest]`.
+
+# --hints--
+
+You should chain `.filter()` to your last `Object.keys()` call.
+
+```js
+assert.match(getMode.toString(), /mode\s*=\s*Object\.keys\(\s*counts\s*\)\.filter\(/);
+```
+
+Your `.filter()` method should take a callback function with a parameter `el`.
+
+```js
+assert.match(getMode.toString(), /mode\s*=\s*Object\.keys\(\s*counts\s*\)\.filter\(function\s*\(\s*el\s*\)/);
+```
+
+Your `.filter()` method should return whether the value of `counts[el]` is equal to `counts[highest]`.
+
+```js
+assert.match(getMode.toString(), /mode\s*=\s*Object\.keys\(\s*counts\s*\)\.filter\(function\s*\(\s*el\s*\)\s*\{\s*return\s*counts\[\s*el\s*\]\s*===\s*counts\[\s*highest\s*\];\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts);
+}
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ee566a59d31d24bde74b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ee566a59d31d24bde74b.md
new file mode 100644
index 00000000000..41d854b50bc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ee566a59d31d24bde74b.md
@@ -0,0 +1,163 @@
+---
+id: 6352ee566a59d31d24bde74b
+title: Step 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Time to return your `mode` variable.
+
+`mode` is an array, so return it as a string with the `.join()` method. Separate the elements with a comma followed by a space.
+
+# --hints--
+
+Your `getMode` function should return the `mode` variable.
+
+```js
+assert.match(getMode.toString(), /return\s*mode\s*/)
+```
+
+Your `mode` variable should be returned as a string with the `join` method.
+
+```js
+assert.match(getMode.toString(), /return\s*mode\.join\(/)
+```
+
+You should separate the elements of the `mode` array with a comma and a space.
+
+```js
+assert.match(getMode.toString(), /return\s*mode\.join\(\s*('|"),\s\1\s*\);/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+--fcc-editable-region--
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+
+}
+--fcc-editable-region--
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f09b1e53a420e7873344.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f09b1e53a420e7873344.md
new file mode 100644
index 00000000000..9ef808c7073
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f09b1e53a420e7873344.md
@@ -0,0 +1,157 @@
+---
+id: 6352f09b1e53a420e7873344
+title: Step 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Add your `getMode()` function to your `calculate` logic, and update the respective HTML element.
+
+# --hints--
+
+Your `calculate` function should have a `mode` variable with the value of `getMode(numbers)`.
+
+```js
+assert.match(calculate.toString(), /mode\s*=\s*getMode\(\s*numbers\s*\);/);
+```
+
+Your `calculate` function should query the DOM for the `#mode` element and set the `textContent` to `mode`.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(('|")#mode\1\)\.textContent\s*=\s*mode;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+--fcc-editable-region--
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+
+--fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f179bdca23221298a5ba.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f179bdca23221298a5ba.md
new file mode 100644
index 00000000000..c88ce39ce83
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f179bdca23221298a5ba.md
@@ -0,0 +1,191 @@
+---
+id: 6352f179bdca23221298a5ba
+title: Step 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Your next calculation is the
range , which is the difference between the largest and smallest numbers in the list.
+
+You previously learned about the global `Math` object. `Math` has a `.min()` method to get the smallest number from a series of numbers, and the `.max()` method to get the largest number. Here's an example that gets the smallest number from an array:
+
+```js
+Math.min(1, 9, 11, -3, 0.5);
+```
+
+Declare a `getRange` function that takes the same `array` parameter you have been using. Using `Math.min()`, `Math.max()`, and the spread operator, return the difference between the largest and smallest numbers in the list.
+
+# --hints--
+
+You should define a `getRange` function.
+
+```js
+assert.isFunction(getRange);
+```
+
+Your `getRange` function should take an `array` parameter.
+
+```js
+assert.match(getRange.toString(), /array/);
+```
+
+Your `getRange` function should use the spread operator on the `array` parameter.
+
+```js
+assert.match(code.split("getRange")[1], /\.\.\.array/);
+```
+
+Your `getRange` function should use `Math.max` on the spread `array` parameter.
+
+```js
+assert.match(code.split("getRange")[1], /Math\.max\(\s*\.\.\.array\s*\)/);
+```
+
+Your `getRange` function should use `Math.min` on the spread `array` parameter.
+
+```js
+assert.match(code.split("getRange")[1], /Math\.min\(\s*\.\.\.array\s*\)/);
+```
+
+Your `getRange` function should return the difference between the largest and smallest numbers in the list.
+
+```js
+assert.equal(getRange([1, 2, 3, 4, 5]), 4);
+assert.equal(getRange([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 9);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f2526dccb523150b64fb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f2526dccb523150b64fb.md
new file mode 100644
index 00000000000..d562fff11bf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f2526dccb523150b64fb.md
@@ -0,0 +1,162 @@
+---
+id: 6352f2526dccb523150b64fb
+title: Step 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Add the logic for calculating and displaying the range to your `calculate` function.
+
+# --hints--
+
+Your `calculate` function should set a `range` variable to the result of `getRange(numbers)`.
+
+```js
+assert.match(calculate.toString(), /range\s*=\s*getRange\(numbers\);/);
+```
+
+Your `calculate` function should set the `#range` element's `textContent` to the `range` variable.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(('|")#range\1\)\.textContent\s*=\s*range;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+--fcc-editable-region--
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+
+--fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f2a24eb71b24284ca2b6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f2a24eb71b24284ca2b6.md
new file mode 100644
index 00000000000..c19384026eb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352f2a24eb71b24284ca2b6.md
@@ -0,0 +1,178 @@
+---
+id: 6352f2a24eb71b24284ca2b6
+title: Step 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+The
variance of a series represents how much the data deviates from the mean, and can be used to determine how spread out the data are. The variance is calculated in a few steps.
+
+Start by declaring a `getVariance` function that takes an `array` parameter. Within that function, declare a `mean` variable and assign it the value of the `getMean` function, passing `array` as the argument.
+
+# --hints--
+
+You should define a `getVariance` function.
+
+```js
+assert.isFunction(getVariance);
+```
+
+Your `getVariance` function should take an `array` parameter.
+
+```js
+assert.match(getVariance.toString(), /array/);
+```
+
+Your `getVariance` function should declare a `mean` variable.
+
+```js
+assert.match(getVariance.toString(), /mean\s*=/);
+```
+
+Your `mean` variable should be assigned the value of the `getMean` function, passing the `array` argument.
+
+```js
+assert.match(getVariance.toString(), /mean\s*=\s*getMean\(\s*array\s*\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352faf71a9db52631864634.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352faf71a9db52631864634.md
new file mode 100644
index 00000000000..5deeebe823b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352faf71a9db52631864634.md
@@ -0,0 +1,179 @@
+---
+id: 6352faf71a9db52631864634
+title: Step 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+The next step is to calculate how far each element is from the mean. Declare a `differences` variable, and assign it the value of `array.map()`. For the callback, return the value of `el` minus `mean`.
+
+# --hints--
+
+Your `getVariance` function should have a `differences` variable.
+
+```js
+assert.match(getVariance.toString(), /differences\s*=/);
+```
+
+Your `differences` variable should use the `array.map()` method.
+
+```js
+assert.match(getVariance.toString(), /differences\s*=\s*array\.map\(/);
+```
+
+Your `differences` variable should use the `el` parameter in the callback function.
+
+```js
+assert.match(getVariance.toString(), /differences\s*=\s*array\.map\(function\s*\(?\s*el\s*\)?/);
+```
+
+Your `map` callback should return the value of `el` minus `mean`.
+
+```js
+assert.match(getVariance.toString(), /differences\s*=\s*array\.map\(function\s*\(?\s*el\s*\)?\s*\{\s*return\s*el\s*-\s*mean;?\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+--fcc-editable-region--
+const getVariance = (array) => {
+ const mean = getMean(array);
+
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fbb93a91a8272f838d42.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fbb93a91a8272f838d42.md
new file mode 100644
index 00000000000..97df312aae6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fbb93a91a8272f838d42.md
@@ -0,0 +1,190 @@
+---
+id: 6352fbb93a91a8272f838d42
+title: Step 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+The next step is to square each of the differences. To square a value, you can use the `**` operator. For example, `3 ** 2` would return `9`.
+
+Declare a `squaredDifferences` variable, and assign it the value of `differences.map()`. For the callback, return the value of `el` squared.
+
+# --hints--
+
+You should have a `squaredDifferences` variable.
+
+```js
+assert.match(getVariance.toString(), /squaredDifferences\s*=/);
+```
+
+Your `squaredDifferences` variable should use the `differences.map()` method.
+
+```js
+assert.match(getVariance.toString(), /squaredDifferences\s*=\s*differences\.map\(/);
+```
+
+Your `squaredDifferences` variable should use the `el` parameter in the callback function.
+
+```js
+assert.match(getVariance.toString(), /squaredDifferences\s*=\s*differences\.map\(function\s*\(?\s*el\s*\)?/);
+```
+
+Your `map` callback should return the value of `el` squared.
+
+```js
+assert.match(getVariance.toString(), /squaredDifferences\s*=\s*differences\.map\(function\s*\(?\s*el\s*\)?\s*\{\s*return\s*Math\.pow\(\s*el\s*,\s*2\s*\);\s*\}/);
+```
+
+Your `map` callback should use the `**` operator.
+
+```js
+assert.match(code.split("getVariance")[1], /el\s*\*\*\s*2/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+--fcc-editable-region--
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const differences = array.map(
+ el => el - mean
+ );
+
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fcb156834128001ea945.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fcb156834128001ea945.md
new file mode 100644
index 00000000000..a2b550ebf67
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fcb156834128001ea945.md
@@ -0,0 +1,188 @@
+---
+id: 6352fcb156834128001ea945
+title: Step 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Next, you need to take the sum of the squared differences.
+
+Declare a `sumSquaredDifferences` variable, and assign it the value of `squaredDifferences.reduce()`. For the callback, return the sum of `acc` and `el`. Remember to set the initial value to `0`.
+
+# --hints--
+
+You should have a `sumSquaredDifferences` variable.
+
+```js
+assert.match(getVariance.toString(), /sumSquaredDifferences\s*=/);
+```
+
+Your `sumSquaredDifferences` variable should use the `squaredDifferences.reduce()` method.
+
+```js
+assert.match(getVariance.toString(), /sumSquaredDifferences\s*=\s*squaredDifferences\.reduce\(/);
+```
+
+Your `sumSquaredDifferences` variable should use the `acc` and `el` parameters in the callback function.
+
+```js
+assert.match(getVariance.toString(), /sumSquaredDifferences\s*=\s*squaredDifferences\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?/);
+```
+
+Your `reduce` callback should return the sum of `acc` and `el`.
+
+```js
+console.log(getVariance.toString());
+assert.match(getVariance.toString(), /sumSquaredDifferences\s*=\s*squaredDifferences\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*return\s*acc\s*\+\s*el\s*\;\s*\},\s*0\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+--fcc-editable-region--
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const differences = array.map(
+ el => el - mean
+ );
+ const squaredDifferences = differences.map(
+ el => el ** 2
+ );
+
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fce75b2d3b2924930f1e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fce75b2d3b2924930f1e.md
new file mode 100644
index 00000000000..a9de0de327d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fce75b2d3b2924930f1e.md
@@ -0,0 +1,213 @@
+---
+id: 6352fce75b2d3b2924930f1e
+title: Step 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+With two `.map()` calls and a `.reduce()` call, you're creating extra arrays and iterating more times than needed. You should move all of the logic into the `.reduce()` call to save time and memory.
+
+Remove the `differences`, `squaredDifferences`, and `sumSquaredDifferences` variables (and their values). Declare a `variance` variable, and assign it the value of `array.reduce()`. For the callback, pass in your standard `acc` and `el` parameters, but leave the function body empty for now. Don't forget to set the initial value to `0`.
+
+# --hints--
+
+You should remove the `differences` variable.
+
+```js
+assert.notMatch(getVariance.toString(), /differences\s*=/);
+```
+
+You should remove the `squaredDifferences` variable.
+
+```js
+assert.notMatch(getVariance.toString(), /squaredDifferences\s*=/);
+```
+
+You should remove the `sumSquaredDifferences` variable.
+
+```js
+assert.notMatch(getVariance.toString(), /sumSquaredDifferences\s*=/);
+```
+
+You should have a `variance` variable.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=/);
+```
+
+Your `variance` variable should use the `array.reduce()` method.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(/);
+```
+
+Your `variance` variable should use the `acc` and `el` parameters in the callback function.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?/);
+```
+
+Your `reduce` callback should be an empty function.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*\}/);
+```
+
+Your `reduce` callback should have an initial value of `0`.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*\}\s*,\s*0\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+--fcc-editable-region--
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const differences = array.map(
+ el => el - mean
+ );
+ const squaredDifferences = differences.map(
+ el => el ** 2
+ );
+ const sumSquaredDifferences = squaredDifferences.reduce(
+ (acc, el) => acc + el, 0
+ );
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fe473d53592a40ae403b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fe473d53592a40ae403b.md
new file mode 100644
index 00000000000..2a4c44726d9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fe473d53592a40ae403b.md
@@ -0,0 +1,193 @@
+---
+id: 6352fe473d53592a40ae403b
+title: Step 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Within your empty `.reduce()` callback, declare a variable `difference` and set it to the value of `el` minus `mean`. Then declare a `squared` variable, and set it to the value of `difference` to the power of `2`. Finally, return the value of `acc` plus `squared`.
+
+# --hints--
+
+Your `reduce` callback should have a `difference` variable.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*var\s*difference\s*=/);
+```
+
+Your `difference` variable should be set to the value of `el` minus `mean`.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*var\s*difference\s*=\s*el\s*-\s*mean\s*;/);
+```
+
+Your `reduce` callback should have a `squared` variable.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*var\s*difference\s*=\s*el\s*-\s*mean\s*;\s*var\s*squared\s*=/);
+```
+
+Your `squared` variable should be set to the value of `difference` to the power of 2.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*var\s*difference\s*=\s*el\s*-\s*mean\s*;\s*var\s*squared\s*=\s*Math\.pow\(\s*difference\s*,\s*2\s*\);/);
+```
+
+Your `reduce` callback should return the value of `acc` plus `squared`.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*var\s*difference\s*=\s*el\s*-\s*mean\s*;\s*var\s*squared\s*=\s*Math\.pow\(\s*difference\s*,\s*2\s*\);\s*return\s*acc\s*\+\s*squared\s*;/);
+```
+
+You should not remove the initial value of `0` from your `.reduce()` method.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*var\s*difference\s*=\s*el\s*-\s*mean\s*;\s*var\s*squared\s*=\s*Math\.pow\(\s*difference\s*,\s*2\s*\);\s*return\s*acc\s*\+\s*squared\s*;\s*\}\s*,\s*0\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+--fcc-editable-region--
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+
+ }, 0);
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fed209792d2b89e92ea1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fed209792d2b89e92ea1.md
new file mode 100644
index 00000000000..c028581116d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352fed209792d2b89e92ea1.md
@@ -0,0 +1,173 @@
+---
+id: 6352fed209792d2b89e92ea1
+title: Step 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+The final step in calculating the variance is to divide the sum of the squared differences by the count of numbers.
+
+Divide your `.reduce()` call by the length of the array (in your `variance` declaration). Then, return `variance`.
+
+# --hints--
+
+You should divide the result of the `.reduce()` call by the length of the array.
+
+```js
+assert.match(getVariance.toString(), /variance\s*=\s*array\.reduce\(function\s*\(?\s*acc\s*,\s*el\s*\)?\s*\{\s*var\s*difference\s*=\s*el\s*-\s*mean\s*;\s*var\s*squared\s*=\s*Math\.pow\(\s*difference\s*,\s*2\s*\);\s*return\s*acc\s*\+\s*squared\s*;\s*\}\s*,\s*0\)\s*\/\s*array\.length;/);
+```
+
+You should return the value of `variance`.
+
+```js
+assert.match(getVariance.toString(), /return\s*variance\s*;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+--fcc-editable-region--
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0);
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ff27e0e51b2c7dce0010.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ff27e0e51b2c7dce0010.md
new file mode 100644
index 00000000000..2d2caf9b81e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ff27e0e51b2c7dce0010.md
@@ -0,0 +1,174 @@
+---
+id: 6352ff27e0e51b2c7dce0010
+title: Step 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Add your new `getVariance` function to the `calculate` function, and update the respective HTML element.
+
+# --hints--
+
+Your `calculate` function should have a `variance` variable set to the value of `getVariance(numbers)`.
+
+```js
+assert.match(calculate.toString(), /variance\s*=\s*getVariance\(\s*numbers\s*\)/);
+```
+
+You should set the `textContent` of the `#variance` element to the value of the `variance` variable.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(('|")#variance\1\)\.textContent\s*=\s*variance/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0) / array.length;
+ return variance;
+}
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+--fcc-editable-region--
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+
+--fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ffe4cfafa72d595a0007.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ffe4cfafa72d595a0007.md
new file mode 100644
index 00000000000..40bae5a85aa
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6352ffe4cfafa72d595a0007.md
@@ -0,0 +1,190 @@
+---
+id: 6352ffe4cfafa72d595a0007
+title: Step 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Your final calculation is the
standard deviation , which is the square root of the variance.
+
+Begin by declaring a `getStandardDeviation` function, with the `array` parameter. In the function body, declare a `variance` variable and assign it the variance of the `array`.
+
+# --hints--
+
+You should have a `getStandardDeviation` function.
+
+```js
+assert.isFunction(getStandardDeviation);
+```
+
+Your `getStandardDeviation` function should have an `array` parameter.
+
+```js
+assert.match(getStandardDeviation.toString(), /array/);
+```
+
+Your `getStandardDeviation` function should have a `variance` variable.
+
+```js
+assert.match(getStandardDeviation.toString(), /variance\s*=/);
+```
+
+Your `variance` variable should have the value of `getVariance(array)`.
+
+```js
+assert.match(getStandardDeviation.toString(), /variance\s*=\s*getVariance\(\s*array\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0) / array.length;
+ return variance;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+ const variance = getVariance(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+ document.querySelector("#variance").textContent = variance;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353004b235d7a2e0b913f2b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353004b235d7a2e0b913f2b.md
new file mode 100644
index 00000000000..daa8ca0fda1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353004b235d7a2e0b913f2b.md
@@ -0,0 +1,192 @@
+---
+id: 6353004b235d7a2e0b913f2b
+title: Step 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+To calculate a root exponent, such as $\sqrt[n]{x}$, you can use an inverted exponent $x^{1/n}$.
+
+Declare a `standardDeviation` variable, and use the `Math.pow()` function to assign it the value of $variance^{1/2}$.
+
+# --hints--
+
+You should have a `standardDeviation` variable.
+
+```js
+assert.match(getStandardDeviation.toString(), /standardDeviation\s*=/);
+```
+
+Your `standardDeviation` variable should use the `Math.pow()` function.
+
+```js
+assert.match(getStandardDeviation.toString(), /standardDeviation\s*=\s*Math\.pow\(/);
+```
+
+Your `standardDeviation` variable should use the `variance` variable.
+
+```js
+assert.match(getStandardDeviation.toString(), /standardDeviation\s*=\s*Math\.pow\(\s*variance\s*,/);
+```
+
+Your `standardDeviation` variable should use the `1/2` exponent.
+
+```js
+assert.match(getStandardDeviation.toString(), /standardDeviation\s*=\s*Math\.pow\(\s*variance\s*,\s*1\s*\/\s*2\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0) / array.length;
+ return variance;
+}
+
+--fcc-editable-region--
+const getStandardDeviation = (array) => {
+ const variance = getVariance(array);
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+ const variance = getStandardDeviation(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+ document.querySelector("#variance").textContent = variance;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353024f5eab012fa2f57eec.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353024f5eab012fa2f57eec.md
new file mode 100644
index 00000000000..0effb1d2fe9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353024f5eab012fa2f57eec.md
@@ -0,0 +1,175 @@
+---
+id: 6353024f5eab012fa2f57eec
+title: Step 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+The `Math` object has a `.sqrt()` method specifically for finding the square root of a number.
+
+Change your `standardDeviation` variable to use this method instead of `Math.pow()`.
+
+# --hints--
+
+Your `standardDeviation` variable should use `Math.sqrt()`.
+
+```js
+assert.match(getStandardDeviation.toString(), /standardDeviation\s*=\s*Math\.sqrt\(\s*variance\s*\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0) / array.length;
+ return variance;
+}
+
+--fcc-editable-region--
+const getStandardDeviation = (array) => {
+ const variance = getVariance(array);
+ const standardDeviation = Math.pow(variance, 1/2);
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+ const variance = getVariance(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+ document.querySelector("#variance").textContent = variance;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353028147d3c7309017216a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353028147d3c7309017216a.md
new file mode 100644
index 00000000000..760063659a1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6353028147d3c7309017216a.md
@@ -0,0 +1,174 @@
+---
+id: 6353028147d3c7309017216a
+title: Step 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Return your `standardDeviation` variable.
+
+# --hints--
+
+Your `getStandardDeviation` function should return the `standardDeviation` variable.
+
+```js
+assert.match(getStandardDeviation.toString(), /return\s*standardDeviation;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0) / array.length;
+ return variance;
+}
+
+--fcc-editable-region--
+const getStandardDeviation = (array) => {
+ const variance = getVariance(array);
+ const standardDeviation = Math.sqrt(variance);
+
+}
+--fcc-editable-region--
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+ const variance = getVariance(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+ document.querySelector("#variance").textContent = variance;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635302be760d6031d11a06cd.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635302be760d6031d11a06cd.md
new file mode 100644
index 00000000000..015e50b74a6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/635302be760d6031d11a06cd.md
@@ -0,0 +1,182 @@
+---
+id: 635302be760d6031d11a06cd
+title: Step 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Now update the `calculate` function to include the standard deviation logic, like you did with your other functions.
+
+# --hints--
+
+Your `calculate` function should have a `standardDeviation` variable set to the result of `getStandardDeviation(numbers)`.
+
+```js
+assert.match(calculate.toString(), /standardDeviation\s*=\s*getStandardDeviation\(numbers\)/);
+```
+
+You should update the `textContent` of the `#standardDeviation` element to be the `standardDeviation` variable.
+
+```js
+assert.match(calculate.toString(), /document\.querySelector\(('|")#standardDeviation\1\)\.textContent\s*=\s*standardDeviation/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0) / array.length;
+ return variance;
+}
+
+const getStandardDeviation = (array) => {
+ const variance = getVariance(array);
+ const standardDeviation = Math.sqrt(variance);
+ return standardDeviation;
+}
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+--fcc-editable-region--
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+ const variance = getVariance(numbers);
+
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+ document.querySelector("#variance").textContent = variance;
+
+--fcc-editable-region--
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6374249d3fbf2a5b079ba036.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6374249d3fbf2a5b079ba036.md
new file mode 100644
index 00000000000..6ff38ec6626
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-advanced-array-methods-by-building-a-statistics-calculator/6374249d3fbf2a5b079ba036.md
@@ -0,0 +1,344 @@
+---
+id: 6374249d3fbf2a5b079ba036
+title: Step 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+There is one last thing to fix. The `.sort()` method
mutates the array it's called on. It is generally bad practice to mutate a function argument, which `array` is.
+
+To fix this, add an empty `.slice()` call before your `.sort()` method. The empty `.slice()` call will make a shallow copy of the `array`, which you are free to mutate.
+
+# --hints--
+
+You should call `.slice()` on the `array` parameter.
+
+```js
+assert.match(getMedian.toString(), /array\.slice\(\)/);
+```
+
+Your `.sort()` call should be chained to the `.slice()` call.
+
+```js
+assert.match(getMedian.toString(), /array\.slice\(\)\.sort\(/);
+```
+
+You should not modify the `.sort()` method callback.
+
+```js
+assert.match(getMedian.toString(), /array\.slice\(\)\.sort\(function\s*\(\s*a\s*,\s*b\s*\)\s*\{\s*(return)?\s*a\s*\-\s*b/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+--fcc-editable-region--
+const getMedian = (array) => {
+ const sorted = array.sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+--fcc-editable-region--
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0) / array.length;
+ return variance;
+}
+
+const getStandardDeviation = (array) => {
+ const variance = getVariance(array);
+ const standardDeviation = Math.sqrt(variance);
+ return standardDeviation;
+}
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+ const variance = getVariance(numbers);
+ const standardDeviation = getStandardDeviation(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+ document.querySelector("#variance").textContent = variance;
+ document.querySelector("#standardDeviation").textContent = standardDeviation;
+}
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
+
+
Statistics Calculator
+
+
+
Statistics Calculator
+
Enter a list of comma-separated numbers.
+
+ Numbers:
+
+ Calculate
+
+
+
+ The mean of a list of numbers is the average, calculated by
+ taking the sum of all numbers and dividing that by the count of numbers.
+
+
Mean:
+
+ The median of a list of numbers is the number that appears in
+ the middle of the list, when sorted from least to greatest.
+
+
Median:
+
+ The mode of a list of numbers is the number that appears most
+ often in the list.
+
+
Mode:
+
+ The range of a list of numbers is the difference between the
+ largest and smallest numbers in the list.
+
+
Range:
+
+ The variance of a list of numbers measures how far the values
+ are from the mean, on average.
+
+
Variance:
+
+ The standard deviation of a list of numbers is the square
+ root of the variance.
+
+
+ Standard Deviation:
+
+
+
+
+```
+
+```css
+body {
+ margin: 0;
+ background-color: rgb(27, 27, 50);
+ text-align: center;
+ color: #fff;
+}
+
+button {
+ cursor: pointer;
+ background-color: rgb(59, 59, 79);
+ border: 3px solid white;
+ color: white;
+}
+
+input {
+ background-color: rgb(10, 10, 35);
+ color: white;
+ border: 1px solid rgb(59, 59, 79);
+}
+
+.bold {
+ font-weight: bold;
+}
+```
+
+```js
+const getMean = (array) => array.reduce((acc, el) => acc + el, 0) / array.length;
+
+const getMedian = (array) => {
+ const sorted = array.slice().sort((a, b) => a - b);
+ const median =
+ array.length % 2 === 0
+ ? getMean([sorted[array.length / 2], sorted[array.length / 2 - 1]])
+ : sorted[Math.floor(array.length / 2)];
+ return median;
+}
+
+const getMode = (array) => {
+ const counts = {};
+ array.forEach((el) => {
+ counts[el] = (counts[el] || 0) + 1;
+ })
+ if (new Set(Object.values(counts)).size === 1) {
+ return null;
+ }
+ const highest = Object.keys(counts).sort(
+ (a, b) => counts[b] - counts[a]
+ )[0];
+ const mode = Object.keys(counts).filter(
+ (el) => counts[el] === counts[highest]
+ );
+ return mode.join(", ");
+}
+
+const getRange = (array) => {
+ return Math.max(...array) - Math.min(...array);
+}
+
+const getVariance = (array) => {
+ const mean = getMean(array);
+ const variance = array.reduce((acc, el) => {
+ const difference = el - mean;
+ const squared = difference ** 2;
+ return acc + squared;
+ }, 0) / array.length;
+ return variance;
+}
+
+const getStandardDeviation = (array) => {
+ const variance = getVariance(array);
+ const standardDeviation = Math.sqrt(variance);
+ return standardDeviation;
+}
+
+const calculate = () => {
+ const value = document.querySelector("#numbers").value;
+ const array = value.split(/,\s*/g);
+ const numbers = array.map(el => Number(el)).filter(el => !isNaN(el));
+
+ const mean = getMean(numbers);
+ const median = getMedian(numbers);
+ const mode = getMode(numbers);
+ const range = getRange(numbers);
+ const variance = getVariance(numbers);
+ const standardDeviation = getStandardDeviation(numbers);
+
+ document.querySelector("#mean").textContent = mean;
+ document.querySelector("#median").textContent = median;
+ document.querySelector("#mode").textContent = mode;
+ document.querySelector("#range").textContent = range;
+ document.querySelector("#variance").textContent = variance;
+ document.querySelector("#standardDeviation").textContent = standardDeviation;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64061a98f704a014b44afdb2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64061a98f704a014b44afdb2.md
new file mode 100644
index 00000000000..190c2ed141e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64061a98f704a014b44afdb2.md
@@ -0,0 +1,327 @@
+---
+id: 64061a98f704a014b44afdb2
+title: Step 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+In this project, you will be building a number sorter. The HTML and CSS have been provided for you. Feel free to explore them.
+
+When you are ready, declare a `sortButton` variable and assign it the value of `.getElementById()` with the argument `sort`.
+
+# --hints--
+
+You should declare a `sortButton` variable with `const`.
+
+```js
+assert.match(code, /const\s+sortButton\s*=/);
+```
+
+You should call `document.getElementById()` with the argument `sort`.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)sort\1\s*\)/);
+```
+
+You should assign the value of `document.getElementById()` to `sortButton`.
+
+```js
+assert.match(code, /sortButton\s*=\s*document\.getElementById\(\s*('|"|`)sort\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64067c1041a80c366b852407.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64067c1041a80c366b852407.md
new file mode 100644
index 00000000000..d50d904feea
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64067c1041a80c366b852407.md
@@ -0,0 +1,339 @@
+---
+id: 64067c1041a80c366b852407
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+To prepare your project's logic, use `const` and arrow syntax to declare a `sortInputArray` function. It should take a single `event` parameter.
+
+# --hints--
+
+You should declare a `sortInputArray` function with `const`.
+
+```js
+assert.match(code, /const\s+sortInputArray\s*=/);
+```
+
+Your `sortInputArray` should be a function.
+
+```js
+assert.isFunction(sortInputArray);
+```
+
+Your `sortInputArray` should take a single `event` parameter.
+
+```js
+assert.match(code, /const\s+sortInputArray\s*=\s*\(\s*event\s*\)/);
+```
+
+Your `sortInputArray` should use arrow syntax.
+
+```js
+assert.match(code, /const\s+sortInputArray\s*=\s*\(\s*event\s*\)\s*=>/);
+```
+
+Your `sortInputArray` function should be empty.
+
+```js
+assert.match(sortInputArray.toString(), /\(\s*event\s*\)\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406a71d2b35103a340dba06.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406a71d2b35103a340dba06.md
new file mode 100644
index 00000000000..5cbbf56b6ed
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406a71d2b35103a340dba06.md
@@ -0,0 +1,317 @@
+---
+id: 6406a71d2b35103a340dba06
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+You will be using this as an event listener for the `sortButton`. Because buttons associated with a `form` element submit by default, you need to prevent that behavior. Call `event.preventDefault()` in your function to do this.
+
+# --hints--
+
+Your `sortInputArray` function should call `event.preventDefault()`.
+
+```js
+assert.match(sortInputArray.toString(), /event\.preventDefault\(\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+--fcc-editable-region--
+const sortInputArray = (event) => {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406a9945fa5d23c225d31cc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406a9945fa5d23c225d31cc.md
new file mode 100644
index 00000000000..aff0f01b51b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406a9945fa5d23c225d31cc.md
@@ -0,0 +1,331 @@
+---
+id: 6406a9945fa5d23c225d31cc
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+To test your code as you write it, mount an event listener to your `sortButton` element. It should listen for the `click` event, and take `sortInputArray` as the callback.
+
+# --hints--
+
+You should call the `.addEventListener()` method on your `sortButton` element.
+
+```js
+assert.match(code, /sortButton\s*\.\s*addEventListener\s*\(/);
+```
+
+Your `.addEventListener()` method should listen for the `click` event.
+
+```js
+assert.match(code, /sortButton\s*\.\s*addEventListener\s*\(\s*('|"|`)click\1\s*,/);
+```
+
+Your `.addEventListener()` method should take `sortInputArray` as the callback. Remember to pass the function reference, not the function call.
+
+```js
+assert.match(code, /sortButton\s*\.\s*addEventListener\s*\(\s*('|"|`)click\1\s*,\s*sortInputArray\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406adbca6b41d3d7cef85ab.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406adbca6b41d3d7cef85ab.md
new file mode 100644
index 00000000000..046e6ab37cd
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406adbca6b41d3d7cef85ab.md
@@ -0,0 +1,335 @@
+---
+id: 6406adbca6b41d3d7cef85ab
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Back in your `sortInputArray` function, you need to get the values from your `select` elements. Since they all have the class `values-dropdown`, you can query them all at once.
+
+Use `document.getElementsByClassName()` to get all the elements with the class `values-dropdown`. Assign that to an `inputValues` variable.
+
+# --hints--
+
+You should use `document.getElementsByClassName()` to get all the elements with the class `values-dropdown`.
+
+```js
+assert.match(sortInputArray.toString(), /document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)/);
+```
+
+You should assign the result of `document.getElementsByClassName()` to a variable named `inputValues`.
+
+```js
+assert.match(sortInputArray.toString(), /inputValues\s*=\s*document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)/);
+```
+
+You should use `const` to declare `inputValues`.
+
+```js
+assert.match(code, /const\s+inputValues\s*=\s*document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+--fcc-editable-region--
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406bb32f9ed593f26c33b2b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406bb32f9ed593f26c33b2b.md
new file mode 100644
index 00000000000..8f7df60d313
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6406bb32f9ed593f26c33b2b.md
@@ -0,0 +1,329 @@
+---
+id: 6406bb32f9ed593f26c33b2b
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Remember that `.getElementsByClassName()` returns an array-like object. You can use the spread operator to convert it into an array.
+
+Convert the `document.getElementsByClassName()` call to an array with the spread operator and assign it to a variable called `inputValues`.
+
+# --hints--
+
+You should use the spread operator on `document.getElementsByClassName()`.
+
+```js
+assert.match(code, /\.\.\.document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)/);
+```
+
+You should wrap the spread operator and `.getElementsByClassName()` in square brackets to create an array.
+
+```js
+assert.match(code, /\[\s*\.\.\.document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)\s*\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+--fcc-editable-region--
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = document.getElementsByClassName("values-dropdown");
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407b940b8983005578d0824.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407b940b8983005578d0824.md
new file mode 100644
index 00000000000..a3e273cd5b4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407b940b8983005578d0824.md
@@ -0,0 +1,341 @@
+---
+id: 6407b940b8983005578d0824
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+You need to get the values from your `select` elements. However, these values are strings, and you need them to be numbers.
+
+Since you have an array, you can use the `map` method to convert each value to a number. Do this by passing a callback function to `map` that takes a `dropdown` parameter and returns `Number(dropdown.value)`.
+
+# --hints--
+
+You should chain the `map` method directly on your array.
+
+```js
+assert.match(code, /inputValues\s*=\s*\[\s*\.\.\.document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)\s*\]\s*\.map\(/);
+```
+
+Your `map` callback function should use arrow function syntax.
+
+```js
+assert.match(code, /inputValues\s*=\s*\[\s*\.\.\.document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)\s*\]\s*\.map\s*\(\s*\(?dropdown?\)?\s*\s*=>/);
+```
+
+Your `map` callback function should take a `dropdown` parameter.
+
+```js
+assert.match(code, /inputValues\s*=\s*\[\s*\.\.\.document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)\s*\]\s*\.map\s*\(\s*\(?dropdown\s*\)?\s*=>/);
+```
+
+Your `map` callback function should implicitly return `Number(dropdown.value)`.
+
+```js
+assert.match(code, /inputValues\s*=\s*\[\s*\.\.\.document\.getElementsByClassName\(\s*('|"|`)values-dropdown\1\s*\)\s*\]\s*\.map\s*\(\s*\(?dropdown\s*\)?\s*=>\s*Number\s*\(\s*dropdown\.value\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+--fcc-editable-region--
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [...document.getElementsByClassName("values-dropdown")];
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c303b4272606c019f338.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c303b4272606c019f338.md
new file mode 100644
index 00000000000..77e77b395f9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c303b4272606c019f338.md
@@ -0,0 +1,363 @@
+---
+id: 6407c303b4272606c019f338
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+You need a function to update the display with the sorted numbers. Start by using arrow syntax to declare an `updateUI` function that takes a single `array` parameter.
+
+Because you will be writing algorithms that won't immediately have a return value, set a fallback value for `array` to be an empty array. Here is an example of a function that has a fallback value:
+
+```js
+const myFunction = (string = "") => {
+
+}
+```
+
+# --hints--
+
+You should use `const` to declare an `updateUI` variable.
+
+```js
+assert.match(code, /const\s+updateUI\s*=/);
+```
+
+`updateUI` should be a function.
+
+```js
+assert.isFunction(updateUI);
+```
+
+`updateUI` should use arrow syntax.
+
+```js
+assert.match(code, /const\s+updateUI\s*=\s*\(.*\)\s*=>/);
+```
+
+`updateUI` should take a single `array` parameter.
+
+```js
+assert.match(code, /const\s+updateUI\s*=\s*\(\s*array/);
+```
+
+`updateUI` should have a fallback value of an empty array for `array`.
+
+```js
+assert.match(code, /const\s+updateUI\s*=\s*\(\s*array\s*=\s*\[\s*\]\s*\)/);
+```
+
+`updateUI` should be empty.
+
+```js
+assert.match(code, /const\s+updateUI\s*=\s*\(\s*array\s*=\s*\[\s*\]\s*\)\s*=>\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c4abf5be6d07d8c12ade.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c4abf5be6d07d8c12ade.md
new file mode 100644
index 00000000000..e8163807e50
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c4abf5be6d07d8c12ade.md
@@ -0,0 +1,347 @@
+---
+id: 6407c4abf5be6d07d8c12ade
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+To perform an action on each element in the array, use the method that is meant for iterating over arrays.
+
+Use the `forEach()` method, and pass it an empty callback which takes `num` and `i` as the parameters.
+
+# --hints--
+
+You should use the `.forEach()` method to iterate over the `array` parameter.
+
+```js
+assert.match(code, /array\.forEach\(/);
+```
+
+Your `.forEach()` method should take a callback function using arrow syntax.
+
+```js
+assert.match(code, /array\.forEach\s*\(\s*\(.*\)\s*=>/);
+```
+
+Your callback function should take two parameters, `num` and `i`.
+
+```js
+assert.match(code, /array\.forEach\s*\(\s*\(\s*num\s*,\s*i\s*\)\s*=>/);
+```
+
+Your callback function should be empty.
+
+```js
+assert.match(code, /array\.forEach\s*\(\s*\(\s*num\s*,\s*i\s*\)\s*=>\s*{\s*}\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+}
+
+--fcc-editable-region--
+const updateUI = (array = []) => {
+
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c627ddc93708c8dee796.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c627ddc93708c8dee796.md
new file mode 100644
index 00000000000..2c5d47b2578
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c627ddc93708c8dee796.md
@@ -0,0 +1,341 @@
+---
+id: 6407c627ddc93708c8dee796
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Create a variable named `outputValueNode` and set its value to the result of calling the `document.getElementById()` method. Use template literal syntax to pass in the `output-value-${i}` string to `.getElementById()`.
+
+# --hints--
+
+Use `const` to declare an `outputValueNode` variable in your `.forEach()` callback.
+
+```js
+assert.match(code, /array\.forEach\s*\(\s*\(\s*num\s*,\s*i\s*\)\s*=>\s*\{\s*const\s*outputValueNode\s*=/)
+```
+
+`outputValueNode` should be assigned the value of calling `document.getElementById()`.
+
+```js
+assert.match(code, /array\.forEach\s*\(\s*\(\s*num\s*,\s*i\s*\)\s*=>\s*\{\s*const\s*outputValueNode\s*=\s*document\.getElementById\s*\(/)
+```
+
+Use template literal syntax to pass in the `output-value-${i}` string to `.getElementById()`.
+
+```js
+assert.match(code, /array\.forEach\s*\(\s*\(\s*num\s*,\s*i\s*\)\s*=>\s*\{\s*const\s*outputValueNode\s*=\s*document\.getElementById\s*\(\s*`output-value-\$\{i\}`\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+}
+
+--fcc-editable-region--
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+
+ })
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c6a2c2159309994779a5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c6a2c2159309994779a5.md
new file mode 100644
index 00000000000..4821ca6d0cb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c6a2c2159309994779a5.md
@@ -0,0 +1,336 @@
+---
+id: 6407c6a2c2159309994779a5
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Set the `innerText` property of `outputValueNode` to `num`.
+
+# --hints--
+
+You should use `innerText` to set the text of `outputValueNode`.
+
+```js
+assert.match(code, /array\.forEach\s*\(\s*\(\s*num\s*,\s*i\s*\)\s*=>\s*\{\s*const\s*outputValueNode\s*=\s*document\.getElementById\s*\(\s*`output-value-\$\{i\}`\s*\)\s*;?\s*outputValueNode\.innerText/)
+```
+
+You should use `innerText` to set the text of `outputValueNode` to `num`.
+
+```js
+assert.match(code, /array\.forEach\s*\(\s*\(\s*num\s*,\s*i\s*\)\s*=>\s*\{\s*const\s*outputValueNode\s*=\s*document\.getElementById\s*\(\s*`output-value-\$\{i\}`\s*\)\s*;?\s*outputValueNode\.innerText\s*=\s*num;?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+}
+
+--fcc-editable-region--
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+
+ })
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c6d3f19c4e0a7ba320bb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c6d3f19c4e0a7ba320bb.md
new file mode 100644
index 00000000000..e8484393948
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c6d3f19c4e0a7ba320bb.md
@@ -0,0 +1,340 @@
+---
+id: 6407c6d3f19c4e0a7ba320bb
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+In your `sortInputArray()` function, call your `updateUI()` function and pass `inputValues` as the argument.
+
+You should now be able to click the `Sort` button and see the inputted array in the `Output` section.
+
+# --hints--
+
+You should call `updateUI()` in your `sortInputArray()` function.
+
+```js
+assert.match(sortInputArray.toString(), /updateUI\(/);
+```
+
+You should pass `inputValues` as an argument to `updateUI()`.
+
+```js
+assert.match(sortInputArray.toString(), /updateUI\(\s*inputValues\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c722498bc80b76d29073.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c722498bc80b76d29073.md
new file mode 100644
index 00000000000..5dbf3c2389f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6407c722498bc80b76d29073.md
@@ -0,0 +1,360 @@
+---
+id: 6407c722498bc80b76d29073
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Now you need to actually sort the array. The first sorting algorithm you will implement is the bubble sort, which starts at the beginning of the array and 'bubbles up' unsorted values towards the end, iterating through the array until it is completely sorted.
+
+Begin by declaring a `bubbleSort` variable and assigning it an arrow function that takes an `array` parameter.
+
+# --hints--
+
+You should use `const` to declare a `bubbleSort` variable.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=/);
+```
+
+`bubbleSort` should be a function.
+
+```js
+assert.isFunction(bubbleSort);
+```
+
+`bubbleSort` should use arrow syntax.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(.*\)\s*=>/);
+```
+
+`bubbleSort` should take a single `array` parameter.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(?\s*array\s*\)?\s*=>/);
+```
+
+`bubbleSort` should be empty.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(?\s*array\s*\)?\s*=>\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ updateUI(inputValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410da6df463a606dfade96f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410da6df463a606dfade96f.md
new file mode 100644
index 00000000000..c29b8ab41fd
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410da6df463a606dfade96f.md
@@ -0,0 +1,360 @@
+---
+id: 6410da6df463a606dfade96f
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+You'll need to iterate through the array. For simplicity, use a `for` loop to do so.
+
+# --hints--
+
+You should use a `for` loop to iterate through the array.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(/)
+```
+
+Your `for` loop should initialize `i` to `0`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;/);
+```
+
+Your `for` loop should have a condition that checks the value of `i` is less than the length of the array.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;/);
+```
+
+Your `for` loop should increment `i` by `1` each time it runs.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)/);
+```
+
+Your `for` loop should be empty.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*}\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ updateUI(inputValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+--fcc-editable-region--
+const bubbleSort = (array) => {
+
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410dfb965c72108196ef24a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410dfb965c72108196ef24a.md
new file mode 100644
index 00000000000..02662b68c30
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410dfb965c72108196ef24a.md
@@ -0,0 +1,362 @@
+---
+id: 6410dfb965c72108196ef24a
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Because you need to compare elements, you'll need to use a nested `for` loop. This loop should iterate through every element in the array *except* the last one. Use `j` as your inner loop's iterator variable.
+
+# --hints--
+
+You should have a nested `for` loop.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(/);
+```
+
+Your inner `for` loop should initialize `j` to `0`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;/);
+```
+
+Your inner `for` loop should iterate through every element in the array *except* the last one.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)/);
+```
+
+Your inner `for` loop should increment `j` by `1` each time.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)/);
+```
+
+Your inner `for` loop should be empty.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*}\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ updateUI(inputValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+--fcc-editable-region--
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e1b58efc2c091a13bcd9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e1b58efc2c091a13bcd9.md
new file mode 100644
index 00000000000..da0a4869be8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e1b58efc2c091a13bcd9.md
@@ -0,0 +1,358 @@
+---
+id: 6410e1b58efc2c091a13bcd9
+title: Step 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+For debugging purposes, add a `console.log()` call in your inner loop. Pass it the arguments `array`, `array[j]`, and `array[j+1]`.
+
+# --hints--
+
+You should use a `console.log()` call in your inner loop.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(/);
+```
+
+You should pass `array` as the first argument to `console.log()`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,/);
+```
+
+You should pass `array[j]` as the second argument to `console.log()`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,/);
+```
+
+You should pass `array[j+1]` as the third argument to `console.log()`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ updateUI(inputValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+--fcc-editable-region--
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+
+ }
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e3c19c21cd09c32dc7c6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e3c19c21cd09c32dc7c6.md
new file mode 100644
index 00000000000..5d6ceddfbd7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e3c19c21cd09c32dc7c6.md
@@ -0,0 +1,362 @@
+---
+id: 6410e3c19c21cd09c32dc7c6
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+In your `sortInputArray()` function, declare a `sortedValues` variable. Assign it the value of calling `bubbleSort` with your `inputValues` array.
+
+Then, update your `updateUI` call to take `sortedValues` as the parameter.
+
+# --hints--
+
+You should use `const` to declare a `sortedValues` variable.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=/);
+```
+
+`sortedValues` should be assigned the value of calling `bubbleSort` with your `inputValues` array.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*bubbleSort\s*\(\s*inputValues\s*\)/);
+```
+
+`updateUI` should be called with `sortedValues` as the parameter.
+
+```js
+assert.match(code, /updateUI\s*\(\s*sortedValues\s*\)/);
+```
+
+`updateUI` should not be called with `inputValues` as the parameter.
+
+```js
+assert.notMatch(code, /updateUI\s*\(\s*inputValues\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+--fcc-editable-region--
+
+
+ updateUI(inputValues);
+--fcc-editable-region--
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ console.log(array, array[j], array[j + 1]);
+ }
+ }
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e70c84bb660b4d2a5ea1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e70c84bb660b4d2a5ea1.md
new file mode 100644
index 00000000000..dd24c24ed82
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410e70c84bb660b4d2a5ea1.md
@@ -0,0 +1,364 @@
+---
+id: 6410e70c84bb660b4d2a5ea1
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+To achieve the "bubble up" result, you need to check if the current element is larger than the next element. You can do this by accessing the `array` at `j` and `j+1`.
+
+Create an `if` condition that checks if the current element is larger than the next element.
+
+# --hints--
+
+You should not remove your `console.log` statement.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?/);
+```
+
+You should use an `if` statement in your nested loop.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?\s*if\s*\(/);
+```
+
+Your `if` statement should check if the `array[j]` is larger than the `array[j+1]`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*>\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\)/);
+```
+
+Your `if` statement should be empty.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*>\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\)\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = bubbleSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ console.log(array, array[j], array[j + 1]);
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+ }
+ }
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410edb33eeaf50dd9a22ab4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410edb33eeaf50dd9a22ab4.md
new file mode 100644
index 00000000000..7318c7fd6ef
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410edb33eeaf50dd9a22ab4.md
@@ -0,0 +1,366 @@
+---
+id: 6410edb33eeaf50dd9a22ab4
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+When your `if` condition is true, you need to swap the two elements, "bubbling" the larger element up toward the end of the array.
+
+To do this, declare a `temp` variable and assign it the value of `array[j]`. Then assign `array[j]` the value of `array[j + 1]`. Finally, assign `array[j + 1]` the value of `temp`.
+
+# --hints--
+
+Within your `if` statement, you should declare a `temp` variable.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*>\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\)\s*{\s*const\s*temp\s*=/);
+```
+
+You should assign `temp` the value of `array[j]`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*>\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\)\s*{\s*const\s*temp\s*=\s*array\s*\[\s*j\s*\];?\s*array\s*\[\s*j\s*\]\s*=\s*array\s*\[\s*j\s*\+\s*1\s*\];?\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*=\s*temp\s*;?/);
+```
+
+You should assign `array[j]` the value of `array[j + 1]`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*>\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\)\s*{\s*const\s*temp\s*=\s*array\s*\[\s*j\s*\];?\s*array\s*\[\s*j\s*\]\s*=\s*array\s*\[\s*j\s*\+\s*1\s*\];?/);
+```
+
+You should assign `array[j + 1]` the value of `temp`.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*>\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\)\s*{\s*const\s*temp\s*=\s*array\s*\[\s*j\s*\];?\s*array\s*\[\s*j\s*\]\s*=\s*array\s*\[\s*j\s*\+\s*1\s*\];?\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*=\s*temp\s*;?/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = bubbleSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ console.log(array, array[j], array[j + 1]);
+
+--fcc-editable-region--
+ if (array[j] > array[j + 1]) {
+
+ }
+--fcc-editable-region--
+ }
+ }
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410efff0ae97c0f06856511.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410efff0ae97c0f06856511.md
new file mode 100644
index 00000000000..4d3522a57e9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410efff0ae97c0f06856511.md
@@ -0,0 +1,350 @@
+---
+id: 6410efff0ae97c0f06856511
+title: Step 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Finally, after your outer loop has finished executing, return the sorted array.
+
+# --hints--
+
+You should `return` the `array` variable.
+
+```js
+assert.match(code, /const\s+bubbleSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*for\s*\(\s*let\s+j\s*=\s*0\s*;\s*j\s*<\s*array\.length\s*-\s*1\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\s*\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*>\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*\)\s*{\s*const\s*temp\s*=\s*array\s*\[\s*j\s*\];?\s*array\s*\[\s*j\s*\]\s*=\s*array\s*\[\s*j\s*\+\s*1\s*\];?\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*=\s*temp\s*;?\s*}\s*}\s*}\s*return\s*array;?\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = bubbleSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ console.log(array, array[j], array[j + 1]);
+
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f149110ec60fd40fcfe1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f149110ec60fd40fcfe1.md
new file mode 100644
index 00000000000..d55a9a3fb01
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f149110ec60fd40fcfe1.md
@@ -0,0 +1,376 @@
+---
+id: 6410f149110ec60fd40fcfe1
+title: Step 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Time to implement another sorting algorithm. This time, you'll be implementing a
selection sort . Selection sort works by finding the smallest value in the array, then swapping it with the first value in the array. Then, it finds the next smallest value in the array, and swaps it with the second value in the array. It continues iterating through the array until it is completely sorted.
+
+Start by declaring a `selectionSort` variable and assigning it an arrow function that takes an `array` parameter.
+
+# --hints--
+
+You should use `const` to declare a `selectionSort` variable.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=/);
+```
+
+`selectionSort` should be a function.
+
+```js
+assert.isFunction(selectionSort);
+```
+
+`selectionSort` should use arrow syntax.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(?.*\)?\s*=>/);
+```
+
+`selectionSort` should take a single `array` parameter.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(?\s*array/);
+```
+
+`selectionSort` should be empty.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(?\s*array\s*\)?\s*=>\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = bubbleSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f97a721cd1144804b7a8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f97a721cd1144804b7a8.md
new file mode 100644
index 00000000000..5b16143979d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f97a721cd1144804b7a8.md
@@ -0,0 +1,376 @@
+---
+id: 6410f97a721cd1144804b7a8
+title: Step 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Like a bubble sort, a selection sort needs to iterate through the array. Declare a `for` loop to do so.
+
+# --hints--
+
+You should use a `for` loop.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(/);
+```
+
+Your `for` loop should initialize a variable `i` to `0`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*/);
+```
+
+Your `for` loop should have a condition that checks if the value of `i` is less than the length of the array.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*/);
+```
+
+Your `for` loop should increment `i` by `1` each time it runs.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*/);
+```
+
+Your `for` loop should have an empty body.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*}\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = selectionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const selectionSort = (array) => {
+
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f9a443d57414ee50fada.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f9a443d57414ee50fada.md
new file mode 100644
index 00000000000..82503bb02ba
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410f9a443d57414ee50fada.md
@@ -0,0 +1,353 @@
+---
+id: 6410f9a443d57414ee50fada
+title: Step 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Click your `Sort` button to see your bubble sort algorithm in action! If you open the console, you can watch the steps the algorithm takes.
+
+Now that you have confirmed it works, remove your `console.log()` call.
+
+# --hints--
+
+You should remove your `console.log()` call.
+
+```js
+// Thanks loop-protect
+assert.notMatch(bubbleSort.toString(), /console\.log\((?!"Potential infinite)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = bubbleSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+--fcc-editable-region--
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ console.log(array, array[j], array[j + 1]);
+
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410fb3b68429716a810ea4b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410fb3b68429716a810ea4b.md
new file mode 100644
index 00000000000..9d0f2ed1b78
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410fb3b68429716a810ea4b.md
@@ -0,0 +1,386 @@
+---
+id: 6410fb3b68429716a810ea4b
+title: Step 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+A selection sort relies on tracking the index of the smallest value in the array. Declare a variable `minIndex` and set it to `i` - this ensures that if your current value is the smallest, it will be swapped with itself and not be moved. You will need to be able to reassign the value of `minIndex` as you iterate through the array.
+
+Then, write another `for` loop, using `j` as the iterator. This loop needs to start at the index after `i` and iterate through the rest of the array.
+
+# --hints--
+
+You should use `let` to declare `minIndex`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=/)
+```
+
+You should set `minIndex` to `i`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?/)
+```
+
+You should have a nested `for` loop.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(/)
+```
+
+Your `for` loop should initialize `j` to `i + 1`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;/);
+```
+
+Your `for` loop should iterate through the rest of the array.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;/);
+```
+
+Your `for` loop should increment `j`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = selectionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410fcd1f731fd17cdb101a7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410fcd1f731fd17cdb101a7.md
new file mode 100644
index 00000000000..66e5c569719
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6410fcd1f731fd17cdb101a7.md
@@ -0,0 +1,396 @@
+---
+id: 6410fcd1f731fd17cdb101a7
+title: Step 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Inside your nested `for` loop, add a `console.log()` call to check the values of `array`, `array[j]`, and `array[minIndex]` at each iteration. You can click the `Sort` button to see how your algorithm is traversing the array.
+
+Then write an `if` statement that checks if the value at `j` is smaller than the value at `minIndex`. If it is, set `minIndex` to `j`.
+
+# --hints--
+
+You should have a `console.log()` call inside your nested `for` loop.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(/);
+```
+
+You should pass `array` as the first argument to `console.log()`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,/);
+```
+
+You should pass `array[j]` as the second argument to `console.log()`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,/);
+```
+
+You should pass `array[minIndex]` as the third argument to `console.log()`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);?/);
+```
+
+You should have an `if` statement after your `console.log()` call.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);?\s*if\s*\(?/);
+```
+
+You should have a condition in your `if` statement that checks if `array[j]` is less than `array[minIndex]`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*<\s*array\s*\[\s*minIndex\s*\]\s*\)\s*{?/);
+```
+
+Your `if` statement should set `minIndex` to `j`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);?\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*<\s*array\s*\[\s*minIndex\s*\]\s*\)\s*{\s*minIndex\s*=\s*j\s*;?\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = selectionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+
+ }
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411024727181d190ef03166.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411024727181d190ef03166.md
new file mode 100644
index 00000000000..08526189ffd
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411024727181d190ef03166.md
@@ -0,0 +1,383 @@
+---
+id: 6411024727181d190ef03166
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+After your nested `for` loop, you've found the smallest value. You need to swap it with your current value.
+
+Like you did in your bubble sort, use a `temp` variable to extract the value at `i`, then swap the values at `i` and `minIndex`.
+
+# --hints--
+
+After your nested `for` loop, you should declare a `temp` variable.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*<\s*array\s*\[\s*minIndex\s*\]\s*\)\s*{\s*minIndex\s*=\s*j\s*;?\s*}\s*}\s*const\s*temp\s*=/);
+```
+
+You should assign `array[i]` to `temp`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*<\s*array\s*\[\s*minIndex\s*\]\s*\)\s*{\s*minIndex\s*=\s*j\s*;?\s*}\s*}\s*const\s*temp\s*=\s*array\[i\]/)
+```
+
+You should assign `array[minIndex]` to `array[i]`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*<\s*array\s*\[\s*minIndex\s*\]\s*\)\s*{\s*minIndex\s*=\s*j\s*;?\s*}\s*}\s*const\s*temp\s*=\s*array\[i\]\s*;?\s*array\[i\]\s*=\s*array\[minIndex\]/)
+```
+
+You should assign `temp` to `array[minIndex]`.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*<\s*array\s*\[\s*minIndex\s*\]\s*\)\s*{\s*minIndex\s*=\s*j\s*;?\s*}\s*}\s*const\s*temp\s*=\s*array\[i\]\s*;?\s*array\[i\]\s*=\s*array\[minIndex\]\s*;?\s*array\[minIndex\]\s*=\s*temp\s*;?\s*}/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = selectionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ console.log(array, array[j], array[minIndex]);
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110377201e7b1a0de0d558.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110377201e7b1a0de0d558.md
new file mode 100644
index 00000000000..d844250f982
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110377201e7b1a0de0d558.md
@@ -0,0 +1,358 @@
+---
+id: 64110377201e7b1a0de0d558
+title: Step 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Update your `sortedValues` variable to be the result of calling `selectionSort` instead of `bubbleSort`.
+
+# --hints--
+
+Your `sortedValues` variable should be assigned the value of calling `selectionSort` with your `inputValues` array.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*selectionSort\s*\(\s*inputValues\s*\)/);
+```
+
+You should not call `bubbleSort` in your code.
+
+```js
+assert.notMatch(code, /bubbleSort\s*\(/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+--fcc-editable-region--
+ const sortedValues = bubbleSort(inputValues);
+
+ updateUI(sortedValues);
+--fcc-editable-region--
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110727cefd3d1d9bdb0128.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110727cefd3d1d9bdb0128.md
new file mode 100644
index 00000000000..cc545450dce
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110727cefd3d1d9bdb0128.md
@@ -0,0 +1,367 @@
+---
+id: 64110727cefd3d1d9bdb0128
+title: Step 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Finally, after your outer loop has finished, you need to return the array. Once you've done so, you should be able to see the `Output` change when you click the `Sort` button again.
+
+# --hints--
+
+You should `return` the `array` after your outer loop completes.
+
+```js
+assert.match(code, /const\s+selectionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*let\s*minIndex\s*=\s*i\s*;?\s*for\s*\(\s*let\s+j\s*=\s*i\s*\+\s*1\s*;\s*j\s*<\s*array\.length\s*;\s*j\s*\+\+\s*\)\s*{\s*console\.log\(\s*array\s*,\s*array\s*\[\s*j\s*\]\s*,\s*array\s*\[\s*minIndex\s*\]\s*\);\s*if\s*\(\s*array\s*\[\s*j\s*\]\s*<\s*array\s*\[\s*minIndex\s*\]\s*\)\s*{\s*minIndex\s*=\s*j\s*;?\s*}\s*}\s*const\s*temp\s*=\s*array\[i\]\s*;?\s*array\[i\]\s*=\s*array\[minIndex\]\s*;?\s*array\[minIndex\]\s*=\s*temp\s*;?\s*}\s*return\s*array;?\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = selectionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ console.log(array, array[j], array[minIndex]);
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411083020a3101e9514a0f5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411083020a3101e9514a0f5.md
new file mode 100644
index 00000000000..6af94911cb2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411083020a3101e9514a0f5.md
@@ -0,0 +1,368 @@
+---
+id: 6411083020a3101e9514a0f5
+title: Step 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+With your selection sort now functional, remove your `console.log()` statement.
+
+# --hints--
+
+You should remove the `console.log()` statement from `selectionSort()`.
+
+```js
+// Thanks loop-protect
+assert.notMatch(selectionSort.toString(), /console\.log\((?!"Potential infinite)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = selectionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ console.log(array, array[j], array[minIndex]);
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110998bc00321fd8052ab5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110998bc00321fd8052ab5.md
new file mode 100644
index 00000000000..c9c0a649022
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110998bc00321fd8052ab5.md
@@ -0,0 +1,394 @@
+---
+id: 64110998bc00321fd8052ab5
+title: Step 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+The last sorting algorithm you will implement is the
insertion sort . This algorithm works by building up a sorted array at the beginning of the list. It begins the sorted array with the first element. Then it inspects the next element and swaps it backward into the sorted array until it is in a sorted position, and so on.
+
+Start by declaring an `insertionSort` variable and assigning it an arrow function which takes an `array` parameter.
+
+# --hints--
+
+You should use `const` to declare an `insertionSort` variable.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=/);
+```
+
+`insertionSort` should be a function.
+
+```js
+assert.isFunction(insertionSort);
+```
+
+`insertionSort` should use arrow syntax.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(?.*\)?\s*=>/);
+```
+
+`insertionSort` should take a single `array` parameter.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(?\s*array/);
+```
+
+`insertionSort` should be empty.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(?\s*array\s*\)?\s*=>\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = selectionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110a03f6a450209b01f45c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110a03f6a450209b01f45c.md
new file mode 100644
index 00000000000..d9b898256ba
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110a03f6a450209b01f45c.md
@@ -0,0 +1,376 @@
+---
+id: 64110a03f6a450209b01f45c
+title: Step 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+As before, update your `sortedValues` variable to be the result of `insertionSort` instead of `selectionSort`.
+
+# --hints--
+
+You should call `insertionSort` with your `inputValues` array.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*insertionSort\s*\(\s*inputValues\s*\)/);
+```
+
+You should not call `selectionSort` in your code.
+
+```js
+assert.notMatch(code, /selectionSort\s*\(/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+--fcc-editable-region--
+ const sortedValues = selectionSort(inputValues);
+--fcc-editable-region--
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+const insertionSort = (array) => {
+
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110b1849454521871243ca.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110b1849454521871243ca.md
new file mode 100644
index 00000000000..f675ce133c8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64110b1849454521871243ca.md
@@ -0,0 +1,394 @@
+---
+id: 64110b1849454521871243ca
+title: Step 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+An insertion sort algorithm starts the sort at the beginning of the list, meaning the first element is already sorted. With this in mind, create a `for` loop that starts at the second element in the array - it should still iterate through the rest of the array.
+
+# --hints--
+
+You should use a `for` loop to iterate through the array.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(/);
+```
+
+Your `for` loop should initialize `i` at `1`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*/);
+```
+
+Your `for` loop should have a condition that checks the value of `i` is less than the length of the array.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*/);
+```
+
+Your `for` loop should increment `i` by `1` each time it runs.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*/);
+```
+
+Your `for` loop should be empty.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*}\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = insertionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const insertionSort = (array) => {
+
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411108bc8b9c324f66aab4c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411108bc8b9c324f66aab4c.md
new file mode 100644
index 00000000000..0cb92af7d64
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411108bc8b9c324f66aab4c.md
@@ -0,0 +1,390 @@
+---
+id: 6411108bc8b9c324f66aab4c
+title: Step 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Declare a `currValue` variable and assign it the value at `i`. Then, declare a `j` variable and assign it `i - 1`. Your `j` variable should be re-assignable.
+
+# --hints--
+
+You should declare a `currValue` variable with `const`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=/);
+```
+
+You should assign `currValue` the value at `i`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?/);
+```
+
+You should declare a `j` variable with `let`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=/);
+```
+
+You should assign `j` the value of `i - 1`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = insertionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/641110e4fb696b259dbf0bcf.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/641110e4fb696b259dbf0bcf.md
new file mode 100644
index 00000000000..03885122d22
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/641110e4fb696b259dbf0bcf.md
@@ -0,0 +1,404 @@
+---
+id: 641110e4fb696b259dbf0bcf
+title: Step 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+For this algorithm, you'll want to use a `while` loop. This loop needs two conditions:
+
+- First, it should not run beyond the beginning of the array (accessed with `j`).
+- Second, the loop should not run after it finds a value smaller than the current value.
+
+To prevent an infinite loop, decrement `j` inside your loop.
+
+# --hints--
+
+You should use a `while` loop.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?\s*while\s*\(/);
+```
+
+Your `while` loop should have its first condition that checks the value of `j` is greater than or equal to `0`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?\s*while\s*\(\s*j\s*>=\s*0/);
+```
+
+Your `while` loop should use the AND operator.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?\s*while\s*\(\s*j\s*>=\s*0\s*&&/);
+```
+
+Your `while` loop should have a condition that checks the value of `array[j]` is greater than `currValue`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?\s*while\s*\(\s*j\s*>=\s*0\s*&&\s*array\s*\[\s*j\s*\]\s*>\s*currValue\s*\)/);
+```
+
+Your `while` loop should decrement `j` inside the loop.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?\s*while\s*\(\s*j\s*>=\s*0\s*&&\s*array\s*\[\s*j\s*\]\s*>\s*currValue\s*\)\s*{\s*j--;?\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = insertionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411135e9ee2fa26c882eb02.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411135e9ee2fa26c882eb02.md
new file mode 100644
index 00000000000..8a179fb1bd6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/6411135e9ee2fa26c882eb02.md
@@ -0,0 +1,380 @@
+---
+id: 6411135e9ee2fa26c882eb02
+title: Step 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+On each iteration of your `while` loop, it is finding an element that is larger than your current value. You need to move that element to the right to make room for your current value.
+
+Do so by assigning the value at the `j` index to the next index.
+
+# --hints--
+
+Before decrementing `j`, assign the value at `j` to the index `j + 1`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?\s*while\s*\(\s*j\s*>=\s*0\s*&&\s*array\s*\[\s*j\s*\]\s*>\s*currValue\s*\)\s*{\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*=\s*array\s*\[\s*j\s*\];?\s*j--;?\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = insertionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+
+ j--;
+ }
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112c9cf53d632910ea2f9b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112c9cf53d632910ea2f9b.md
new file mode 100644
index 00000000000..024478b8757
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112c9cf53d632910ea2f9b.md
@@ -0,0 +1,381 @@
+---
+id: 64112c9cf53d632910ea2f9b
+title: Step 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+After your while loop, you need to insert your current value. Remember that your loop ends when `j` is either out of the array bounds, or when the value at `j` is less than your current value.
+
+Use the assignment operator to insert your current value into the correct index.
+
+# --hints--
+
+You should assign `currValue` to the index `j + 1`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?\s*while\s*\(\s*j\s*>=\s*0\s*&&\s*array\s*\[\s*j\s*\]\s*>\s*currValue\s*\)\s*{\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*=\s*array\s*\[\s*j\s*\];?\s*j--;?\s*\}\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*=\s*currValue;?/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = insertionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+ array[j + 1] = array[j];
+ j--;
+ }
+
+ }
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112cea9e6ac22a314628b0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112cea9e6ac22a314628b0.md
new file mode 100644
index 00000000000..fac5cceaf01
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112cea9e6ac22a314628b0.md
@@ -0,0 +1,380 @@
+---
+id: 64112cea9e6ac22a314628b0
+title: Step 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+After your `for` loop has finished, you need to return the array. You should then be able to see the `Output` change when you click the `Sort` button again.
+
+# --hints--
+
+You should `return` the `array`.
+
+```js
+assert.match(code, /const\s+insertionSort\s*=\s*\(\s*array\s*\)\s*=>\s*{\s*for\s*\(\s*let\s+i\s*=\s*1\s*;\s*i\s*<\s*array\.length\s*;\s*i\s*\+\+\s*\)\s*{\s*const\s*currValue\s*=\s*array\s*\[\s*i\s*\]\s*;?\s*let\s*j\s*=\s*i\s*-\s*1\s*;?\s*while\s*\(\s*j\s*>=\s*0\s*&&\s*array\s*\[\s*j\s*\]\s*>\s*currValue\s*\)\s*{\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*=\s*array\s*\[\s*j\s*\];?\s*j--;?\s*\}\s*array\s*\[\s*j\s*\+\s*1\s*\]\s*=\s*currValue;?\s*\}\s*return\s*array;?\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = insertionSort(inputValues);
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+--fcc-editable-region--
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+ array[j + 1] = array[j];
+ j--;
+ }
+ array[j + 1] = currValue;
+ }
+
+}
+--fcc-editable-region--
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112d0943e1bb2aef11e2d1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112d0943e1bb2aef11e2d1.md
new file mode 100644
index 00000000000..288667b1296
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112d0943e1bb2aef11e2d1.md
@@ -0,0 +1,392 @@
+---
+id: 64112d0943e1bb2aef11e2d1
+title: Step 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+To sort the elements of an array, you can use the built-in method called `.sort()`. Therefore, you can update the `sortedValues` variable by assigning it the result of calling `.sort()` on the `inputValues` array.
+
+# --hints--
+
+You should update your `sortedValues` variable to be the result of calling the `.sort()` method on your `inputValues` array.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*inputValues\s*\.\s*sort\s*\(/);
+```
+
+You should not pass anything into the `.sort()` method.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*inputValues\s*\.\s*sort\s*\(\s*\)/);
+```
+
+You should not call `selectionSort` in your code.
+
+```js
+assert.notMatch(code, /selectionSort\s*\(/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+--fcc-editable-region--
+ const sortedValues = insertionSort(inputValues);
+
+ updateUI(sortedValues);
+--fcc-editable-region--
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+ array[j + 1] = array[j];
+ j--;
+ }
+ array[j + 1] = currValue;
+ }
+ return array;
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112fa63a0f812c66499a54.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112fa63a0f812c66499a54.md
new file mode 100644
index 00000000000..4bf4b58a7ab
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64112fa63a0f812c66499a54.md
@@ -0,0 +1,392 @@
+---
+id: 64112fa63a0f812c66499a54
+title: Step 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+The `Sort` button may appear to work correctly when clicked, but this is only because all the values in the array are single digits, and the sorting may not work as expected with more complex values.
+
+Change the `value` and text of the `option` element that is `selected` from `1` to `10`, and click the `Sort` button again.
+
+# --hints--
+
+You should update the `value` of the `option` element that is `selected` to `10`.
+
+```js
+const values = document.querySelectorAll('.values-dropdown')?.[3];
+const option = values.querySelector('option[selected]');
+assert.equal(option?.value, '10');
+```
+
+You should update the text of the `option` element that is `selected` to `10`.
+
+```js
+const values = document.querySelectorAll('.values-dropdown')?.[3];
+const option = values.querySelector('option[selected]');
+assert.equal(option?.textContent, '10');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+--fcc-editable-region--
+ 1
+--fcc-editable-region--
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = inputValues.sort();
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+ array[j + 1] = array[j];
+ j--;
+ }
+ array[j + 1] = currValue;
+ }
+ return array;
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/641130423e5f512d8972dae1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/641130423e5f512d8972dae1.md
new file mode 100644
index 00000000000..85f5b0d97bd
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/641130423e5f512d8972dae1.md
@@ -0,0 +1,394 @@
+---
+id: 641130423e5f512d8972dae1
+title: Step 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Notice how the `10` value is placed at the beginning of the array. This is because the default behavior of `.sort()` is to convert the values to strings, and sort them alphabetically. And `10` comes before `2` alphabetically.
+
+To fix this, you can pass a callback function to the `.sort()` method. The callback function takes two arguments - for yours, use `a` and `b`. Leave the function empty for now.
+
+# --hints--
+
+You should pass a callback function to the `.sort()` method. Remember to use arrow syntax.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*inputValues\s*\.\s*sort\s*\(\s*\(?.*\)?\s*=>/);
+```
+
+The callback function should take two arguments, `a` and `b`.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*inputValues\s*\.\s*sort\s*\(\s*\(\s*a\s*,\s*b\s*\)\s*=>/);
+```
+
+The callback function should be empty.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*inputValues\s*\.\s*sort\s*\(\s*\(\s*a\s*,\s*b\s*\)\s*=>\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 10
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+--fcc-editable-region--
+ const sortedValues = inputValues.sort();
+--fcc-editable-region--
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+ array[j + 1] = array[j];
+ j--;
+ }
+ array[j + 1] = currValue;
+ }
+ return array;
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64113124efd2852edafaf25f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64113124efd2852edafaf25f.md
new file mode 100644
index 00000000000..7f52accaf7d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64113124efd2852edafaf25f.md
@@ -0,0 +1,394 @@
+---
+id: 64113124efd2852edafaf25f
+title: Step 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+The callback to `.sort()` should return a number. That number determines how to sort the elements `a` and `b`:
+
+- If the number is negative, sort `a` before `b`.
+- If the number is positive, sort `b` before `a`.
+- If the number is zero, do not change the order of `a` and `b`.
+
+Keeping in mind that you want the numbers to be sorted in ascending order (smallest to largest), return a single subtraction calculation using `a` and `b` that will correctly sort the numbers with the above logic.
+
+# --hints--
+
+Your callback function should use an explicit `return`.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*inputValues\s*\.\s*sort\s*\(\s*\(\s*a\s*,\s*b\s*\)\s*=>\s*{\s*return/);
+```
+
+Your callback function should return `a - b`.
+
+```js
+assert.match(code, /const\s+sortedValues\s*=\s*inputValues\s*\.\s*sort\s*\(\s*\(\s*a\s*,\s*b\s*\)\s*=>\s*{\s*return\s*a\s*-\s*b;?\s*}\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 10
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+--fcc-editable-region--
+ const sortedValues = inputValues.sort((a, b) => {
+
+ });
+--fcc-editable-region--
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+ array[j + 1] = array[j];
+ j--;
+ }
+ array[j + 1] = currValue;
+ }
+ return array;
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64113249bab9952fb2ce4469.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64113249bab9952fb2ce4469.md
new file mode 100644
index 00000000000..54887899f4d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-algorithmic-thinking-by-building-a-number-sorter/64113249bab9952fb2ce4469.md
@@ -0,0 +1,754 @@
+---
+id: 64113249bab9952fb2ce4469
+title: Step 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+If you press the `Sort` button again, you should see that `10` is now in the correct position of the `Output`.
+
+To finish this project, change your `option` back to a `value` and text of `1`.
+
+# --hints--
+
+You should update the `value` of the `option` element that is `selected` to `1`.
+
+```js
+const values = document.querySelectorAll('.values-dropdown')?.[3];
+const option = values.querySelector('option[selected]');
+assert.equal(option?.value, '1');
+```
+
+You should update the text of the `option` element that is `selected` to `1`.
+
+```js
+const values = document.querySelectorAll('.values-dropdown')?.[3];
+const option = values.querySelector('option[selected]');
+assert.equal(option?.textContent, '1');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+--fcc-editable-region--
+ 10
+--fcc-editable-region--
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = inputValues.sort((a, b) => {
+ return a - b;
+ });
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+ array[j + 1] = array[j];
+ j--;
+ }
+ array[j + 1] = currValue;
+ }
+ return array;
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
+
Number Sorter
+
+
+
+ Number Sorter
+
+ Input:
+
+ [
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+ ,
+
+
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+
+
+ ]
+
+ Sort
+
+
+
Output:
+
+
[
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+ ,
+
+
+ 0
+
+
]
+
+
+
+
+
+
+```
+
+```css
+:root {
+ --gray-00: #ffffff;
+ --gray-05: #f5f6f7;
+ --gray-15: #d0d0d5;
+ --gray-75: #3b3b4f;
+ --gray-85: #1b1b32;
+ --gray-90: #0a0a23;
+ --error: #a94442;
+ --danger-color: #850000;
+ --danger-background: #ffadad;
+}
+
+*,
+::before,
+::after {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: "Lato", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ background-color: var(--gray-85);
+ color: var(--gray-05);
+}
+
+main {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+h1 {
+ text-align: center;
+ margin: 30px auto;
+}
+
+h2 {
+ margin-bottom: 15px;
+}
+
+form {
+ width: 100%;
+ padding: 15px auto;
+ text-align: center;
+ padding: 15px;
+}
+
+fieldset {
+ border: 0 none;
+ height: 100%;
+ margin: auto;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+fieldset div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.bracket,
+.comma {
+ font-size: 2.3em;
+}
+
+form .comma {
+ margin-left: 2px;
+}
+
+select {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ min-height: 38px;
+ width: 50px;
+ text-align: center;
+}
+
+button {
+ outline: none;
+ cursor: pointer;
+ margin-top: 15px;
+ text-decoration: none;
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border: 3px solid #feac32;
+ padding: 10px 16px;
+ font-size: 23px;
+ width: 100%;
+}
+
+.output-container {
+ width: 95%;
+ min-height: 55px;
+ margin-top: 25px;
+ border-radius: 0;
+ padding: 15px;
+ overflow-wrap: break-word;
+ text-align: center;
+}
+
+.output-array {
+ width: 100%;
+ margin: auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+
+.output-value {
+ font-size: 2em;
+}
+
+.alert {
+ background-color: var(--danger-background);
+ border: 3px solid var(--danger-color);
+ color: var(--danger-color);
+}
+
+@media (min-width: 550px) {
+ form,
+ .output-container {
+ max-width: 480px;
+ }
+
+ fieldset {
+ max-width: 400px;
+ }
+
+ .output-array {
+ max-width: 420px;
+ }
+}
+```
+
+```js
+const sortButton = document.getElementById("sort");
+
+const sortInputArray = (event) => {
+ event.preventDefault();
+
+ const inputValues = [
+ ...document.getElementsByClassName("values-dropdown")
+ ].map((dropdown) => Number(dropdown.value));
+
+ const sortedValues = inputValues.sort((a, b) => {
+ return a - b;
+ });
+
+ updateUI(sortedValues);
+}
+
+const updateUI = (array = []) => {
+ array.forEach((num, i) => {
+ const outputValueNode = document.getElementById(`output-value-${i}`);
+ outputValueNode.innerText = num;
+ })
+}
+
+const bubbleSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ for (let j = 0; j < array.length - 1; j++) {
+ if (array[j] > array[j + 1]) {
+ const temp = array[j];
+ array[j] = array[j + 1];
+ array[j + 1] = temp;
+ }
+ }
+ }
+
+ return array;
+}
+
+const selectionSort = (array) => {
+ for (let i = 0; i < array.length; i++) {
+ let minIndex = i;
+
+ for (let j = i + 1; j < array.length; j++) {
+ if (array[j] < array[minIndex]) {
+ minIndex = j;
+ }
+ }
+
+ const temp = array[i];
+ array[i] = array[minIndex];
+ array[minIndex] = temp;
+ }
+
+ return array;
+}
+
+const insertionSort = (array) => {
+ for (let i = 1; i < array.length; i++) {
+ const currValue = array[i];
+ let j = i - 1;
+
+ while (j >= 0 && array[j] > currValue) {
+ array[j + 1] = array[j];
+ j--;
+ }
+ array[j + 1] = currValue;
+ }
+ return array;
+}
+
+sortButton.addEventListener("click", sortInputArray);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/5d5a813321b9e3db6c106a46.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/5d5a813321b9e3db6c106a46.md
new file mode 100644
index 00000000000..7af1ecdb62b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/5d5a813321b9e3db6c106a46.md
@@ -0,0 +1,158 @@
+---
+id: 5d5a813321b9e3db6c106a46
+title: Step 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+JavaScript is a powerful language which allows you to build websites that are interactive.
+
+To get started, create your standard HTML boilerplate with a `DOCTYPE`, `html`, `head`, and `body`, then add a `meta` tag for the `charset`. Add a `title` element and use the text `RPG - Dragon Repeller` for it. Include a `link` tag for your stylesheet to link the `styles.css` file.
+
+Finally, create a `div` element with `id` set to `game` within your `body`.
+
+# --hints--
+
+Your code should contain the `DOCTYPE` reference.
+
+```js
+assert(code.match(/` after the type.
+
+```js
+assert(code.match(//gi));
+```
+
+Your `html` element should have an opening tag. Don't forget the `lang` attribute.
+
+```js
+assert(code.match(//gi));
+```
+
+Your `html` element should have a closing tag.
+
+```js
+assert(code.match(/<\/html\s*>/));
+```
+
+Your `DOCTYPE` declaration should be at the beginning of your HTML.
+
+```js
+assert(__helpers.removeHtmlComments(code).match(/^\s*/i));
+```
+
+You should have an opening `head` tag.
+
+```js
+assert(code.match(//i));
+```
+
+You should have a closing `head` tag.
+
+```js
+assert(code.match(/<\/head\s*>/i));
+```
+
+You should have an opening `body` tag.
+
+```js
+assert(code.match(//i));
+```
+
+You should have a closing `body` tag.
+
+```js
+assert(code.match(/<\/body\s*>/i));
+```
+
+The `head` and `body` elements should be siblings.
+
+```js
+assert(document.querySelector('head')?.nextElementSibling?.localName === 'body');
+```
+
+The `head` element should be within the `html` element.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'head'));
+```
+
+The `body` element should be within the `html` element.
+
+```js
+assert([...document.querySelector('html')?.children].some(x => x?.localName === 'body'));
+```
+
+Your code should have a `meta` element.
+
+```js
+const meta = document.querySelector('meta');
+assert.exists(meta);
+```
+
+Your `meta` element should have a `charset` attribute with the value `UTF-8`.
+
+```js
+assert.match(code, /
link');
+assert.exists(link);
+```
+
+You should have a `div` element.
+
+```js
+const div = document.querySelector('div');
+assert.exists(div);
+```
+
+Your `div` element should have an `id` attribute with the value `game`.
+
+```js
+const div = document.querySelector('div');
+assert.equal(div?.id, 'game');
+```
+
+Your `div` element should be within the `body` element.
+
+```js
+const div = document.querySelector('div');
+assert.equal(div?.parentElement?.localName, 'body');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a115879a6d51422652cbfc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a115879a6d51422652cbfc.md
new file mode 100644
index 00000000000..02a51b6a178
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a115879a6d51422652cbfc.md
@@ -0,0 +1,78 @@
+---
+id: 62a115879a6d51422652cbfc
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Create four `div` elements within your `#game` element. Give them the following respective `id` values, in order: `stats`, `controls`, `monsterStats`, and `text`.
+
+# --hints--
+
+You should create four new `div` elements.
+
+```js
+assert.equal(document.querySelectorAll('div')?.length, 5);
+```
+
+You should give one of the new `div` elements an `id` of `stats`.
+
+```js
+assert.exists(document.querySelector('div#stats'));
+```
+
+You should give one of the new `div` elements an `id` of `controls`.
+
+```js
+assert.exists(document.querySelector('div#controls'));
+```
+
+You should give one of the new `div` elements an `id` of `monsterStats`.
+
+```js
+assert.exists(document.querySelector('div#monsterStats'));
+```
+
+You should give one of the new `div` elements an `id` of `text`.
+
+```js
+assert.exists(document.querySelector('div#text'));
+```
+
+You should place the new `div` elements in the correct order.
+
+```js
+function __t(a, b) {
+ return document.querySelector(a)?.nextElementSibling?.getAttribute('id') === b;
+}
+assert(__t('div#stats','controls') && __t('div#controls','monsterStats') && __t('div#monsterStats','text'));
+```
+
+You should place the new `div` elements within the `#game` element.
+
+```js
+assert.equal(document.querySelector('#game')?.children?.length, 4);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
RPG - Dragon Repeller
+
+--fcc-editable-region--
+
+
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a1166ed9a56d439c0770e7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a1166ed9a56d439c0770e7.md
new file mode 100644
index 00000000000..32588eccbae
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a1166ed9a56d439c0770e7.md
@@ -0,0 +1,70 @@
+---
+id: 62a1166ed9a56d439c0770e7
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Create three `span` elements within your `#stats` element. Give each of them the class `stat`. Then give the first one the text `XP: 0`, the second one the text `Health: 100`, and the third one the text `Gold: 50`.
+
+# --hints--
+
+You should have three `span` elements within the `#stats` element.
+
+```js
+const spans = document.querySelectorAll('#stats > span');
+assert.equal(spans?.length, 3);
+```
+
+You should give the new three `span` elements a class of `stat`.
+
+```js
+assert.exists(document.querySelectorAll('#stats > .stat')?.length, 3);
+```
+
+Your first `.stat` element should have the provided text `XP: 0`.
+
+```js
+assert(document.querySelectorAll('#stats > .stat')?.[0]?.innerText === 'XP: 0');
+```
+
+Your second `.stat` element should have the provided text `Health: 100`.
+
+```js
+assert(document.querySelectorAll('#stats > .stat')?.[1]?.innerText === 'Health: 100');
+```
+
+Your third `.stat` element should have the provided text `Gold: 50`.
+
+```js
+assert(document.querySelectorAll('#stats > .stat')?.[2]?.innerText === 'Gold: 50');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
RPG - Dragon Repeller
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23c1d505bfa13747c8a9b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23c1d505bfa13747c8a9b.md
new file mode 100644
index 00000000000..5c62cdc804a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23c1d505bfa13747c8a9b.md
@@ -0,0 +1,167 @@
+---
+id: 62a23c1d505bfa13747c8a9b
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Wrap the numbers `0`, `100`, and `50` in `span` elements, and wrap those new `span` elements in `strong` elements. Then give your new `span` elements `id` values of `xpText`, `healthText`, and `goldText`, respectively.
+
+# --hints--
+
+You should add a `strong` element in your first `.stat` element.
+
+```js
+const stat = document.querySelectorAll('.stat')[0];
+const strong = stat?.querySelector('strong');
+assert.exists(strong);
+```
+
+Your first new `strong` element should have a `span` element.
+
+```js
+const stat = document.querySelectorAll('.stat')[0];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.exists(span);
+```
+
+Your first nested `span` element should have the `id` of `xpText`.
+
+```js
+const stat = document.querySelectorAll('.stat')[0];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.equal(span?.id, 'xpText');
+```
+
+Your first `span` element should be wrapped around the text `0`.
+
+```js
+const stat = document.querySelectorAll('.stat')[0];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.equal(span.innerText, '0');
+```
+
+The text of your first `.stat` element should still be `XP: 0`.
+
+```js
+const stat = document.querySelectorAll('.stat')[0];
+assert.equal(stat.innerText, 'XP: 0');
+```
+
+You should add a `strong` element in your second `.stat` element.
+
+```js
+const stat = document.querySelectorAll('.stat')[1];
+const strong = stat?.querySelector('strong');
+assert.exists(strong);
+```
+
+Your second new `strong` element should have a `span` element.
+
+```js
+const stat = document.querySelectorAll('.stat')[1];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.exists(span);
+```
+
+Your second nested `span` element should have the `id` of `healthText`.
+
+```js
+const stat = document.querySelectorAll('.stat')[1];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.equal(span?.id, 'healthText');
+```
+
+Your second `span` element should be wrapped around the text `100`.
+
+```js
+const stat = document.querySelectorAll('.stat')[1];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.equal(span.innerText, '100');
+```
+
+The text of your second `.stat` element should still be `Health: 100`.
+
+```js
+const stat = document.querySelectorAll('.stat')[1];
+assert.equal(stat.innerText, 'Health: 100');
+```
+
+You should add a `strong` element in your third `.stat` element.
+
+```js
+const stat = document.querySelectorAll('.stat')[2];
+const strong = stat?.querySelector('strong');
+assert.exists(strong);
+```
+
+Your third new `strong` element should have a `span` element.
+
+```js
+const stat = document.querySelectorAll('.stat')[2];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.exists(span);
+```
+
+Your third nested `span` element should have the `id` of `goldText`.
+
+```js
+const stat = document.querySelectorAll('.stat')[2];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.equal(span?.id, 'goldText');
+```
+
+Your third `span` element should be wrapped around the text `50`.
+
+```js
+const stat = document.querySelectorAll('.stat')[2];
+const strong = stat?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.equal(span.innerText, '50');
+```
+
+The text of your third `.stat` element should still be `Gold: 50`.
+
+```js
+const stat = document.querySelectorAll('.stat')[2];
+assert.equal(stat.innerText, 'Gold: 50');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
RPG - Dragon Repeller
+
+
+
+
+--fcc-editable-region--
+ XP: 0
+ Health: 100
+ Gold: 50
+--fcc-editable-region--
+
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23cb9bc467a147516b500.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23cb9bc467a147516b500.md
new file mode 100644
index 00000000000..5a36b14c83c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23cb9bc467a147516b500.md
@@ -0,0 +1,99 @@
+---
+id: 62a23cb9bc467a147516b500
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+For your `#controls` element, create three `button` elements. The first should have the `id` set to `button1`, and the text `Go to store`. The second should have the `id` set to `button2`, and the text `Go to cave`. The third should have the `id` set to `button3`, and the text `Fight dragon`.
+
+# --hints--
+
+You should add three `button` elements to your `#controls` element.
+
+```js
+const buttons = document.querySelectorAll('#controls > button');
+assert.exists(buttons);
+assert.equal(buttons.length, 3);
+```
+
+Your first button should have the `id` set to `button1`.
+
+```js
+const buttons = document.querySelectorAll('#controls > button');
+const button1 = buttons[0];
+assert.equal(button1.id, 'button1');
+```
+
+Your first button should have the text `Go to store`.
+
+```js
+const buttons = document.querySelectorAll('#controls > button');
+const button1 = buttons[0];
+assert.equal(button1.innerText, 'Go to store');
+```
+
+Your second button should have the `id` set to `button2`.
+
+```js
+const buttons = document.querySelectorAll('#controls > button');
+const button2 = buttons[1];
+assert.equal(button2.id, 'button2');
+```
+
+Your second button should have the text `Go to cave`.
+
+```js
+const buttons = document.querySelectorAll('#controls > button');
+const button2 = buttons[1];
+assert.equal(button2.innerText, 'Go to cave');
+```
+
+Your third button should have the `id` set to `button3`.
+
+```js
+const buttons = document.querySelectorAll('#controls > button');
+const button3 = buttons[2];
+assert.equal(button3.id, 'button3');
+```
+
+Your third button should have the text `Fight dragon`.
+
+```js
+const buttons = document.querySelectorAll('#controls > button');
+const button3 = buttons[2];
+assert.equal(button3.innerText, 'Fight dragon');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23d1c5f1c93161f3582ae.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23d1c5f1c93161f3582ae.md
new file mode 100644
index 00000000000..e29a81b0ed9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a23d1c5f1c93161f3582ae.md
@@ -0,0 +1,104 @@
+---
+id: 62a23d1c5f1c93161f3582ae
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Similar to your `#stats` element, your `#monsterStats` element needs two `span` elements. Give them the class `stat` and give the first element the text `Monster Name:` and the second the text `Health:`. After the text in each, add a `strong` element with an empty nested `span` element.
+
+# --hints--
+
+Your `#monsterStats` element should have two `span` elements.
+
+```js
+const spans = document.querySelectorAll(`#monsterStats > span`);
+assert.equal(spans.length, 2);
+```
+
+Your new `span` elements should both have a `class` value of `stat`.
+
+```js
+const spans = document.querySelectorAll(`#monsterStats > span`);
+assert.equal(spans[0].className, 'stat');
+assert.equal(spans[1].className, 'stat');
+```
+
+Your first `span` element should have the text `Monster Name:`. Make sure the spacing is correct.
+
+```js
+const spans = document.querySelectorAll(`#monsterStats > span`);
+assert.equal(spans[0].innerText, 'Monster Name: ');
+```
+
+Your second `span` element should have the text `Health:`. Make sure the spacing is correct.
+
+```js
+const spans = document.querySelectorAll(`#monsterStats > span`);
+assert.equal(spans[1].textContent, 'Health: ');
+```
+
+Your first `span` element should have a `strong` element with an empty nested `span` element.
+
+```js
+const spans = document.querySelectorAll(`#monsterStats > span`);
+const strong = spans[0]?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.exists(strong);
+assert.exists(span);
+```
+
+Your second `span` element should have a `strong` element with an empty nested `span` element.
+
+```js
+const spans = document.querySelectorAll(`#monsterStats > span`);
+const strong = spans[1]?.querySelector('strong');
+const span = strong?.querySelector('span');
+assert.exists(strong);
+assert.exists(span);
+```
+
+Your `strong` and `span` elements should come after the text.
+
+```js
+const spans = document.querySelectorAll(`#monsterStats > span`);
+assert.match(spans[0].innerHTML, /Monster Name:
/);
+assert.match(spans[1].innerHTML, /Health: /);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2401b9842721796b72850.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2401b9842721796b72850.md
new file mode 100644
index 00000000000..2ffdc00b64b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2401b9842721796b72850.md
@@ -0,0 +1,62 @@
+---
+id: 62a2401b9842721796b72850
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Give your `#text` element the following text:
+
+```markup
+Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town.
+You are in the town square. Where do you want to go? Use the buttons above.
+```
+
+# --hints--
+
+Your `#text` element should have the above quoted text.
+
+```js
+const text = document.querySelector('#text');
+assert.equal(text.innerText, "Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24068d60b671847d1d4e2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24068d60b671847d1d4e2.md
new file mode 100644
index 00000000000..4a5a57ad8cf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24068d60b671847d1d4e2.md
@@ -0,0 +1,68 @@
+---
+id: 62a24068d60b671847d1d4e2
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Now we need some quick styling. Start by giving the `body` a `background-color` set to `darkblue`.
+
+# --hints--
+
+You should have a `body` selector.
+
+```js
+const body = new __helpers.CSSHelp(document).getStyle('body');
+assert.exists(body);
+```
+
+Your `body` selector should have a `background-color` property set to `darkblue`.
+
+```js
+const background = new __helpers.CSSHelp(document).getStyle('body')?.getPropertyValue('background-color');
+assert.equal(background, 'darkblue');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2409897ec621942234cf6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2409897ec621942234cf6.md
new file mode 100644
index 00000000000..d59d46387be
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2409897ec621942234cf6.md
@@ -0,0 +1,86 @@
+---
+id: 62a2409897ec621942234cf6
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Give the `#text` element a `background-color` of `black`, a `color` of `white`, and `10px` of padding on all sides.
+
+# --hints--
+
+You should have a `#text` selector.
+
+```js
+const text = new __helpers.CSSHelp(document).getStyle('#text');
+assert.exists(text);
+```
+
+Your `#text` element should have a `background-color` of `black`.
+
+```js
+const background = new __helpers.CSSHelp(document).getStyle('#text')?.getPropertyValue('background-color');
+assert.equal(background, 'black');
+```
+
+Your `#text` element should have a `color` of `white`.
+
+```js
+const color = new __helpers.CSSHelp(document).getStyle('#text')?.getPropertyValue('color');
+assert.equal(color, 'white');
+```
+
+Your `#text` element should have `10px` of padding on all sides.
+
+```js
+const padding = new __helpers.CSSHelp(document).getStyle('#text')?.getPropertyValue('padding');
+assert.equal(padding, '10px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a240c67f3dbb1a1e6d95ee.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a240c67f3dbb1a1e6d95ee.md
new file mode 100644
index 00000000000..b2014568c27
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a240c67f3dbb1a1e6d95ee.md
@@ -0,0 +1,113 @@
+---
+id: 62a240c67f3dbb1a1e6d95ee
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Give your `#game` a maximum width of `500px` and a maximum height of `400px`. Set the `background-color` to `lightgray` and the `color` to `white`. Use margins to center it by setting the top and bottom margin to `0`, and the left and right margin to `auto`. Finally, give it `10px` of padding on all four sides.
+
+# --hints--
+
+You should have a `#game` selector.
+
+```js
+const game = new __helpers.CSSHelp(document).getStyle('#game');
+assert.exists(game);
+```
+
+Your `#game` selector should have a `max-width` of `500px`.
+
+```js
+const maxWidth = new __helpers.CSSHelp(document).getStyle('#game')?.getPropertyValue('max-width');
+assert.equal(maxWidth, '500px');
+```
+
+Your `#game` selector should have a `max-height` of `400px`.
+
+```js
+const maxHeight = new __helpers.CSSHelp(document).getStyle('#game')?.getPropertyValue('max-height');
+assert.equal(maxHeight, '400px');
+```
+
+Your `#game` selector should have a `background-color` of `lightgray`.
+
+```js
+const background = new __helpers.CSSHelp(document).getStyle('#game')?.getPropertyValue('background-color');
+assert.equal(background, 'lightgray');
+```
+
+Your `#game` selector should have a `color` of `white`.
+
+```js
+const color = new __helpers.CSSHelp(document).getStyle('#game')?.getPropertyValue('color');
+assert.equal(color, 'white');
+```
+
+Your `#game` selector should have a `margin` set to `0 auto`.
+
+```js
+const margin = new __helpers.CSSHelp(document).getStyle('#game')?.getPropertyValue('margin');
+assert.equal(margin, '0px auto');
+```
+
+Your `#game` selector should have `10px` of padding on all sides.
+
+```js
+const padding = new __helpers.CSSHelp(document).getStyle('#game')?.getPropertyValue('padding');
+assert.equal(padding, '10px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24128d5e8af1b47ad1aab.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24128d5e8af1b47ad1aab.md
new file mode 100644
index 00000000000..a0a17c0808d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24128d5e8af1b47ad1aab.md
@@ -0,0 +1,101 @@
+---
+id: 62a24128d5e8af1b47ad1aab
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Give both your `#controls` and `#stats` elements a `border` of `1px solid black`, a `black` text color, and `5px` of padding.
+
+# --hints--
+
+You should have a `#controls, #stats` selector.
+
+```js
+const selector = new __helpers.CSSHelp(document).getStyle('#controls, #stats');
+assert.exists(selector);
+```
+
+Your `#controls, #stats` selector should have a `border` of `1px solid black`.
+
+```js
+const border = new __helpers.CSSHelp(document).getStyle('#controls, #stats')?.getPropertyValue('border');
+assert.equal(border, '1px solid black');
+```
+
+Your `#controls, #stats` selector should have a `color` of `black`.
+
+```js
+const color = new __helpers.CSSHelp(document).getStyle('#controls, #stats')?.getPropertyValue('color');
+assert.equal(color, 'black');
+```
+
+Your `#controls, #stats` selector should have `5px` of padding.
+
+```js
+const padding = new __helpers.CSSHelp(document).getStyle('#controls, #stats')?.getPropertyValue('padding');
+assert.equal(padding, '5px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24190868ca51c0b6e83c7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24190868ca51c0b6e83c7.md
new file mode 100644
index 00000000000..1b067833f08
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a24190868ca51c0b6e83c7.md
@@ -0,0 +1,127 @@
+---
+id: 62a24190868ca51c0b6e83c7
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+For now, hide your `#monsterStats` element with the `display` property. Do not change any of the other styling.
+
+# --hints--
+
+You should have a `#monsterStats` selector.
+
+```js
+const monsterStats = new __helpers.CSSHelp(document).getStyle('#monsterStats');
+assert.exists(monsterStats);
+```
+
+Your `#monsterStats` selector should have a `display` property of `none`.
+
+```js
+const display = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('display');
+assert.equal(display, 'none');
+```
+
+Your `#monsterStats` selector should have a `border` of `1px solid black`.
+
+```js
+const border = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('border');
+assert.equal(border, '1px solid black');
+```
+
+Your `#monsterStats` selector should have `5px` of padding.
+
+```js
+const padding = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('padding');
+assert.equal(padding, '5px');
+```
+
+Your `#monsterStats` selector should have a `color` of `white`.
+
+```js
+const color = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('color');
+assert.equal(color, 'white');
+```
+
+Your `#monsterStats` selector should have a `background-color` of `red`.
+
+```js
+const background = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('background-color');
+assert.equal(background, 'red');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+--fcc-editable-region--
+#monsterStats {
+
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a241df03c1f61ce936f5d9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a241df03c1f61ce936f5d9.md
new file mode 100644
index 00000000000..7527ce74825
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a241df03c1f61ce936f5d9.md
@@ -0,0 +1,101 @@
+---
+id: 62a241df03c1f61ce936f5d9
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Finally, give your `.stat` elements a `padding-right` of `10px`.
+
+# --hints--
+
+You should have a `.stat` selector.
+
+```js
+const stat = new __helpers.CSSHelp(document).getStyle('.stat');
+assert.exists(stat);
+```
+
+Your `.stat` selector should have a `padding-right` of `10px`.
+
+```js
+const paddingRight = new __helpers.CSSHelp(document).getStyle('.stat')?.getPropertyValue('padding-right');
+assert.equal(paddingRight, '10px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2509ba163e020bb9d84ea.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2509ba163e020bb9d84ea.md
new file mode 100644
index 00000000000..c65bb85e38f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a2509ba163e020bb9d84ea.md
@@ -0,0 +1,108 @@
+---
+id: 62a2509ba163e020bb9d84ea
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Now you can start writing your JavaScript. Begin by creating a `script` element. This element is used to load JavaScript into your HTML file. You should use an opening `` tag.
+
+# --hints--
+
+You should have a `script` element.
+
+```js
+assert.isAtLeast(document.querySelectorAll('script').length, 2);
+```
+
+Your `script` element should have an opening tag.
+
+```js
+assert.match(code, /
+--fcc-editable-region--
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a257659d0d1e2456f24ba2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a257659d0d1e2456f24ba2.md
new file mode 100644
index 00000000000..9a7aaeaf830
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a257659d0d1e2456f24ba2.md
@@ -0,0 +1,111 @@
+---
+id: 62a257659d0d1e2456f24ba2
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Before you start writing your project code, you should move it to its own file to keep things organized.
+
+Remove your `console.log("Hello World");` line. Then give your now empty `script` element a `src` attribute set to `./script.js`.
+
+# --hints--
+
+You should not have a `console.log("Hello World");` line in your code.
+
+```js
+assert.notMatch(code, /console\.log\("Hello World"\);/);
+```
+
+Your `script` element should have a `src` attribute set to `./script.js`.
+
+```js
+const script = document.querySelector("script[data-src$='script.js']");
+assert.exists(script);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a39f5a5790eb27c1e5d4bf.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a39f5a5790eb27c1e5d4bf.md
new file mode 100644
index 00000000000..af7153531cf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a39f5a5790eb27c1e5d4bf.md
@@ -0,0 +1,102 @@
+---
+id: 62a39f5a5790eb27c1e5d4bf
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Your view has been switched to your new `script.js` file. Remember that you can use the tabs above to switch between files.
+
+Add your `console.log("Hello World");` line to this file, and see it appear in your console.
+
+# --hints--
+
+You should have a `console.log("Hello World");` line in your code.
+
+```js
+assert.match(code, /console\.log\("Hello World"\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a0a3c0a4b32915d26a6e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a0a3c0a4b32915d26a6e.md
new file mode 100644
index 00000000000..b40d5f4cc30
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a0a3c0a4b32915d26a6e.md
@@ -0,0 +1,132 @@
+---
+id: 62a3a0a3c0a4b32915d26a6e
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Remove your `console.log("Hello World");` line to begin writing your project code.
+
+In JavaScript, a variable is used to hold a value. To use a variable, you must first declare it. For example, to declare a variable called `camperbot`, you would write:
+
+```js
+var camperbot;
+```
+
+The `var` keyword tells JavaScript you are declaring a variable. Declare a variable called `xp`.
+
+# --hints--
+
+You should not have a `console.log("Hello World");` line in your code.
+
+```js
+assert.notMatch(code, /console\.log\("Hello World"\);/);
+```
+
+You should use the `var` keyword to declare your variable.
+
+```js
+assert.match(code, /var/);
+```
+
+You should declare a variable named `xp`.
+
+```js
+assert.match(code, /xp/);
+```
+
+You should not assign a value to your variable.
+
+```js
+assert.notMatch(code, /var xp =/);
+```
+
+Don't forget the semi-colon at the end of the line.
+
+```js
+assert.match(code, /var xp;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+console.log("Hello World");
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a488b24fb32b91155d56.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a488b24fb32b91155d56.md
new file mode 100644
index 00000000000..ed933ae49ca
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a488b24fb32b91155d56.md
@@ -0,0 +1,114 @@
+---
+id: 62a3a488b24fb32b91155d56
+title: Step 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Variables can be assigned a value. When you do this while you declare it, this is called initialization . For example:
+
+```js
+var camperbot = "Bot";
+```
+
+This would initialize the `camperbot` variable with a value of `Bot`, a string.
+
+Initialize your `xp` variable to have a value of `0`, a number.
+
+# --hints--
+
+`xp` should have a value of `0`.
+
+```js
+assert.equal(xp, 0);
+```
+
+You should initialize the `xp` variable to `0`. Don't forget the semi-colon at the end of the line.
+
+```js
+assert.match(code, /var\s+xp\s*=\s*0\s*;/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+var xp;
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a75d8466a12e009eff76.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a75d8466a12e009eff76.md
new file mode 100644
index 00000000000..278aa0789fc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a75d8466a12e009eff76.md
@@ -0,0 +1,136 @@
+---
+id: 62a3a75d8466a12e009eff76
+title: Step 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Initialize another variable called `health` with a value of `100`, and a variable called `gold` with a value of `50`.
+
+# --hints--
+
+You should use `var` to declare a variable called `health`.
+
+```js
+assert.match(code, /var health/);
+```
+
+You should initialize a variable called `health` with a value of `100`.
+
+```js
+assert.match(code, /var health\s?=\s?100/);
+```
+
+You should use `var` to declare a variable called `gold`.
+
+```js
+assert.match(code, /var gold/);
+```
+
+You should initialize a variable called `gold` with a value of `50`.
+
+```js
+assert.match(code, /var gold\s?=\s?50/);
+```
+
+`health` should have a value of `100`.
+
+```js
+assert.equal(health, 100);
+```
+
+`gold` should have a value of `50`.
+
+```js
+assert.equal(gold, 50);
+```
+
+`xp` should still have a value of `0`.
+
+```js
+assert.equal(xp, 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+var xp = 0;
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a7e4f1060e2fc5ffb34b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a7e4f1060e2fc5ffb34b.md
new file mode 100644
index 00000000000..606fdeb799a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3a7e4f1060e2fc5ffb34b.md
@@ -0,0 +1,122 @@
+---
+id: 62a3a7e4f1060e2fc5ffb34b
+title: Step 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Create another variable called `currentWeapon` and set it to 0.
+
+When a variable name has multiple words, the convention in JavaScript is to use what's called camelCase . The first word is lowercase, and the first letter of every following word is uppercase.
+
+# --hints--
+
+You should use `var` to declare a variable called `currentWeapon`.
+
+```js
+assert.match(code, /var currentweapon/i);
+```
+
+You should use camelCase to name your variable.
+
+```js
+assert.match(code, /currentWeapon/);
+```
+
+Your `currentWeapon` variable should be set to `0`.
+
+```js
+assert.equal(currentWeapon, 0);
+```
+
+You should initialize your variable to `0`.
+
+```js
+assert.match(code, /var currentWeapon\s?=\s?0/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+var xp = 0;
+var health = 100;
+var gold = 50;
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b365f1cdeb33efc2502e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b365f1cdeb33efc2502e.md
new file mode 100644
index 00000000000..63ecefac153
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b365f1cdeb33efc2502e.md
@@ -0,0 +1,138 @@
+---
+id: 62a3b365f1cdeb33efc2502e
+title: Step 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+You have been declaring your variables with the `var` keyword. However, in modern JavaScript it is best practice to use the `let` keyword instead. This fixes several unusual behaviors with `var` that can make your code difficult to debug.
+
+Change all of your `var` keywords to `let`.
+
+# --hints--
+
+You should not have any `var` keywords in your code.
+
+```js
+assert.notMatch(code, /var/);
+```
+
+You should use the `let` keyword to declare your `xp` variable.
+
+```js
+assert.match(code, /let xp/);
+```
+
+You should use the `let` keyword to declare your `health` variable.
+
+```js
+assert.match(code, /let health/);
+```
+
+You should use the `let` keyword to declare your `gold` variable.
+
+```js
+assert.match(code, /let gold/);
+```
+
+You should use the `let` keyword to declare your `currentWeapon` variable.
+
+```js
+assert.match(code, /let currentWeapon/);
+```
+
+You should not change the values of your variables.
+
+```js
+assert.equal(xp, 0);
+assert.equal(health, 100);
+assert.equal(gold, 50);
+assert.equal(currentWeapon, 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+var xp = 0;
+var health = 100;
+var gold = 50;
+var currentWeapon = 0;
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b3eab50e193608c19fc6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b3eab50e193608c19fc6.md
new file mode 100644
index 00000000000..f4a27916dea
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b3eab50e193608c19fc6.md
@@ -0,0 +1,115 @@
+---
+id: 62a3b3eab50e193608c19fc6
+title: Step 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Using the `let` keyword, declare a variable called `fighting` but do not initialize it with a value. Remember to end your line with a semi-colon.
+
+# --hints--
+
+You should use `let` to declare a variable `fighting`.
+
+```js
+assert.match(code, /let fighting/);
+```
+
+Your `fighting` variable should not have a value.
+
+```js
+assert.isUndefined(fighting);
+```
+
+You should not assign a value to your `fighting` variable. Don't forget the semi-colon at the end of the line.
+
+```js
+assert.match(code, /let fighting;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b41c9494f937560640ab.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b41c9494f937560640ab.md
new file mode 100644
index 00000000000..c679c2cb1fe
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b41c9494f937560640ab.md
@@ -0,0 +1,140 @@
+---
+id: 62a3b41c9494f937560640ab
+title: Step 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Declare two more variables named `monsterHealth` and `inventory`, but do not initialize them.
+
+# --hints--
+
+You should use `let` to declare your `monsterHealth` variable.
+
+```js
+assert.match(code, /let monsterHealth/i);
+```
+
+You should use camelCase to name your `monsterHealth` variable.
+
+```js
+assert.match(code, /monsterHealth/);
+```
+
+`monsterHealth` should not have a value.
+
+```js
+assert.isUndefined(monsterHealth);
+```
+
+You should not assign a value to your `monsterHealth` variable. Remember your semi-colon.
+
+```js
+assert.match(code, /let monsterHealth;/);
+```
+
+You should use `let` to declare your `inventory` variable.
+
+```js
+assert.match(code, /let inventory/i);
+```
+
+`inventory` should not have a value.
+
+```js
+assert.isUndefined(inventory);
+```
+
+You should not assign a value to your `inventory` variable. Remember your semi-colon.
+
+```js
+assert.match(code, /let inventory;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b49686792938718b90d3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b49686792938718b90d3.md
new file mode 100644
index 00000000000..878b7879e25
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b49686792938718b90d3.md
@@ -0,0 +1,118 @@
+---
+id: 62a3b49686792938718b90d3
+title: Step 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+The variables you have assigned have all had values that are numbers. JavaScript has multiple different data types. The next one you will use is the string . Strings are used to store things like words or text. Strings are surrounded with double quotes, single quotes, or backticks. Here is an example of declaring a variable with a string:
+
+```js
+let developer = "Naomi";
+```
+
+Assign the `inventory` variable to have the value of `stick`.
+
+# --hints--
+
+You should set `inventory` to the string `stick`.
+
+```js
+assert.equal(inventory, "stick");
+```
+
+You should initialize your `inventory` variable with the string `stick`.
+
+```js
+assert.match(code, /let\s+inventory\s*=\s*('|"|`)stick\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory;
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b506dbaead396f58a701.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b506dbaead396f58a701.md
new file mode 100644
index 00000000000..ffa211c5e6a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b506dbaead396f58a701.md
@@ -0,0 +1,144 @@
+---
+id: 62a3b506dbaead396f58a701
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+The player's inventory in your game will be able to hold multiple items. You will need to use a data type that can do this. An array can be used to hold multiple values. For example:
+
+```js
+let order = ["first", "second", "third"];
+```
+
+This is an array which holds three values. Notice how the values are separated by commas.
+
+Change your `inventory` variable to be an array with the strings `stick`, `dagger`, and `sword`.
+
+# --hints--
+
+Your `inventory` variable should be an array.
+
+```js
+assert.isArray(inventory);
+```
+
+Your `inventory` variable should have three values.
+
+```js
+assert.lengthOf(inventory, 3);
+```
+
+Your `inventory` variable should include the string `stick`.
+
+```js
+assert.include(inventory, "stick");
+```
+
+Your `inventory` variable should include the string `dagger`.
+
+```js
+assert.include(inventory, "dagger");
+```
+
+Your `inventory` variable should include the string `sword`.
+
+```js
+assert.include(inventory, "sword");
+```
+
+Your `inventory` variable should have the values in the correct order.
+
+```js
+assert.deepEqual(inventory, ["stick", "dagger", "sword"]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = "stick";
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b5843544ce3a77459c27.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b5843544ce3a77459c27.md
new file mode 100644
index 00000000000..f7a00ecb775
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b5843544ce3a77459c27.md
@@ -0,0 +1,118 @@
+---
+id: 62a3b5843544ce3a77459c27
+title: Step 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+For now, you want the player to start with just the `stick`. Change the `inventory` array to have `stick` as its only value.
+
+# --hints--
+
+Your `inventory` variable should still be an array.
+
+```js
+assert.isArray(inventory);
+```
+
+Your `inventory` variable should only have one value.
+
+```js
+assert.lengthOf(inventory, 1);
+```
+
+Your `inventory` variable should include the string `stick`.
+
+```js
+assert.include(inventory, "stick");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick", "dagger", "sword"];
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b79d520a7f3d0e25afd6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b79d520a7f3d0e25afd6.md
new file mode 100644
index 00000000000..66f40a0f63e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3b79d520a7f3d0e25afd6.md
@@ -0,0 +1,130 @@
+---
+id: 62a3b79d520a7f3d0e25afd6
+title: Step 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+JavaScript interacts with the HTML using the Document Object Model , or DOM. The DOM is a tree of objects that represents the HTML. You can access the HTML using the `document` object, which represents your entire HTML document.
+
+One method for finding specific elements in your HTML is using the `querySelector()` method. The `querySelector()` method takes a CSS selector as an argument and returns the first element that matches that selector. For example, to find the `` element in your HTML, you would write:
+
+```js
+let h1 = document.querySelector("h1");
+```
+
+Note that `h1` is a string and matches the CSS selector you would use.
+
+Create a `button1` variable and use `querySelector()` to assign it your element with the `id` of `button1`. Remember that CSS `id` selectors are prefixed with a `#`.
+
+# --hints--
+
+You should use `let` to declare a `button1` variable.
+
+```js
+assert.match(code, /let button1/);
+```
+
+You should use `document.querySelector()`.
+
+```js
+assert.match(code, /document\.querySelector/);
+```
+
+You should use the `#button1` selector.
+
+```js
+assert.match(code, /querySelector\(('|")#button1\1\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3bb9aeefe4b3fc43c6d7b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3bb9aeefe4b3fc43c6d7b.md
new file mode 100644
index 00000000000..0e0eaee9ae7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3bb9aeefe4b3fc43c6d7b.md
@@ -0,0 +1,116 @@
+---
+id: 62a3bb9aeefe4b3fc43c6d7b
+title: Step 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+`button1` is a variable that is not going to be reassigned. If you are not going to assign a new value to a variable, it is best practice to use the `const` keyword to declare it instead of the `let` keyword. This will tell JavaScript to throw an error if you accidentally reassign it.
+
+Change your `button1` variable to be declared with the `const` keyword.
+
+# --hints--
+
+Your `button1` variable should be declared with `const`.
+
+```js
+assert.match(code, /const button1/);
+```
+
+Your `button1` variable should still have the value of your `#button1` element.
+
+```js
+assert.deepEqual(button1, document.querySelector("#button1"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+--fcc-editable-region--
+let button1 = document.querySelector("#button1");
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3bec30ea7f941412512dc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3bec30ea7f941412512dc.md
new file mode 100644
index 00000000000..065f7587076
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3bec30ea7f941412512dc.md
@@ -0,0 +1,181 @@
+---
+id: 62a3bec30ea7f941412512dc
+title: Step 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Just like you did with the buttons, create variables for the following `id`s and use `querySelector()` to give them the element as a value:
+
+`text`, `xpText`, `healthText`, `goldText`, `monsterStats`, and `monsterName`.
+
+Remember to declare these with the `const` keyword, and name the variables to match the `id`s.
+
+# --hints--
+
+You should declare a `text` variable with `const`.
+
+```js
+assert.match(code, /const text/);
+```
+
+Your `text` variable should have the value of your `#text` element.
+
+```js
+assert.deepEqual(text, document.querySelector('#text'));
+```
+
+You should declare a `xpText` variable with `const`.
+
+```js
+assert.match(code, /const xpText/);
+```
+
+Your `xpText` variable should have the value of your `#xpText` element.
+
+```js
+assert.deepEqual(xpText, document.querySelector('#xpText'));
+```
+
+You should declare a `healthText` variable with `const`.
+
+```js
+assert.match(code, /const healthText/);
+```
+
+Your `healthText` variable should have the value of your `#healthText` element.
+
+```js
+assert.deepEqual(healthText, document.querySelector('#healthText'));
+```
+
+You should declare a `goldText` variable with `const`.
+
+```js
+assert.match(code, /const goldText/);
+```
+
+Your `goldText` variable should have the value of your `#goldText` element.
+
+```js
+assert.deepEqual(goldText, document.querySelector('#goldText'));
+```
+
+You should declare a `monsterStats` variable with `const`.
+
+```js
+assert.match(code, /const monsterStats/);
+```
+
+Your `monsterStats` variable should have the value of your `#monsterStats` element.
+
+```js
+assert.deepEqual(monsterStats, document.querySelector('#monsterStats'));
+```
+
+You should declare a `monsterName` variable with `const`.
+
+```js
+assert.match(code, /const monsterName/);
+```
+
+Your `monsterName` variable should have the value of your `#monsterName` element.
+
+```js
+assert.deepEqual(monsterName, document.querySelector('#monsterName'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+--fcc-editable-region--
+const button1 = document.querySelector("#button1");
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c0ab883fd9435cd5c518.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c0ab883fd9435cd5c518.md
new file mode 100644
index 00000000000..e21c2a92cbc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c0ab883fd9435cd5c518.md
@@ -0,0 +1,135 @@
+---
+id: 62a3c0ab883fd9435cd5c518
+title: Step 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Comments allow you to add notes to your code. In JavaScript, single-line comments can be written with `//` and multi-line comments can be written with `/*` and `*/`. For example, here are single and multi-line comments that say "Hello World":
+
+```js
+// hello world
+
+/*
+ hello world
+*/
+```
+
+Add a single-line comment that says `initialize buttons`.
+
+# --hints--
+
+You should use the `//` symbol to start a single-line comment.
+
+```js
+assert.match(code, /\/\//);
+```
+
+Your comment should have the text `initialize buttons`.
+
+```js
+assert.match(code, /\/\/\s*initialize buttons/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c2fccf186146b59c6e96.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c2fccf186146b59c6e96.md
new file mode 100644
index 00000000000..3e53a2bb4f9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c2fccf186146b59c6e96.md
@@ -0,0 +1,140 @@
+---
+id: 62a3c2fccf186146b59c6e96
+title: Step 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+`button1` represents your first `button` element. These elements have a special property called `onclick`, which you can use to determine what happens when someone clicks that button.
+
+You can access properties in JavaScript a couple of different ways. The first is with dot notation . Accessing the `onclick` property of a button would look like:
+
+```js
+button.onclick
+```
+
+Use dot notation to set the `onclick` property of your `button1` to the variable `goStore`. This variable will be something you write later. Note that `button1` is already declared, so you do not need to use `let` or `const`.
+
+# --hints--
+
+You should use dot notation to access the `onclick` property of `button1`.
+
+```js
+assert.match(code, /button1\.onclick/);
+```
+
+You should not use `let` or `const`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button1\.onclick/);
+```
+
+You should set the `onclick` property of `button1` to the variable `goStore`.
+
+```js
+assert.match(code, /button1\.onclick\s*=\s*goStore/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+--fcc-editable-region--
+// initialize buttons
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c4a0e52767482c5202d4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c4a0e52767482c5202d4.md
new file mode 100644
index 00000000000..73d0dc234d9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c4a0e52767482c5202d4.md
@@ -0,0 +1,151 @@
+---
+id: 62a3c4a0e52767482c5202d4
+title: Step 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Using the same syntax, set the `onclick` properties of `button2` and `button3` to `goCave` and `fightDragon` respectively.
+
+# --hints--
+
+You should use dot notation to access the `onclick` property of `button2`.
+
+```js
+assert.match(code, /button2\.onclick/);
+```
+
+You should not use `let` or `const` to assign `button2.onclick`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button2\.onclick/);
+```
+
+You should set the `onclick` property of `button2` to the variable `goCave`.
+
+```js
+assert.match(code, /button2\.onclick\s*=\s*goCave/);
+```
+
+You should use dot notation to access the `onclick` property of `button3`.
+
+```js
+assert.match(code, /button3\.onclick/);
+```
+
+You should not use `let` or `const` to assign `button3.onclick`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button3\.onclick/);
+```
+
+You should set the `onclick` property of `button3` to the variable `fightDragon`.
+
+```js
+assert.match(code, /button3\.onclick\s*=\s*fightDragon/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+--fcc-editable-region--
+// initialize buttons
+button1.onclick = goStore;
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c668afc43b4a134cca81.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c668afc43b4a134cca81.md
new file mode 100644
index 00000000000..38a51618160
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c668afc43b4a134cca81.md
@@ -0,0 +1,150 @@
+---
+id: 62a3c668afc43b4a134cca81
+title: Step 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Functions are special tools that allow you to run sections of code at specific times. You can declare functions using the `function` keyword. Here is an example of a function called `functionName` - note the opening and closing curly braces. These indicate the section of code that is within the function.
+
+```js
+function functionName() {
+
+}
+```
+
+Create an empty function named `goStore`. This will match the `goStore` variable you used earlier.
+
+# --hints--
+
+You should declare `goStore` with the `function` keyword.
+
+```js
+assert.match(code, /function\s*goStore()/);
+```
+
+`goStore` should be defined.
+
+```js
+assert.isDefined(goStore);
+```
+
+`goStore` should be a function.
+
+```js
+assert.isFunction(goStore);
+```
+
+`goStore` should be an empty function.
+
+```js
+assert.equal(goStore.toString(), "function goStore() {}");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c8bf3980c14c438d2aed.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c8bf3980c14c438d2aed.md
new file mode 100644
index 00000000000..ae7f2b797d2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c8bf3980c14c438d2aed.md
@@ -0,0 +1,138 @@
+---
+id: 62a3c8bf3980c14c438d2aed
+title: Step 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+For now, make your `goStore` function output the message `Going to store.` to the console. For example, here is a function that outputs the message `Hello World`.
+
+```js
+function functionName() {
+ console.log("Hello World");
+}
+```
+
+# --hints--
+
+You should have a `console.log("Going to store.");` line in your code. Don't forget the semi-colon.
+
+```js
+assert.match(code, /console\.log\(('|")Going to store\.\1\);/);
+```
+
+Your `console.log("Going to store.");` line should be in your `goStore` function.
+
+```js
+assert.match(goStore.toString(), /console\.log\(('|")Going to store\.\1\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function goStore() {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c91a2bab1b4d6fabb726.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c91a2bab1b4d6fabb726.md
new file mode 100644
index 00000000000..a911182a57c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3c91a2bab1b4d6fabb726.md
@@ -0,0 +1,146 @@
+---
+id: 62a3c91a2bab1b4d6fabb726
+title: Step 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Now create a `goCave` function that prints `Going to cave.` to the console.
+
+# --hints--
+
+You should use the `function` keyword to declare `goCave`.
+
+```js
+assert.match(code, /function goCave/);
+```
+
+`goCave` should be a function.
+
+```js
+assert.isFunction(goCave);
+```
+
+You should have a `console.log("Going to cave.");` line in your code.
+
+```js
+assert.match(code, /console.log\(('|")Going to cave\.\1\)/);
+```
+
+Your `console.log("Going to cave.");` line should be inside your `goCave` function.
+
+```js
+assert.match(goCave.toString(), /console.log\(('|")Going to cave\.\1\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function goStore() {
+ console.log("Going to store.");
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3cdb11478a34ff4a6470d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3cdb11478a34ff4a6470d.md
new file mode 100644
index 00000000000..c14f5a7d858
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3cdb11478a34ff4a6470d.md
@@ -0,0 +1,152 @@
+---
+id: 62a3cdb11478a34ff4a6470d
+title: Step 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+Now create a `fightDragon` function that prints `Fighting dragon.` to the console.
+
+Once you have done that, open your console and try clicking the buttons on your project.
+
+# --hints--
+
+You should use the `function` keyword to declare `fightDragon`.
+
+```js
+assert.match(code, /function fightDragon/);
+```
+
+`fightDragon` should be a function.
+
+```js
+assert.isFunction(fightDragon);
+```
+
+You should have a `console.log("Fighting dragon.");` line in your code.
+
+```js
+assert.match(code, /console.log\(('|")Fighting dragon\.\1\)/);
+```
+
+Your `console.log("Fighting dragon.");` line should be inside your `fightDragon` function.
+
+```js
+assert.match(fightDragon.toString(), /console.log\(('|")Fighting dragon\.\1\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function goStore() {
+ console.log("Going to store.");
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3cfc8328d3351b95d4f61.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3cfc8328d3351b95d4f61.md
new file mode 100644
index 00000000000..fef788f3997
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a3cfc8328d3351b95d4f61.md
@@ -0,0 +1,164 @@
+---
+id: 62a3cfc8328d3351b95d4f61
+title: Step 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+The `innerText` property controls the text that appears in an HTML element. For example:
+
+```js
+const info = document.querySelector("#info");
+info.innerText = "Hello World";
+```
+
+This code would change the element assigned to the `info` variable to have the text `Hello World`.
+
+When a player clicks your `Go to store` button, you want to change the buttons and text. Remove the code inside the `goStore` function and add a line that updates the text of `button1` to say `Buy 10 health (10 gold)`.
+
+# --hints--
+
+You should not have a `console.log("Going to store.");` line in your code.
+
+```js
+assert.notMatch(code, /console.log\(('|")Going to store\.\1\)/);
+```
+
+You should use dot notation to access the `innerText` property of `button1`.
+
+```js
+assert.match(code, /button1\.innerText/);
+```
+
+You should not use `let` or `const` to access the `innerText` property of `button1`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button1.innerText/);
+```
+
+You should update the `innerText` property of `button1` to be `Buy 10 health (10 gold)`.
+
+```js
+assert.match(code, /button1\.innerText\s*=\s*('|")Buy 10 health \(10 gold\)\1/);
+```
+
+You should update the `innerText` property within your `goStore` function.
+
+```js
+assert.match(goStore.toString(), /button1\.innerText\s*=\s*('|")Buy 10 health \(10 gold\)\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ border: 1px solid black;
+ padding: 5px;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function goStore() {
+ console.log("Going to store.");
+}
+--fcc-editable-region--
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7beb1ad61211ac153707f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7beb1ad61211ac153707f.md
new file mode 100644
index 00000000000..fa1d492d7bb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7beb1ad61211ac153707f.md
@@ -0,0 +1,176 @@
+---
+id: 62a7beb1ad61211ac153707f
+title: Step 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Now, add a line that updates the text of `button2` to say `Buy weapon (30 gold)` and update the text of `button3` to say `Go to town square`.
+
+# --hints--
+
+You should use dot notation to access the `innerText` property of `button2`.
+
+```js
+assert.match(code, /button2\.innerText/);
+```
+
+You should not use `let` or `const` to access the `innerText` property of `button2`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button2.innerText/);
+```
+
+You should update the `innerText` property of `button2` to be `Buy weapon (30 gold)`.
+
+```js
+assert.match(code, /button2\.innerText\s*=\s*('|")Buy weapon \(30 gold\)\1/);
+```
+
+You should update the `innerText` property within your `goStore` function.
+
+```js
+assert.match(goStore.toString(), /button2\.innerText\s*=\s*('|")Buy weapon \(30 gold\)\1/);
+```
+
+You should use dot notation to access the `innerText` property of `button3`.
+
+```js
+assert.match(code, /button3\.innerText/);
+```
+
+You should not use `let` or `const` to access the `innerText` property of `button3`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button3.innerText/);
+```
+
+You should update the `innerText` property of `button3` to be `Go to town square`.
+
+```js
+assert.match(code, /button3\.innerText\s*=\s*('|")Go to town square\1/);
+```
+
+You should update the `innerText` property within your `goStore` function.
+
+```js
+assert.match(goStore.toString(), /button3\.innerText\s*=\s*('|")Go to town square\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+}
+--fcc-editable-region--
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bf06d2ad9d1c5024e833.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bf06d2ad9d1c5024e833.md
new file mode 100644
index 00000000000..68eca6d11ce
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bf06d2ad9d1c5024e833.md
@@ -0,0 +1,204 @@
+---
+id: 62a7bf06d2ad9d1c5024e833
+title: Step 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+You will also need to update the functions that run when the buttons are clicked again.
+
+In your `goStore()` function, update the `onclick` property for each button to run `buyHealth`, `buyWeapon`, and `goTown`, respectively.
+
+# --hints--
+
+You should use dot notation to access the `onclick` property of `button1`.
+
+```js
+assert.match(code, /button1\.onclick/);
+```
+
+You should not use `let` or `const` to access the `onclick` property of `button1`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button1.onclick/);
+```
+
+You should set the `onclick` property of `button1` to be `buyHealth`.
+
+```js
+assert.match(code, /button1\.onclick\s*=\s*buyHealth/);
+```
+
+You should set the `onclick` property of `button1` in your `goStore` function.
+
+```js
+assert.match(goStore.toString(), /button1\.onclick\s*=\s*buyHealth/);
+```
+
+You should use dot notation to access the `onclick` property of `button2`.
+
+```js
+assert.match(code, /button2\.onclick/);
+```
+
+You should not use `let` or `const` to access the `onclick` property of `button2`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button2.onclick/);
+```
+
+You should set the `onclick` property of `button2` to be `buyWeapon`.
+
+```js
+assert.match(code, /button2\.onclick\s*=\s*buyWeapon/);
+```
+
+You should set the `onclick` property of `button2` in your `goStore` function.
+
+```js
+assert.match(goStore.toString(), /button2\.onclick\s*=\s*buyWeapon/);
+```
+
+You should use dot notation to access the `onclick` property of `button3`.
+
+```js
+assert.match(code, /button3\.onclick/);
+```
+
+You should not use `let` or `const` to access the `onclick` property of `button3`.
+
+```js
+assert.notMatch(code, /(let|const)\s+button3.onclick/);
+```
+
+You should set the `onclick` property of `button3` to be `goTown`.
+
+```js
+assert.match(code, /button3\.onclick\s*=\s*goTown/);
+```
+
+You should set the `onclick` property of `button3` in your `goStore` function.
+
+```js
+assert.match(goStore.toString(), /button3\.onclick\s*=\s*goTown/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+}
+--fcc-editable-region--
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bfabe119461eb13ccbd6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bfabe119461eb13ccbd6.md
new file mode 100644
index 00000000000..b125957c6a9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bfabe119461eb13ccbd6.md
@@ -0,0 +1,157 @@
+---
+id: 62a7bfabe119461eb13ccbd6
+title: Step 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Now you need to modify your display text. Change the `innerText` property of the `text` to be `You enter the store.`.
+
+# --hints--
+
+You should use dot notation to access the `innerText` property of `text`.
+
+```js
+assert.match(code, /text\.innerText/);
+```
+
+You should not use `let` or `const` to access the `innerText` property of `text`.
+
+```js
+assert.notMatch(code, /(let|const)\s+text.innerText/);
+```
+
+You should update the `innerText` property of `text` to be `You enter the store.`.
+
+```js
+assert.match(code, /text\.innerText\s*=\s*('|")You enter the store.\1/);
+```
+
+You should update the `innerText` property within your `goStore` function.
+
+```js
+assert.match(goStore.toString(), /text\.innerText\s*=\s*('|")You enter the store.\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+}
+--fcc-editable-region--
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bfd9179b7f1f6a15fb1e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bfd9179b7f1f6a15fb1e.md
new file mode 100644
index 00000000000..ae7d6df92f7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7bfd9179b7f1f6a15fb1e.md
@@ -0,0 +1,172 @@
+---
+id: 62a7bfd9179b7f1f6a15fb1e
+title: Step 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Create three new empty functions called `buyHealth`, `buyWeapon`, and `goTown`.
+
+# --hints--
+
+You should declare `buyHealth` with the `function` keyword.
+
+```js
+assert.match(code, /function buyHealth/);
+```
+
+You should declare `buyWeapon` with the `function` keyword.
+
+```js
+assert.match(code, /function buyWeapon/);
+```
+
+You should declare `goTown` with the `function` keyword.
+
+```js
+assert.match(code, /function goTown/);
+```
+
+`buyHealth` should be an empty function.
+
+```js
+assert.equal(buyHealth.toString(), 'function buyHealth() {}');
+```
+
+`buyWeapon` should be an empty function.
+
+```js
+assert.equal(buyWeapon.toString(), 'function buyWeapon() {}');
+```
+
+`goTown` should be an empty function.
+
+```js
+assert.equal(goTown.toString(), 'function goTown() {}');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c011eef9fb2084b966db.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c011eef9fb2084b966db.md
new file mode 100644
index 00000000000..b985f7eded3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c011eef9fb2084b966db.md
@@ -0,0 +1,162 @@
+---
+id: 62a7c011eef9fb2084b966db
+title: Step 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Move your `goTown` function above your `goStore` function. Then copy and paste the contents of the `goStore` function into the `goTown` function.
+
+# --hints--
+
+Your `goTown` function should come before your `goStore` function.
+
+```js
+const goTown = code.split(" ").indexOf("goTown()");
+const goStore = code.split(" ").indexOf("goStore()");
+assert.isBelow(goTown, goStore);
+```
+
+Your `goTown` function should have the same contents as your `goStore` function.
+
+```js
+const goTownString = goTown.toString().replace("goTown", "");
+const goStoreString = goStore.toString().replace("goStore", "");
+assert.equal(goTownString, goStoreString);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+--fcc-editable-region--
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+
+function goTown() {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c071219da921758a35bb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c071219da921758a35bb.md
new file mode 100644
index 00000000000..b705fbbde4e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c071219da921758a35bb.md
@@ -0,0 +1,196 @@
+---
+id: 62a7c071219da921758a35bb
+title: Step 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+In your `goTown` function, change your `button` elements' `innerText` properties to be `Go to store`, `Go to cave`, and `Fight dragon`. Update your `onclick` properties to be `goStore`, `goCave`, and `fightDragon`, respectively.
+
+Finally, update your text's `innerText` property to be `You are in the town square. You see a sign that says Store.`.
+
+# --hints--
+
+You should set the `button1.innerText` property to be `Go to store` in your `goTown` function.
+
+```js
+assert.match(goTown.toString(), /button1\.innerText\s*=\s*('|")Go to store\1/);
+```
+
+You should set the `button2.innerText` property to be `Go to cave` in your `goTown` function.
+
+```js
+assert.match(goTown.toString(), /button2\.innerText\s*=\s*('|")Go to cave\1/);
+```
+
+You should set the `button3.innerText` property to be `Fight dragon` in your `goTown` function.
+
+```js
+assert.match(goTown.toString(), /button3\.innerText\s*=\s*('|")Fight dragon\1/);
+```
+
+You should set the `button1.onclick` property to be `goStore` in your `goTown` function.
+
+```js
+assert.match(goTown.toString(), /button1\.onclick\s*=\s*goStore/);
+```
+
+You should set the `button2.onclick` property to be `goCave` in your `goTown` function.
+
+```js
+assert.match(goTown.toString(), /button2\.onclick\s*=\s*goCave/);
+```
+
+You should set the `button3.onclick` property to be `fightDragon` in your `goTown` function.
+
+```js
+assert.match(goTown.toString(), /button3\.onclick\s*=\s*fightDragon/);
+```
+
+You should set the `text.innerText` property to be `You are in the town square. You see a sign that says Store.` in your `goTown` function.
+
+```js
+assert.match(goTown.toString(), /text\.innerText\s*=\s*('|")You are in the town square. You see a sign that says Store\.\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function goTown() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+--fcc-editable-region--
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c23e6b511f22ed71197a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c23e6b511f22ed71197a.md
new file mode 100644
index 00000000000..6b26d69619b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7c23e6b511f22ed71197a.md
@@ -0,0 +1,164 @@
+---
+id: 62a7c23e6b511f22ed71197a
+title: Step 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+You need to wrap the text `Store` in double quotes. Because your string is already wrapped in double quotes, you'll need to escape the quotes around `Store`. You can escape them with a backslash `\`. Here is an example:
+
+```js
+const escapedString = "Naomi likes to play \"Zelda\" sometimes.";
+```
+
+Wrap the text `Store` in double quotes within your `text.innerText` line.
+
+# --hints--
+
+You should wrap the text `Store` in double quotes.
+
+```js
+assert.match(goTown.toString(), /text\.innerText\s*=\s*"You are in the town square. You see a sign that says \\"Store\\"."/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says Store.";
+}
+--fcc-editable-region--
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7cc99577fbf25ee7a7d76.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7cc99577fbf25ee7a7d76.md
new file mode 100644
index 00000000000..82ae722f3d8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a7cc99577fbf25ee7a7d76.md
@@ -0,0 +1,180 @@
+---
+id: 62a7cc99577fbf25ee7a7d76
+title: Step 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+You have repetition in the `goTown` and `goStore` functions. When you have repetition in your code, this is a sign that you need another function. Functions can take parameters, which are values that are given to the function each time it is run. Here is a function that takes a parameter called `param`:
+
+```js
+function myFunction(param) {
+ console.log(param);
+}
+```
+
+Create an empty `update` function that takes a parameter called `location`.
+
+# --hints--
+
+You should use the `function` keyword to declare `update`.
+
+```js
+assert.match(code, /function\s+update/);
+```
+
+Your `update` function should take a parameter called `location`.
+
+```js
+assert.match(update.toString(), /update\(location\)/);
+```
+
+Your `update` function should be empty.
+
+```js
+assert.equal(update.toString(), function update(location) {});
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8a929e4260d08093756d2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8a929e4260d08093756d2.md
new file mode 100644
index 00000000000..a36f9b9f86e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8a929e4260d08093756d2.md
@@ -0,0 +1,176 @@
+---
+id: 62a8a929e4260d08093756d2
+title: Step 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Create a variable called `locations` and set it to an empty array.
+
+# --hints--
+
+You should use `const` to declare `locations`.
+
+```js
+assert.match(code, /const locations/);
+```
+
+`locations` should be an array.
+
+
+```js
+assert.isArray(locations);
+```
+
+`locations` should be empty.
+
+```js
+assert.equal(locations.length, 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8a9d876b2580943ba9351.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8a9d876b2580943ba9351.md
new file mode 100644
index 00000000000..2f2acfb02a8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8a9d876b2580943ba9351.md
@@ -0,0 +1,173 @@
+---
+id: 62a8a9d876b2580943ba9351
+title: Step 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+You previously used an array to store strings. But arrays can store any data type. This time, your array will be storing objects. Objects are similar to arrays, but with a few differences. One difference is that objects use properties, or keys, to access and modify data.
+
+Objects are indicated by curly braces. An empty object would look like `{}`.
+
+Add an empty object to your `locations` array.
+
+# --hints--
+
+Your first value of `locations` should be an object.
+
+```js
+assert.isObject(locations[0]);
+```
+
+Your first value of `locations` should be an empty object.
+
+```js
+assert.deepEqual(locations[0], {});
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+const locations = [];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8aa98a8289d0a698eee1d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8aa98a8289d0a698eee1d.md
new file mode 100644
index 00000000000..28ff0bb1ad6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8aa98a8289d0a698eee1d.md
@@ -0,0 +1,187 @@
+---
+id: 62a8aa98a8289d0a698eee1d
+title: Step 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Object properties are written as `key: value` pairs, where `key` is the name of the property (or the key), and `value` is the value that property holds. For example, here is an object with a key of `name` set to `Quincy Larson`.
+
+```js
+{
+ name: "Quincy Larson"
+}
+```
+
+Add a `name` property to your empty object and give it a value of `town square`.
+
+# --hints--
+
+Your first value of `locations` should be an object.
+
+```js
+assert.isObject(locations[0]);
+```
+
+Your first value of `locations` should have a `name` property.
+
+```js
+assert.isDefined(locations[0].name);
+```
+
+Your first value of `locations` should have a `name` property with a value of `town square`.
+
+```js
+assert.equal(locations[0].name, "town square");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+const locations = [
+ {
+
+ }
+];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ab0e27cbaf0b54ba8a42.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ab0e27cbaf0b54ba8a42.md
new file mode 100644
index 00000000000..fabd7a7b6c2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ab0e27cbaf0b54ba8a42.md
@@ -0,0 +1,200 @@
+---
+id: 62a8ab0e27cbaf0b54ba8a42
+title: Step 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Just like array values, object properties are separated by a comma. Add a comma after your `name` property and add a `button text` property with the value of an empty array.
+
+Note that, because the property name has more than one word, you'll need to surround it in quotes. For example:
+
+```js
+{
+ name: "Naomi",
+ "favorite color": "purple"
+}
+```
+
+# --hints--
+
+Your first `locations` value should be an object.
+
+```js
+assert.isObject(locations[0]);
+```
+
+Your first `locations` value should have a `button text` property.
+
+```js
+assert.isDefined(locations[0]["button text"]);
+```
+
+Your first `locations` value should have a `button text` property with a value that is an array.
+
+```js
+assert.isArray(locations[0]["button text"]);
+```
+
+Your first `locations` value should have a `button text` property with a value that is an empty array.
+
+```js
+assert.equal(locations[0]["button text"].length, 0);
+```
+
+You should not remove or change the `name` property.
+
+```js
+assert.equal(locations[0].name, "town square");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square"
+ }
+];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ac194679e60cb561b0a8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ac194679e60cb561b0a8.md
new file mode 100644
index 00000000000..5a1412cf312
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ac194679e60cb561b0a8.md
@@ -0,0 +1,194 @@
+---
+id: 62a8ac194679e60cb561b0a8
+title: Step 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+Give your empty `button text` array three string elements. Use the three strings being assigned to the button `innerText` properties in the `goTown` function. Remember that array values are separated by commas.
+
+# --hints--
+
+Your `button text` array should have three elements.
+
+```js
+assert.lengthOf(locations[0]["button text"], 3);
+```
+
+Your `button text` array should have three strings.
+
+```js
+assert.isString(locations[0]["button text"][0]);
+assert.isString(locations[0]["button text"][1]);
+assert.isString(locations[0]["button text"][2]);
+```
+
+The first value in the `button text` array should be "Go to store".
+
+```js
+assert.equal(locations[0]["button text"][0], "Go to store");
+```
+
+The second value in the `button text` array should be "Go to cave".
+
+```js
+assert.equal(locations[0]["button text"][1], "Go to cave");
+```
+
+The third value in the `button text` array should be "Fight dragon".
+
+```js
+assert.equal(locations[0]["button text"][2], "Fight dragon");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": []
+ }
+];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ad8e01d7cb0deae5ec66.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ad8e01d7cb0deae5ec66.md
new file mode 100644
index 00000000000..1229366bb3a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ad8e01d7cb0deae5ec66.md
@@ -0,0 +1,198 @@
+---
+id: 62a8ad8e01d7cb0deae5ec66
+title: Step 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Create another property in your object called `button functions`. Give this property an array containing the three functions assigned to the `onclick` properties in the `goTown` function. Remember that these functions are variables, not strings, and should not be wrapped in quotes.
+
+# --hints--
+
+Your first `locations` object should have a `button functions` property.
+
+```js
+assert.isDefined(locations[0]["button functions"]);
+```
+
+Your `button functions` property should be an array.
+
+```js
+assert.isArray(locations[0]["button functions"]);
+```
+
+Your `button functions` property should have three values in it.
+
+```js
+assert.lengthOf(locations[0]["button functions"], 3);
+```
+
+Your first `button functions` array value should be the function `goStore`.
+
+```js
+assert.equal(locations[0]["button functions"][0], goStore);
+```
+
+Your second `button functions` array value should be the function `goCave`.
+
+```js
+assert.equal(locations[0]["button functions"][1], goCave);
+```
+
+Your third `button functions` array value should be the function `fightDragon`.
+
+```js
+assert.equal(locations[0]["button functions"][2], fightDragon);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"]
+ }
+];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ade9b2f5b30ef0b606c2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ade9b2f5b30ef0b606c2.md
new file mode 100644
index 00000000000..7ac20d72a3e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ade9b2f5b30ef0b606c2.md
@@ -0,0 +1,181 @@
+---
+id: 62a8ade9b2f5b30ef0b606c2
+title: Step 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+Add one final property to the object named `text`. Give this property the final `text.innerText` value from the `goTown` function.
+
+# --hints--
+
+Your first `locations` value should have a `text` property.
+
+```js
+assert.isDefined(locations[0]["text"]);
+```
+
+Your `text` property should be a string.
+
+```js
+assert.isString(locations[0]["text"]);
+```
+
+Your `text` property should have the value `You are in the town square. You see a sign that says \"Store\".`
+
+```js
+assert.equal(locations[0]["text"], "You are in the town square. You see a sign that says \"Store\".");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon]
+ }
+];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ae85fcaedc0fddc7ca4f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ae85fcaedc0fddc7ca4f.md
new file mode 100644
index 00000000000..79d6d140e1e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ae85fcaedc0fddc7ca4f.md
@@ -0,0 +1,235 @@
+---
+id: 62a8ae85fcaedc0fddc7ca4f
+title: Step 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Add a second object to your `locations` array (remember to separate them with a comma). Following the pattern you used in the first object, create the same properties but use the values from the `goStore` function. Set the `name` property to `store`.
+
+# --hints--
+
+Your `locations` array should have two values.
+
+```js
+assert.lengthOf(locations, 2);
+```
+
+Both `locations` values should be objects.
+
+
+```js
+assert.isObject(locations[0]);
+assert.isObject(locations[1]);
+```
+
+Your second `locations` object should have a `name` property with the value of `store`.
+
+```js
+assert.equal(locations[1].name, "store");
+```
+
+Your second `locations` object should have a `button text` property which is an array.
+
+```js
+assert.isArray(locations[1]["button text"]);
+```
+
+Your `button text` property should have the string values `Buy 10 health (10 gold)`, `Buy weapon (30 gold)`, and `Go to town square`.
+
+```js
+assert.equal(locations[1]["button text"][0], "Buy 10 health (10 gold)");
+assert.equal(locations[1]["button text"][1], "Buy weapon (30 gold)");
+assert.equal(locations[1]["button text"][2], "Go to town square");
+```
+
+Your second `locations` object should have a `button functions` property which is an array.
+
+```js
+assert.isArray(locations[1]["button functions"]);
+```
+
+Your `button functions` property should have the function values `buyHealth`, `buyWeapon`, and `goTown`.
+
+```js
+assert.equal(locations[1]["button functions"][0], buyHealth);
+assert.equal(locations[1]["button functions"][1], buyWeapon);
+assert.equal(locations[1]["button functions"][2], goTown);
+```
+
+Your second `locations` object should have a `text` property which is a string.
+
+```js
+assert.isString(locations[1].text);
+```
+
+Your second `locations` object should have a `text` property with the value of `You enter the store.`.
+
+```js
+assert.equal(locations[1].text, "You enter the store.");
+```
+
+You should not modify the first `locations` object.
+
+```js
+assert.deepEqual(locations[0], {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+});
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ }
+];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b0b5053f16111b0b6b5f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b0b5053f16111b0b6b5f.md
new file mode 100644
index 00000000000..8cbcb969f78
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b0b5053f16111b0b6b5f.md
@@ -0,0 +1,224 @@
+---
+id: 62a8b0b5053f16111b0b6b5f
+title: Step 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Now you can consolidate some of your code. Start by copying the code from inside the `goTown` function and paste it into your `update` function. Then, remove all the code from inside the `goTown` and `goStore` functions.
+
+# --hints--
+
+Your `update` function should set `button1.innerText` to `Go to store`.
+
+```js
+assert.match(update.toString(), /button1\.innerText\s*=\s*('|")Go to store\1/);
+```
+
+Your `update` function should set `button2.innerText` to `Go to cave`.
+
+```js
+assert.match(update.toString(), /button2\.innerText\s*=\s*('|")Go to cave\1/);
+```
+
+Your `update` function should set `button3.innerText` to `Fight dragon`.
+
+```js
+assert.match(update.toString(), /button3\.innerText\s*=\s*('|")Fight dragon\1/);
+```
+
+Your `update` function should set `button1.onclick` to `goStore`.
+
+```js
+assert.match(update.toString(), /button1\.onclick\s*=\s*goStore/);
+```
+
+Your `update` function should set `button2.onclick` to `goCave`.
+
+```js
+assert.match(update.toString(), /button2\.onclick\s*=\s*goCave/);
+```
+
+Your `update` function should set `button3.onclick` to `fightDragon`.
+
+```js
+assert.match(update.toString(), /button3\.onclick\s*=\s*fightDragon/);
+```
+
+Your `update` function should set `text.innerText` to `You are in the town square. You see a sign that says \"Store\".`.
+
+```js
+assert.match(update.toString(), /text\.innerText\s*=\s*"You are in the town square. You see a sign that says \\"Store\\"\."/);
+```
+
+Your `goTown` function should be empty.
+
+```js
+assert.match(goTown.toString(), /function goTown\(\) \{\}/);
+```
+
+Your `goStore` function should be empty.
+
+```js
+assert.match(goStore.toString(), /function goStore\(\) \{\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function update(location) {
+
+}
+
+function goTown() {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+function goStore() {
+ button1.innerText = "Buy 10 health (10 gold)";
+ button2.innerText = "Buy weapon (30 gold)";
+ button3.innerText = "Go to town square";
+ button1.onclick = buyHealth;
+ button2.onclick = buyWeapon;
+ button3.onclick = goTown;
+ text.innerText = "You enter the store.";
+}
+--fcc-editable-region--
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b1762b7775124622e1a3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b1762b7775124622e1a3.md
new file mode 100644
index 00000000000..8a52df88029
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b1762b7775124622e1a3.md
@@ -0,0 +1,182 @@
+---
+id: 62a8b1762b7775124622e1a3
+title: Step 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Instead of assigning the `innerText` and `onclick` properties to specific strings and functions, the `update` function will use data from the `location` that is passed into it. First, that data needs to be passed.
+
+Inside the `goTown` function, call the `update` function. Here is an example of calling a function named `myFunction`:
+
+```js
+myFunction();
+```
+
+# --hints--
+
+You should call the `update` function in the `goTown` function.
+
+```js
+assert.match(goTown.toString(), /update\(\)/);
+```
+
+Don't forget your ending semi-colon.
+
+```js
+assert.match(goTown.toString(), /update\(\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+--fcc-editable-region--
+function goTown() {
+
+}
+--fcc-editable-region--
+
+function goStore() {
+
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b3cc436db8139cc5fc09.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b3cc436db8139cc5fc09.md
new file mode 100644
index 00000000000..06168ec7993
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b3cc436db8139cc5fc09.md
@@ -0,0 +1,176 @@
+---
+id: 62a8b3cc436db8139cc5fc09
+title: Step 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+You now need to pass the `location` argument into the `update` call. You pass arguments by including them within the parentheses of the function call. For example, calling `myFunction` with an `arg` argument would look like:
+
+```js
+myFunction(arg)
+```
+
+Pass your `locations` array into the `update` call.
+
+# --hints--
+
+You should pass the `locations` array into the `update` call.
+
+```js
+assert.match(goTown.toString(), /update\(locations\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+--fcc-editable-region--
+function goTown() {
+ update();
+}
+--fcc-editable-region--
+
+function goStore() {
+
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b6536156c51500739b41.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b6536156c51500739b41.md
new file mode 100644
index 00000000000..ee6d660f338
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b6536156c51500739b41.md
@@ -0,0 +1,192 @@
+---
+id: 62a8b6536156c51500739b41
+title: Step 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+The `locations` array contains two locations: the `town square` and the `store`. Currently you are passing that entire array into the `update` function.
+
+Pass in only the first element of the `locations` array by adding `[0]` at the end of the variable. For example: `myFunction(arg[0]);`.
+
+This is called bracket notation . Values in an array are accessed by index. Indices are numerical values and start at 0 - this is called zero-based indexing. `arg[0]` would be the first element in the `arg` array.
+
+# --hints--
+
+You should use bracket notation with `locations`.
+
+```js
+assert.match(code, /locations\[/);
+```
+
+You should access the first object in the `locations` array. Remember that arrays are zero-based.
+
+```js
+assert.match(code, /locations\[0\]/);
+```
+
+You should pass the first object in the `locations` array into the `update` function.
+
+```js
+assert.match(code, /update\(locations\[0\]\);/);
+```
+
+This call should still be in your `goTown()` function.
+
+```js
+assert.match(goTown.toString(), /update\(locations\[0\]\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+
+--fcc-editable-region--
+function goTown() {
+ update(locations);
+}
+--fcc-editable-region--
+
+function goStore() {
+
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b711ab7a12161c7d9b67.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b711ab7a12161c7d9b67.md
new file mode 100644
index 00000000000..1c6048abc24
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b711ab7a12161c7d9b67.md
@@ -0,0 +1,178 @@
+---
+id: 62a8b711ab7a12161c7d9b67
+title: Step 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Now your `update` function needs to use the argument you pass into it.
+
+Inside the `update` function, change the value of the `button1.innerText` assignment to be `location["button text"]`. That way, you use bracket notation to get the `button text` property of the `location` object passed into the function.
+
+# --hints--
+
+Your `update` function should use bracket notation to get the `button text` property of the `location` object passed into the function.
+
+```js
+assert.match(update.toString(), /location[('|")button text\1]/);
+```
+
+You should assign the value of the `button text` property of the `location` object to the `innerText` property of `button1`.
+
+```js
+assert.match(update.toString(), /button1\.innerText\s*=\s*location\[('|")button text\1\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function update(location) {
+ button1.innerText = "Go to store";
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+--fcc-editable-region--
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b9770050d217d2247801.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b9770050d217d2247801.md
new file mode 100644
index 00000000000..ab4856b1c26
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8b9770050d217d2247801.md
@@ -0,0 +1,176 @@
+---
+id: 62a8b9770050d217d2247801
+title: Step 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+`location["button text"]` is an array with three elements. Change the `button1.innerText` assignment to be the first element of that array instead.
+
+# --hints--
+
+You should access the first element of the `button text` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /location\[('|")button text\1\]\[0\]/);
+```
+
+You should set the `button1.innerText` property to be the first element of the `button text` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /button1\.innerText\s*=\s*location\[('|")button text\1\]\[0\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function update(location) {
+ button1.innerText = location["button text"];
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+--fcc-editable-region--
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c0c8313e891a15ec23e7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c0c8313e891a15ec23e7.md
new file mode 100644
index 00000000000..458368c6e11
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c0c8313e891a15ec23e7.md
@@ -0,0 +1,188 @@
+---
+id: 62a8c0c8313e891a15ec23e7
+title: Step 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Now update `button2.innerText` and `button3.innerText` to be assigned the second and third values of the `button text` array, respectively.
+
+# --hints--
+
+You should access the second element of the `button text` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /location\[('|")button text\1\]\[1\]/);
+```
+
+You should set the `button2.innerText` property to be the second element of the `button text` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /button2\.innerText\s*=\s*location\[('|")button text\1\]\[1\]/);
+```
+
+You should access the third element of the `button text` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /location\[('|")button text\1\]\[2\]/);
+```
+
+You should set the `button3.innerText` property to be the third element of the `button text` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /button3\.innerText\s*=\s*location\[('|")button text\1\]\[2\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = "Go to cave";
+ button3.innerText = "Fight dragon";
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+--fcc-editable-region--
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c1154d3ae11aee80353f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c1154d3ae11aee80353f.md
new file mode 100644
index 00000000000..b0d08dc0436
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c1154d3ae11aee80353f.md
@@ -0,0 +1,200 @@
+---
+id: 62a8c1154d3ae11aee80353f
+title: Step 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+Following the same pattern as you did for the button text, update the three buttons' `onclick` assignments to be the first, second, and third values of the `button functions` array.
+
+# --hints--
+
+You should access the first element of the `button functions` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /location\[('|")button functions\1\]\[0\]/);
+```
+
+You should set the `button1.onclick` property to be the first element of the `button functions` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /button1\.onclick\s*=\s*location\[('|")button functions\1\]\[0\]/);
+```
+
+You should access the second element of the `button functions` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /location\[('|")button functions\1\]\[1\]/);
+```
+
+You should set the `button2.onclick` property to be the second element of the `button functions` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /button2\.onclick\s*=\s*location\[('|")button functions\1\]\[1\]/);
+```
+
+You should access the third element of the `button functions` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /location\[('|")button functions\1\]\[2\]/);
+```
+
+You should set the `button3.onclick` property to be the third element of the `button functions` property of the `location` argument.
+
+```js
+assert.match(update.toString(), /button3\.onclick\s*=\s*location\[('|")button functions\1\]\[2\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = goStore;
+ button2.onclick = goCave;
+ button3.onclick = fightDragon;
+ text.innerText = "You are in the town square. You see a sign that says \"Store.\"";
+}
+--fcc-editable-region--
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c151b23bf21bc7c4fcba.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c151b23bf21bc7c4fcba.md
new file mode 100644
index 00000000000..0edf3cec5cf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c151b23bf21bc7c4fcba.md
@@ -0,0 +1,182 @@
+---
+id: 62a8c151b23bf21bc7c4fcba
+title: Step 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Finally, update the `text.innerText` assignment to equal the `text` from the `location` object. However, instead of using bracket notation, use dot notation .
+
+Here is an example of accessing the `name` property of an object called `person`:
+
+```js
+person.name
+```
+
+# --hints--
+
+You should use dot notation to access the `text` property of the `location` object.
+
+```js
+assert.match(update.toString(), /location\.text/);
+```
+
+You should set the `text.innerText` property to be the `text` property of the `location` object.
+
+```js
+assert.match(update.toString(), /text\.innerText\s*=\s*location\.text/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = "You are in the town square. You see a sign that says \"Store\".";
+}
+--fcc-editable-region--
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c173949f851c83c64756.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c173949f851c83c64756.md
new file mode 100644
index 00000000000..422ff092c3e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c173949f851c83c64756.md
@@ -0,0 +1,178 @@
+---
+id: 62a8c173949f851c83c64756
+title: Step 68
+challengeType: 0
+dashedName: step-68
+---
+
+# --description--
+
+Now update your `goStore` function to call the `update` function. Pass the second element of the `locations` array as your argument.
+
+To make sure your refactoring is correct, try clicking your first button again. You should see the same changes to your webpage that you saw earlier.
+
+# --hints--
+
+Your `goStore` function should call the `update` function.
+
+```js
+assert.match(goStore.toString(), /update\(/);
+```
+
+Your `goStore` function should pass the second element of the `locations` array as your argument to `update()`.
+
+```js
+assert.match(goStore.toString(), /update\(locations\[1\]\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+--fcc-editable-region--
+function goStore() {
+
+}
+--fcc-editable-region--
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c242b25a531f2909e5bc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c242b25a531f2909e5bc.md
new file mode 100644
index 00000000000..d7800eb4dce
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c242b25a531f2909e5bc.md
@@ -0,0 +1,190 @@
+---
+id: 62a8c242b25a531f2909e5bc
+title: Step 69
+challengeType: 0
+dashedName: step-69
+---
+
+# --description--
+
+Create two more empty functions named `fightSlime` and `fightBeast`. These functions will be used in your upcoming `cave` object.
+
+# --hints--
+
+`fightSlime` should be a function.
+
+```js
+assert.isFunction(fightSlime);
+```
+
+`fightBeast` should be a function.
+
+```js
+assert.isFunction(fightBeast);
+```
+
+`fightSlime` should be empty.
+
+```js
+assert.match(fightSlime.toString(), /function fightSlime\(\) \{\}/);
+```
+
+`fightBeast` should be empty.
+
+```js
+assert.match(fightBeast.toString(), /function fightBeast\(\) \{\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c2bbbd8aa82052f47c53.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c2bbbd8aa82052f47c53.md
new file mode 100644
index 00000000000..d96b10aaff6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c2bbbd8aa82052f47c53.md
@@ -0,0 +1,234 @@
+---
+id: 62a8c2bbbd8aa82052f47c53
+title: Step 70
+challengeType: 0
+dashedName: step-70
+---
+
+# --description--
+
+Add a third object to the `locations` array. Give it the same properties as the other two objects.
+
+Set `name` to `cave`. Set `button text` to an array with the strings `Fight slime`, `Fight fanged beast`, and `Go to town square`. Set the `button functions` to an array with the variables `fightSlime`, `fightBeast`, and `goTown`. Set the `text` property to `You enter the cave. You see some monsters.`.
+
+# --hints--
+
+You should have three values in your `locations` array.
+
+```js
+console.log(locations);
+assert.lengthOf(locations, 3);
+```
+
+Your third `locations` value should be an object.
+
+```js
+assert.isObject(locations[2]);
+```
+
+Your third `locations` object should have a `name` property with the value of `cave`.
+
+```js
+assert.equal(locations[2].name, "cave");
+```
+
+Your third `locations` object should have a `button text` property which is an array.
+
+```js
+assert.isArray(locations[2]["button text"]);
+```
+
+Your `button text` property should have the string values `Fight slime`, `Fight fanged beast`, and `Go to town square`.
+
+```js
+assert.equal(locations[2]["button text"][0], "Fight slime");
+assert.equal(locations[2]["button text"][1], "Fight fanged beast");
+assert.equal(locations[2]["button text"][2], "Go to town square");
+```
+
+Your third `locations` object should have a `button functions` property which is an array.
+
+```js
+assert.isArray(locations[2]["button functions"]);
+```
+
+Your `button functions` property should have the function values `fightSlime`, `fightBeast`, and `goTown`.
+
+```js
+assert.equal(locations[2]["button functions"][0], fightSlime);
+assert.equal(locations[2]["button functions"][1], fightBeast);
+assert.equal(locations[2]["button functions"][2], goTown);
+```
+
+Your third `locations` object should have a `text` property which is a string.
+
+```js
+assert.isString(locations[2].text);
+```
+
+Your third `locations` object should have a `text` property with the value of `You enter the cave. You see some monsters.`.
+
+```js
+assert.equal(locations[2].text, "You enter the cave. You see some monsters.");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+--fcc-editable-region--
+
+--fcc-editable-region--
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ console.log("Going to cave.");
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c31ec0ec78216a1c36a0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c31ec0ec78216a1c36a0.md
new file mode 100644
index 00000000000..1d663fa1670
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c31ec0ec78216a1c36a0.md
@@ -0,0 +1,204 @@
+---
+id: 62a8c31ec0ec78216a1c36a0
+title: Step 71
+challengeType: 0
+dashedName: step-71
+---
+
+# --description--
+
+Now that you have a `cave` location object, update your `goCave` function to call `update` and pass that new `cave` location. Remember that this is the third element in your `locations` array.
+
+Don't forget to remove your `console.log` call!
+
+# --hints--
+
+You should use bracket notation to access the third element in your `locations` array.
+
+```js
+assert.match(code, /locations\[2\]/);
+```
+
+You should pass the third element in your `locations` array to `update`.
+
+```js
+assert.match(code, /update\(locations\[2\]\)/);
+```
+
+You should call `update` with the third element in your `locations` array in your `goCave` function.
+
+```js
+assert.match(goCave.toString(), /update\(locations\[2\]\)/);
+```
+
+You should not have the `console.log` statement in your `goCave` function.
+
+```js
+assert.notMatch(goCave.toString(), /console\.log/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+--fcc-editable-region--
+function goCave() {
+ console.log("Going to cave.");
+}
+--fcc-editable-region--
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+
+}
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c370ad8c68227137e0bc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c370ad8c68227137e0bc.md
new file mode 100644
index 00000000000..4d33b655a6b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c370ad8c68227137e0bc.md
@@ -0,0 +1,194 @@
+---
+id: 62a8c370ad8c68227137e0bc
+title: Step 72
+challengeType: 0
+dashedName: step-72
+---
+
+# --description--
+
+Now that your `store` and `cave` locations are complete, you can code the actions the player takes at those locations. Inside the `buyHealth` function, set `gold` equal to `gold` minus `10`.
+
+For example, here is how you would set `num` equal to `5` less than `num`: `num = num - 5;`.
+
+# --hints--
+
+You should subtract `10` from `gold`.
+
+```js
+assert.match(code, /gold\s*=\s*gold\s*-\s*10/);
+```
+
+Your `buyHealth` function should reduce `gold` by `10`.
+
+```js
+gold = 10;
+buyHealth();
+assert.equal(gold, 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+function buyHealth() {
+
+}
+--fcc-editable-region--
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c3ebc6c35e23785e1a19.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c3ebc6c35e23785e1a19.md
new file mode 100644
index 00000000000..df1d38ffce5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c3ebc6c35e23785e1a19.md
@@ -0,0 +1,192 @@
+---
+id: 62a8c3ebc6c35e23785e1a19
+title: Step 73
+challengeType: 0
+dashedName: step-73
+---
+
+# --description--
+
+After the `gold` is updated, add a line to set `health` equal to `health` plus `10`.
+
+# --hints--
+
+You should add `10` to `health`.
+
+```js
+assert.match(code, /health\s*=\s*health\s*\+\s*10/);
+```
+
+Your `buyHealth` function should increase `health` by `10`.
+
+```js
+health = 10;
+buyHealth();
+assert.equal(health, 20);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+function buyHealth() {
+ gold = gold - 10;
+}
+--fcc-editable-region--
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c41ecaf1bd24536129b8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c41ecaf1bd24536129b8.md
new file mode 100644
index 00000000000..a5bb57d211c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c41ecaf1bd24536129b8.md
@@ -0,0 +1,203 @@
+---
+id: 62a8c41ecaf1bd24536129b8
+title: Step 74
+challengeType: 0
+dashedName: step-74
+---
+
+# --description--
+
+There is a shorthand way to add or subtract from a variable called compound assignment . For example, changing `num = num + 5` to compound assignment would look like `num += 5`.
+
+Update both lines inside your `buyHealth` function to use compound assignment.
+
+# --hints--
+
+You should change `gold` to use compound assignment.
+
+```js
+assert.notMatch(code, /gold\s*=\s*gold\s*-\s*10/);
+```
+
+You should change `health` to use compound assignment.
+
+```js
+assert.notMatch(code, /health\s*=\s*health\s*\+\s*10/);
+```
+
+Your `buyHealth` function should still update the values.
+
+```js
+gold = 10;
+health = 10;
+buyHealth();
+assert.equal(gold, 0);
+assert.equal(health, 20);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+function buyHealth() {
+ gold = gold - 10;
+ health = health + 10;
+}
+--fcc-editable-region--
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c465fa7b0c252f4a8f0c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c465fa7b0c252f4a8f0c.md
new file mode 100644
index 00000000000..37b88222eb9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c465fa7b0c252f4a8f0c.md
@@ -0,0 +1,211 @@
+---
+id: 62a8c465fa7b0c252f4a8f0c
+title: Step 75
+challengeType: 0
+dashedName: step-75
+---
+
+# --description--
+
+Now that you are updating the `gold` and `health` variables, you need to display those new values on the game screen.
+
+After your assignment lines, assign the `innerText` property of `goldText` to be the variable `gold`. Use the same pattern to update `healthText` with the `health` variable.
+
+Here is an example:
+
+```js
+let value = 100;
+const total = document.querySelector('#total');
+total.innerText = value;
+```
+
+You can test this by clicking your "Go to store" button, followed by your "Buy Health" button.
+
+**Note:** Your answer should only be two lines of code.
+
+# --hints--
+
+Your `buyHealth` function should update the text of `healthText` to be the value of `health`.
+
+```js
+health = 10;
+buyHealth();
+const target = document.querySelector('#healthText');
+assert.equal(target.innerText, '20');
+```
+
+Your `buyHealth` function should update the text of `goldText` to be the value of `gold`.
+
+```js
+gold = 10;
+buyHealth();
+const target = document.querySelector('#goldText');
+assert.equal(target.innerText, '0');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+function buyHealth() {
+ gold -= 10;
+ health += 10;
+}
+--fcc-editable-region--
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c4db0710f3260f867a92.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c4db0710f3260f867a92.md
new file mode 100644
index 00000000000..89161b6c20f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c4db0710f3260f867a92.md
@@ -0,0 +1,209 @@
+---
+id: 62a8c4db0710f3260f867a92
+title: Step 76
+challengeType: 0
+dashedName: step-76
+---
+
+# --description--
+
+What if the player doesn't have enough gold to buy health? When you want to run code conditionally, you can use the `if` statement. Put all of the code in your `buyHealth` function inside an `if` statement. For example:
+
+```js
+function myFunction() {
+ if ("condition") {
+ console.log("Hello World!");
+ }
+}
+```
+
+For now, follow that pattern to use a string `condition` inside your `if` statement.
+
+# --hints--
+
+Your `buyHealth` function should have an `if` statement.
+
+```js
+assert.match(buyHealth.toString(), /if/);
+```
+
+Your `if` statement should have the string `condition` for the condition.
+
+```js
+assert.match(buyHealth.toString(), /if\s*\(('|")condition\1\)/);
+```
+
+All of your `buyHealth` code should be inside the `if` statement.
+
+```js
+assert.match(buyHealth.toString(), /if\s*\(('|")condition\1\)\s*\{[\s\S]*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+function buyHealth() {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+}
+--fcc-editable-region--
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c56247609626fa4a8d6e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c56247609626fa4a8d6e.md
new file mode 100644
index 00000000000..e68eacaf744
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c56247609626fa4a8d6e.md
@@ -0,0 +1,221 @@
+---
+id: 62a8c56247609626fa4a8d6e
+title: Step 77
+challengeType: 0
+dashedName: step-77
+---
+
+# --description--
+
+The `condition` string is just a placeholder. Change the `if` statement condition to check if `gold` is greater than or equal to `10`.
+
+Here is an `if` statement that checks if `num` is greater than or equal to `5`:
+
+```js
+if (num >= 5) {
+
+}
+```
+
+# --hints--
+
+Your `if` statement should check if `gold` is greater than or equal to `10`.
+
+```js
+assert.match(buyHealth.toString(), /if\s*\(gold\s*>=\s*10\)/);
+```
+
+Your `buyHealth` function should update `health` and `gold` if `gold` is greater than or equal to `10`.
+
+```js
+gold = 10;
+health = 10;
+buyHealth();
+assert.equal(health, 20);
+assert.equal(gold, 0);
+const healthElement = document.getElementById('healthText');
+assert.equal(healthElement.innerText, '20');
+const goldElement = document.getElementById('goldText');
+assert.equal(goldElement.innerText, '0');
+```
+
+Your `buyHealth` function should not update `health` and `gold` if `gold` is less than `10`.
+
+```js
+gold = 5;
+health = 10;
+buyHealth();
+assert.equal(health, 10);
+assert.equal(gold, 5);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+function buyHealth() {
+ if ("condition") {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ }
+}
+--fcc-editable-region--
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c5db7888af27af23f0dd.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c5db7888af27af23f0dd.md
new file mode 100644
index 00000000000..ab05046212b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c5db7888af27af23f0dd.md
@@ -0,0 +1,206 @@
+---
+id: 62a8c5db7888af27af23f0dd
+title: Step 78
+challengeType: 0
+dashedName: step-78
+---
+
+# --description--
+
+Now when a player tries to buy health, it will only work if they have enough money. If they do not, nothing will happen. Add an `else` statement where you can put code to run if a player does not have enough money.
+
+Here is an example of an empty `else` statement:
+
+```js
+if (num >= 5) {
+
+} else {
+
+}
+```
+
+# --hints--
+
+Your `buyHealth` function should have an `else` statement.
+
+```js
+assert.match(buyHealth.toString(), /else/);
+```
+
+Your `else` statement should come after your `if` statement.
+
+```js
+const split = buyHealth.toString().split(/\s/);
+assert.isAbove(split.indexOf('else'), split.indexOf('if'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ }
+}
+--fcc-editable-region--
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c65b75664c28a8e59c16.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c65b75664c28a8e59c16.md
new file mode 100644
index 00000000000..3ef17db2434
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c65b75664c28a8e59c16.md
@@ -0,0 +1,200 @@
+---
+id: 62a8c65b75664c28a8e59c16
+title: Step 79
+challengeType: 0
+dashedName: step-79
+---
+
+# --description--
+
+Inside the `else` statement, set `text.innerText` to equal `You do not have enough gold to buy health.`.
+
+# --hints--
+
+Your `buyHealth` function should set `text.innerText` to equal `You do not have enough gold to buy health.`.
+
+```js
+assert.match(buyHealth.toString(), /text\.innerText\s*=\s*('|")You do not have enough gold to buy health\.\1/);
+```
+
+Your `buyHealth` function should update `text.innerText` when `gold` is less than `10`.
+
+```js
+gold = 5;
+health = 10;
+buyHealth();
+assert.equal(text.innerText, 'You do not have enough gold to buy health.');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+
+ }
+}
+--fcc-editable-region--
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c6815f5f1a29735efe1b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c6815f5f1a29735efe1b.md
new file mode 100644
index 00000000000..90b8c75c72f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c6815f5f1a29735efe1b.md
@@ -0,0 +1,204 @@
+---
+id: 62a8c6815f5f1a29735efe1b
+title: Step 80
+challengeType: 0
+dashedName: step-80
+---
+
+# --description--
+
+Use `const` to create a `weapons` variable above your `locations` array. Assign it an empty array.
+
+# --hints--
+
+You should use `const` to declare your `weapons` variable.
+
+```js
+assert.match(code, /const weapons/i);
+```
+
+Your `weapons` variable should be an array.
+
+```js
+assert.isArray(weapons);
+```
+
+Your `weapons` variable should be empty.
+
+```js
+assert.equal(weapons.length, 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c7322e42962ad53ad204.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c7322e42962ad53ad204.md
new file mode 100644
index 00000000000..bed05c8d88b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c7322e42962ad53ad204.md
@@ -0,0 +1,229 @@
+---
+id: 62a8c7322e42962ad53ad204
+title: Step 81
+challengeType: 0
+dashedName: step-81
+---
+
+# --description--
+
+Just like your `locations` array, your `weapons` array will hold objects. Add four objects to the `weapons` array, each with two properties: `name` and `power`. The first should have the `name` set to `stick` and the `power` set to `5`. The second should be `dagger` and `30`. The third, `claw hammer` and `50`. The fourth, `sword` and `100`.
+
+# --hints--
+
+Your `weapons` array should have four values.
+
+```js
+assert.lengthOf(weapons, 4);
+```
+
+Your `weapons` array should have four objects.
+
+```js
+assert.isObject(weapons[0]);
+assert.isObject(weapons[1]);
+assert.isObject(weapons[2]);
+assert.isObject(weapons[3]);
+```
+
+Your first `weapons` object should have the `name` set to `stick` and the `power` set to `5`.
+
+```js
+assert.equal(weapons[0].name, 'stick');
+assert.equal(weapons[0].power, 5);
+```
+
+Your second `weapons` object should have the `name` set to `dagger` and the `power` set to `30`.
+
+```js
+assert.equal(weapons[1].name, 'dagger');
+assert.equal(weapons[1].power, 30);
+```
+
+Your third `weapons` object should have the `name` set to `claw hammer` and the `power` set to `50`.
+
+```js
+assert.equal(weapons[2].name, 'claw hammer');
+assert.equal(weapons[2].power, 50);
+```
+
+Your fourth `weapons` object should have the `name` set to `sword` and the `power` set to `100`.
+
+```js
+assert.equal(weapons[3].name, 'sword');
+assert.equal(weapons[3].power, 100);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+--fcc-editable-region--
+const weapons = [];
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c7a59e72c02bb1c717d2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c7a59e72c02bb1c717d2.md
new file mode 100644
index 00000000000..422e0ad66b5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c7a59e72c02bb1c717d2.md
@@ -0,0 +1,203 @@
+---
+id: 62a8c7a59e72c02bb1c717d2
+title: Step 82
+challengeType: 0
+dashedName: step-82
+---
+
+# --description--
+
+Inside your `buyWeapon` function, add an `if` statement to check if `gold` is greater than or equal to `30`.
+
+# --hints--
+
+Your `buyWeapon` function should have an `if` statement.
+
+```js
+assert.include(buyWeapon.toString(), 'if');
+```
+
+Your `if` statement should check if `gold` is greater than or equal to `30`.
+
+```js
+assert.match(buyWeapon.toString(), /if\s*\(gold\s*>=\s*30\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c89e4272512d44fc1c66.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c89e4272512d44fc1c66.md
new file mode 100644
index 00000000000..dab6fabe2b3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c89e4272512d44fc1c66.md
@@ -0,0 +1,215 @@
+---
+id: 62a8c89e4272512d44fc1c66
+title: Step 83
+challengeType: 0
+dashedName: step-83
+---
+
+# --description--
+
+Similar to your `buyHealth` function, set `gold` equal to `30` less than its current value. Make sure this is inside your `if` statement.
+
+# --hints--
+
+You should use compound assignment to subtract `30` from `gold`.
+
+```js
+assert.match(buyWeapon.toString(), /gold\s*-=\s*30/);
+```
+
+Your `buyWeapon` function should reduce `gold` by `30`.
+
+```js
+gold = 30;
+buyWeapon();
+assert.equal(gold, 0);
+```
+
+Your code should be in your `if` statement.
+
+```js
+gold = 20;
+buyWeapon();
+assert.equal(gold, 20);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c8cee8e5cf2e001789b4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c8cee8e5cf2e001789b4.md
new file mode 100644
index 00000000000..cd864412b47
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8c8cee8e5cf2e001789b4.md
@@ -0,0 +1,219 @@
+---
+id: 62a8c8cee8e5cf2e001789b4
+title: Step 84
+challengeType: 0
+dashedName: step-84
+---
+
+# --description--
+
+The value of the `currentWeapon` variable corresponds to an index in the `weapons` array. The player starts with a `stick`, since `currentWeapon` starts at `0` and `weapons[0]` is the `stick` weapon.
+
+In the `buyWeapon` function, use compound assignment to add `1` to `currentWeapon` - the user is buying the next weapon in the `weapons` array.
+
+# --hints--
+
+You should use compound assignment to add one to `currentWeapon`.
+
+```js
+assert.match(buyWeapon.toString(), /currentWeapon\s*\+=\s*1/);
+```
+
+Your `buyWeapon` function should increase `currentWeapon` by `1`.
+
+```js
+gold = 30;
+currentWeapon = 0;
+buyWeapon();
+assert.equal(currentWeapon, 1);
+```
+
+Your code should be in your `if` statement.
+
+```js
+gold = 20;
+currentWeapon = 0;
+buyWeapon();
+assert.equal(currentWeapon, 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ca22d29fe62f3952bdf5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ca22d29fe62f3952bdf5.md
new file mode 100644
index 00000000000..dbd8006158d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ca22d29fe62f3952bdf5.md
@@ -0,0 +1,208 @@
+---
+id: 62a8ca22d29fe62f3952bdf5
+title: Step 85
+challengeType: 0
+dashedName: step-85
+---
+
+# --description--
+
+Increasing a value by 1, or incrementing , has a special operator in JavaScript: `++`. If you wanted to increase `num` by 1, you could write `num++`.
+
+Change your `currentWeapon` assignment to use the increment operator.
+
+# --hints--
+
+You should use the increment operator to increase `currentWeapon` by `1`.
+
+```js
+assert.match(buyWeapon.toString(), /currentWeapon\s*\+\s*\+/);
+```
+
+You should not use compound assignment to increase `currentWeapon` by `1`.
+
+```js
+assert.notMatch(buyWeapon.toString(), /currentWeapon\s*\+=\s*1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon += 1;
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cb19bd7f8a304e5427a1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cb19bd7f8a304e5427a1.md
new file mode 100644
index 00000000000..29c3d761fb0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cb19bd7f8a304e5427a1.md
@@ -0,0 +1,206 @@
+---
+id: 62a8cb19bd7f8a304e5427a1
+title: Step 86
+challengeType: 0
+dashedName: step-86
+---
+
+# --description--
+
+Now update the `goldText` element to display the new value of `gold`, and update the `text` element to display `You now have a new weapon.`.
+
+# --hints--
+
+You should update the `innerText` property of the `goldText` element to be `gold`.
+
+```js
+assert.match(buyWeapon.toString(), /goldText\.innerText\s*=\s*gold/);
+```
+
+You should update the `innerText` property of the `text` element to be `You now have a new weapon.`.
+
+```js
+assert.match(buyWeapon.toString(), /text\.innerText\s*=\s*('|")You now have a new weapon\.\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cbd1e3595431d5a2b3f1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cbd1e3595431d5a2b3f1.md
new file mode 100644
index 00000000000..8f9a534ce96
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cbd1e3595431d5a2b3f1.md
@@ -0,0 +1,222 @@
+---
+id: 62a8cbd1e3595431d5a2b3f1
+title: Step 87
+challengeType: 0
+dashedName: step-87
+---
+
+# --description--
+
+You should tell the player what weapon they bought. In between the two lines you just wrote, use `let` to initialize a new variable called `newWeapon`. Set this to equal `weapons`.
+
+# --hints--
+
+Your `buyWeapon` function should have a variable named `newWeapon`.
+
+```js
+assert.match(buyWeapon.toString(), /newWeapon/);
+```
+
+You should use `let` to declare `newWeapon`.
+
+```js
+assert.match(code, /let\s+newWeapon/);
+```
+
+`newWeapon` should be initialised to have the value of `weapons`. Don't forget your semi-colon.
+
+```js
+assert.match(buyWeapon.toString(), /newWeapon\s*=\s*weapons;/);
+```
+
+`newWeapon` should be declared before you modify `text`.
+
+```js
+const contents = buyWeapon.toString().split(/\s+/);
+assert.isBelow(contents.indexOf('newWeapon'), contents.indexOf('text.innerText'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyWeapon, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+
+ text.innerText = "You now have a new weapon.";
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cce1b0c32c33017cf2e9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cce1b0c32c33017cf2e9.md
new file mode 100644
index 00000000000..e474a392723
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cce1b0c32c33017cf2e9.md
@@ -0,0 +1,211 @@
+---
+id: 62a8cce1b0c32c33017cf2e9
+title: Step 88
+challengeType: 0
+dashedName: step-88
+---
+
+# --description--
+
+Use bracket notation to access an object within the `weapons` array and assign it to your `newWeapon` variable. Place the variable `currentWeapon` within the brackets.
+
+When you use a variable in bracket notation, you are accessing the property or index by the *value* of that variable.
+
+For example, this code uses the `index` variable to access a value of `array`.
+
+```js
+let value = array[index];
+```
+
+# --hints--
+
+You should update `newWeapon` to have the value of `weapons[currentWeapon]`.
+
+```js
+assert.match(buyWeapon.toString(), /newWeapon\s*=\s*weapons\[currentWeapon\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons;
+ text.innerText = "You now have a new weapon.";
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ce1dfc990134162b3bd9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ce1dfc990134162b3bd9.md
new file mode 100644
index 00000000000..7165051ad52
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ce1dfc990134162b3bd9.md
@@ -0,0 +1,203 @@
+---
+id: 62a8ce1dfc990134162b3bd9
+title: Step 89
+challengeType: 0
+dashedName: step-89
+---
+
+# --description--
+
+`weapons[currentWeapon]` is an object. Use dot notation to get the `name` property of that object.
+
+# --hints--
+
+You should update `newWeapon` to have the value of `weapons[currentWeapon].name`.
+
+```js
+assert.match(buyWeapon.toString(), /newWeapon\s*=\s*weapons\[currentWeapon\]\.name;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon];
+ text.innerText = "You now have a new weapon.";
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ce73d0dce43468f6689c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ce73d0dce43468f6689c.md
new file mode 100644
index 00000000000..95d244d0f28
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ce73d0dce43468f6689c.md
@@ -0,0 +1,222 @@
+---
+id: 62a8ce73d0dce43468f6689c
+title: Step 90
+challengeType: 0
+dashedName: step-90
+---
+
+# --description--
+
+You can insert variables into a string with the concatenation operator `+`. Update the `You now have a new weapon.` string to say `You now have a` and the name of the new weapon. Remember to end the sentence with a period.
+
+Here is an example that creates the string `Hello, our name is freeCodeCamp.`:
+
+```js
+const ourName = "freeCodeCamp";
+const ourStr = "Hello, our name is " + ourName + ".";
+```
+
+# --hints--
+
+You should update the `text.innerText` assignment to start with the string `You now have a`.
+
+```js
+assert.match(buyWeapon.toString(), /text\.innerText\s*=\s*('|")You now have a \1/);
+```
+
+You should use the concatenation operator to add `newWeapon` to the end of the `text.innerText` string.
+
+```js
+assert.match(buyWeapon.toString(), /text\.innerText\s*=\s*('|")You now have a \1\s*\+\s*newWeapon/);
+```
+
+You should use the concatenation operator to end your `text.innerText` string with a `.`.
+
+```js
+assert.match(buyWeapon.toString(), /text\.innerText\s*=\s*('|")You now have a \1\s*\+\s*newWeapon\s*\+\s*('|")\.\2/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a new weapon.";
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cf22272d6d35af80d4ac.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cf22272d6d35af80d4ac.md
new file mode 100644
index 00000000000..0adfafd5584
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8cf22272d6d35af80d4ac.md
@@ -0,0 +1,229 @@
+---
+id: 62a8cf22272d6d35af80d4ac
+title: Step 91
+challengeType: 0
+dashedName: step-91
+---
+
+# --description--
+
+Back at the beginning of this project, you created the `inventory` array. Add the `newWeapon` to the end of the `inventory` array using the `push()` method.
+
+Here is an example:
+
+```js
+const arr = ["first"];
+const next = "second";
+arr.push(next);
+```
+
+`arr` would now have the value `["first", "second"]`.
+
+# --hints--
+
+You should use the `push` method on `inventory`.
+
+```js
+assert.match(buyWeapon.toString(), /inventory\.push/)
+```
+
+You should `push` the value of `newWeapon` to the `inventory` array.
+
+```js
+assert.match(buyWeapon.toString(), /inventory\.push\s*\(\s*newWeapon\s*\)/)
+```
+
+Your `buyWeapon` function should add the value of `newWeapon` to the `inventory` array.
+
+```js
+inventory = [];
+currentWeapon = 0;
+buyWeapon();
+assert.deepEqual(inventory, ["dagger"]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0337d7c67377a4a76c6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0337d7c67377a4a76c6.md
new file mode 100644
index 00000000000..57b233599fa
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0337d7c67377a4a76c6.md
@@ -0,0 +1,220 @@
+---
+id: 62a8d0337d7c67377a4a76c6
+title: Step 92
+challengeType: 0
+dashedName: step-92
+---
+
+# --description--
+
+Up until now, any time `text.innerText` was updated, the old text was erased. This time, use the `+=` operator to add text to the end of `text.innerText`.
+
+Add the string `In your inventory you have:` - include the spaces at the beginning and the end.
+
+# --hints--
+
+You should add a new line with `text.innerText`.
+
+```js
+const matches = buyWeapon.toString().match(/text\.innerText/g);
+assert.lengthOf(matches, 2);
+```
+
+You should use the `+=` operator to add to `text.innerText`.
+
+```js
+assert.match(buyWeapon.toString(), /text\.innerText\s*\+=\s*/)
+```
+
+You should add the string `In your inventory you have:` to the end of `text.innerText`. Mind the spaces!
+
+```js
+assert.match(buyWeapon.toString(), /text\.innerText\s*\+=\s*('|")\sIn your inventory you have:\s\1/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d08668fa8b38732486e9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d08668fa8b38732486e9.md
new file mode 100644
index 00000000000..908c77e836c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d08668fa8b38732486e9.md
@@ -0,0 +1,211 @@
+---
+id: 62a8d08668fa8b38732486e9
+title: Step 93
+challengeType: 0
+dashedName: step-93
+---
+
+# --description--
+
+At the end of the second `text.innerText` string you just added, use the concatenation operator to add the contents of `inventory` to the string.
+
+# --hints--
+
+You should not change the `In your inventory you have:` string.
+
+```js
+assert.match(buyWeapon.toString(), /text\.innerText\s*\+=\s*('|")\sIn your inventory you have:\s\1/)
+```
+
+You should use the concatenation operator `+` to add the contents of `inventory` to the string.
+
+```js
+assert.match(buyWeapon.toString(), /text\.innerText\s*\+=\s*('|")\sIn your inventory you have:\s\1\s*\+\s*inventory/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: ";
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0c4f12c2239b6618582.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0c4f12c2239b6618582.md
new file mode 100644
index 00000000000..3ebebb1edd6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0c4f12c2239b6618582.md
@@ -0,0 +1,226 @@
+---
+id: 62a8d0c4f12c2239b6618582
+title: Step 94
+challengeType: 0
+dashedName: step-94
+---
+
+# --description--
+
+Add an `else` statement to your `buyWeapon` function. In that statement, set `text.innerText` to equal `You do not have enough gold to buy a weapon.`.
+
+# --hints--
+
+You should add an `else` statement to your `buyWeapon` function.
+
+```js
+assert.match(buyWeapon.toString(), /else/);
+```
+
+Your `else` statement should come after your `if` statement.
+
+```js
+const split = buyWeapon.toString().split(/\s|\n/);
+assert.isAbove(split.indexOf('else'), split.indexOf('if'));
+```
+
+You should set `text.innerText` to `You do not have enough gold to buy a weapon.`.
+
+```js
+assert.match(buyWeapon.toString(), /text.innerText\s*=\s*('|")You do not have enough gold to buy a weapon.\1/);
+```
+
+Your `else` statement should set `text.innerText` to `You do not have enough gold to buy a weapon.`.
+
+```js
+gold = 20;
+buyWeapon();
+assert.equal(text.innerText, 'You do not have enough gold to buy a weapon.');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0fdf2dad83a92883a80.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0fdf2dad83a92883a80.md
new file mode 100644
index 00000000000..1c2b1476e8f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d0fdf2dad83a92883a80.md
@@ -0,0 +1,225 @@
+---
+id: 62a8d0fdf2dad83a92883a80
+title: Step 95
+challengeType: 0
+dashedName: step-95
+---
+
+# --description--
+
+Once a player has the best weapon, they cannot buy another one. Wrap all of the code in your `buyWeapon` function inside another `if` statement. The condition should check if `currentWeapon` is less than `3` - the index of the last weapon.
+
+# --hints--
+
+You should have a new `if` statement that checks if `currentWeapon` is less than `3`.
+
+```js
+assert.match(buyWeapon.toString(), /currentWeapon\s*\<\s*3/)
+```
+
+Your existing `if` statement should be within your new `if` statement.
+
+```js
+currentWeapon = 5;
+gold = 50;
+buyWeapon();
+assert.equal(gold, 50);
+```
+
+Your existing `else` statement should be within your new `if` statement.
+
+```js
+currentWeapon = 5;
+gold = 10;
+buyWeapon();
+assert.notEqual(text.innerText, "You do not have enough gold to buy a weapon.");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d143f2a58e3b6d6e9c33.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d143f2a58e3b6d6e9c33.md
new file mode 100644
index 00000000000..b3501a5228a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d143f2a58e3b6d6e9c33.md
@@ -0,0 +1,217 @@
+---
+id: 62a8d143f2a58e3b6d6e9c33
+title: Step 96
+challengeType: 0
+dashedName: step-96
+---
+
+# --description--
+
+Arrays have a `length` property that returns the number of items in the array. You may want to add new values to the `weapons` array in the future.
+
+Change your `if` condition to check if `currentWeapon` is less than the length of the `weapons` array. An example of checking the length of an array `myArray` would look like `myArray.length`.
+
+# --hints--
+
+You should use the `length` property on the `weapons` array.
+
+```js
+assert.match(buyWeapon.toString(), /weapons\.length/);
+```
+
+Your `if` statement should check if `currentWeapon` is less than `weapons.length`.
+
+```js
+assert.match(buyWeapon.toString(), /currentWeapon\s*<\s*weapons\.length/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (currentWeapon < 3) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d1c72e8bb13c2074d93c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d1c72e8bb13c2074d93c.md
new file mode 100644
index 00000000000..e5caaa1e3a9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d1c72e8bb13c2074d93c.md
@@ -0,0 +1,217 @@
+---
+id: 62a8d1c72e8bb13c2074d93c
+title: Step 97
+challengeType: 0
+dashedName: step-97
+---
+
+# --description--
+
+You now have an error to fix. The `currentWeapon` variable is the index of the `weapons` array, but array indexing starts at zero. The index of the last element in an array is one less than the length of the array.
+
+Change the `if` condition to check `weapons.length - 1`, instead of `weapons.length`.
+
+# --hints--
+
+You should update the condition to subtract `1` from `weapons.length`.
+
+```js
+assert.match(buyWeapon.toString(), /weapons\.length\s*-\s*1/);
+```
+
+Your condition should check if `currentWeapon` is less than `weapons.length - 1`.
+
+```js
+assert.match(buyWeapon.toString(), /currentWeapon\s*<\s*weapons\.length\s*-\s*1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (currentWeapon < weapons.length) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d2146a3e853d0a6e28ca.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d2146a3e853d0a6e28ca.md
new file mode 100644
index 00000000000..2061307615c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d2146a3e853d0a6e28ca.md
@@ -0,0 +1,224 @@
+---
+id: 62a8d2146a3e853d0a6e28ca
+title: Step 98
+challengeType: 0
+dashedName: step-98
+---
+
+# --description--
+
+Add an `else` statement for your outer `if` statement. Inside this new `else` statement, set `text.innerText` to `You already have the most powerful weapon!`.
+
+# --hints--
+
+You should have another `else` statement in your `buyWeapon` function.
+
+```js
+const matches = buyWeapon.toString().match(/else/g);
+assert.equal(matches.length, 2);
+```
+
+You should set `text.innerText` to `You already have the most powerful weapon!`.
+
+```js
+assert.match(buyWeapon.toString(), /('|")You already have the most powerful weapon!\1/);
+```
+
+You should modify your `text.innerText` to `You already have the most powerful weapon!` within your outer `else` statement.
+
+```js
+currentWeapon = 5;
+buyWeapon();
+assert.equal(text.innerText, "You already have the most powerful weapon!");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d24c97461b3ddb9397c8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d24c97461b3ddb9397c8.md
new file mode 100644
index 00000000000..67870fb094a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d24c97461b3ddb9397c8.md
@@ -0,0 +1,231 @@
+---
+id: 62a8d24c97461b3ddb9397c8
+title: Step 99
+challengeType: 0
+dashedName: step-99
+---
+
+# --description--
+
+Once a player has the most powerful weapon, you can give them the ability to sell their old weapons.
+
+In the outer `else` statement, set `button2.innerText` to `Sell weapon for 15 gold`. Also set `button2.onclick` to the function name `sellWeapon`.
+
+# --hints--
+
+You should set the value of `button2.innerText`.
+
+```js
+assert.match(buyWeapon.toString(), /button2\.innerText/);
+```
+
+You should set the value of `button2.innerText` to `Sell weapon for 15 gold`.
+
+```js
+assert.match(buyWeapon.toString(), /button2\.innerText\s*=\s*('|")Sell weapon for 15 gold\1;/);
+```
+
+You should set the value of `button2.onclick`.
+
+```js
+assert.match(buyWeapon.toString(), /button2\.onclick/);
+```
+
+You should set the value of `button2.onclick` to `sellWeapon`.
+
+```js
+assert.match(buyWeapon.toString(), /button2\.onclick\s*=\s*sellWeapon;/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+--fcc-editable-region--
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d2e2a073be3edb46116f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d2e2a073be3edb46116f.md
new file mode 100644
index 00000000000..a5e28c829e7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d2e2a073be3edb46116f.md
@@ -0,0 +1,221 @@
+---
+id: 62a8d2e2a073be3edb46116f
+title: Step 100
+challengeType: 0
+dashedName: step-100
+---
+
+# --description--
+
+Create an empty `sellWeapon` function.
+
+# --hints--
+
+You should use the `function` keyword to declare a `sellWeapon` variable.
+
+```js
+assert.isFunction(sellWeapon);
+```
+
+`sellWeapon` should be an empty function.
+
+```js
+assert.match(sellWeapon.toString(), /sellWeapon\(\)\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d31ebbc10e3fe1b28e03.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d31ebbc10e3fe1b28e03.md
new file mode 100644
index 00000000000..77100cf5462
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d31ebbc10e3fe1b28e03.md
@@ -0,0 +1,223 @@
+---
+id: 62a8d31ebbc10e3fe1b28e03
+title: Step 101
+challengeType: 0
+dashedName: step-101
+---
+
+# --description--
+
+Players should not be able to sell their only weapon. Inside the `sellWeapon` function, add an `if` statement with a condition that checks if the length of the `inventory` array is greater than `1`.
+
+# --hints--
+
+Your `sellWeapon` function should have an `if` statement.
+
+```js
+assert.match(sellWeapon.toString(), /if/);
+```
+
+Your `if` statement should check if `inventory.length` is greater than `1`.
+
+```js
+assert.match(sellWeapon.toString(), /if\s*\(inventory\.length\s*>\s*1\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+--fcc-editable-region--
+function sellWeapon() {
+
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d35660db4040ba292193.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d35660db4040ba292193.md
new file mode 100644
index 00000000000..dbbf432519d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d35660db4040ba292193.md
@@ -0,0 +1,234 @@
+---
+id: 62a8d35660db4040ba292193
+title: Step 102
+challengeType: 0
+dashedName: step-102
+---
+
+# --description--
+
+Inside the `if` statement, set `gold` equal to `15` more than its current value. Also update `goldText.innerText` to the new value.
+
+# --hints--
+
+You should use compound assignment to increase `gold` by `15`.
+
+```js
+assert.match(sellWeapon.toString(), /gold\s*\+=\s*15/);
+```
+
+You should set `goldText.innerText` to `gold`.
+
+```js
+assert.match(sellWeapon.toString(), /goldText\.innerText\s*=\s*gold/);
+```
+
+Your code should be in your `if` statement.
+
+```js
+inventory = ["Naomi"];
+gold = 0
+sellWeapon();
+assert.equal(gold, 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+--fcc-editable-region--
+function sellWeapon() {
+ if (inventory.length > 1) {
+
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d382cd075f4169223e14.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d382cd075f4169223e14.md
new file mode 100644
index 00000000000..8f3764e0ef9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d382cd075f4169223e14.md
@@ -0,0 +1,223 @@
+---
+id: 62a8d382cd075f4169223e14
+title: Step 103
+challengeType: 0
+dashedName: step-103
+---
+
+# --description--
+
+Use the `let` keyword to create a variable named `currentWeapon`. Don't assign it a value yet.
+
+Notice that you already have a `currentWeapon` variable elsewhere in your code. Since you are using the `let` keyword instead of `var`, the new `currentWeapon` is scoped only to this `if` statement. At the close of the `if` statement, the old `currentWeapon` will be used again.
+
+# --hints--
+
+You should use `let` to declare a `currentWeapon` variable.
+
+```js
+assert.match(sellWeapon.toString(), /currentWeapon/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+--fcc-editable-region--
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d539dc11cb42b5dd7ec8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d539dc11cb42b5dd7ec8.md
new file mode 100644
index 00000000000..1fb5303efc5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d539dc11cb42b5dd7ec8.md
@@ -0,0 +1,233 @@
+---
+id: 62a8d539dc11cb42b5dd7ec8
+title: Step 104
+challengeType: 0
+dashedName: step-104
+---
+
+# --description--
+
+The `shift()` method on an array removes the first element in the array and returns it. Use this method to take the first element from the `inventory` array and assign it to your `currentWeapon` variable.
+
+# --hints--
+
+Your `sellWeapon` function should use the `shift()` method.
+
+```js
+assert.match(sellWeapon.toString(), /shift\(\)/);
+```
+
+You should use the `shift()` method on the `inventory` array.
+
+```js
+assert.match(sellWeapon.toString(), /inventory\.shift\(\)/);
+```
+
+You should assign the value of `inventory.shift()` to your `currentWeapon` variable.
+
+```js
+assert.match(sellWeapon.toString(), /currentWeapon\s*=\s*inventory\.shift\(\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+--fcc-editable-region--
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon;
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d61ddfe35744369365b7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d61ddfe35744369365b7.md
new file mode 100644
index 00000000000..59e7717ce5b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d61ddfe35744369365b7.md
@@ -0,0 +1,249 @@
+---
+id: 62a8d61ddfe35744369365b7
+title: Step 105
+challengeType: 0
+dashedName: step-105
+---
+
+# --description--
+
+After your `currentWeapon`, use the concatenation operator to set `text.innerText` to the string `You sold a`, then `currentWeapon`, then the string `.`.
+
+# --hints--
+
+You should use the assignment operator with `text.innerText`.
+
+```js
+assert.match(sellWeapon.toString(), /text\.innerText\s*=/);
+```
+
+You should add `You sold a` to `text.innerText`. Spacing is important.
+
+```js
+assert.match(sellWeapon.toString(), /text\.innerText\s*=\s*('|")You sold a \1/);
+```
+
+You should add the value of `currentWeapon` to the `You sold a` string. Use the concatenation operator to do this on the same line.
+
+```js
+assert.match(sellWeapon.toString(), /text\.innerText\s*=\s*('|")You sold a\s\1\s*\+\s*\_currentWeapon/);
+```
+
+You should add the string `.` to the value of `currentWeapon`. Use the concatenation operator to do this on the same line.
+
+```js
+assert.match(sellWeapon.toString(), /text\.innerText\s*=\s*('|")You sold a \1\s*\+\s*\_currentWeapon\s+\+\s+('|")\.\2/);
+```
+
+Your `text.innerText` should update to the proper string.
+
+```js
+inventory = ["first", "second"];
+text.innerText = "Hello";
+sellWeapon();
+assert.equal(text.innerText, "You sold a first.");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+--fcc-editable-region--
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d6c7001ebc45350e3d16.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d6c7001ebc45350e3d16.md
new file mode 100644
index 00000000000..ab3661c3b47
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d6c7001ebc45350e3d16.md
@@ -0,0 +1,243 @@
+---
+id: 62a8d6c7001ebc45350e3d16
+title: Step 106
+challengeType: 0
+dashedName: step-106
+---
+
+# --description--
+
+Now use the `+=` operator to add the string `In your inventory you have:` and the contents of `inventory` to the `text.innerText`. Make sure to include the space at the beginning and end of the `In your inventory you have:` string.
+
+# --hints--
+
+You should add another `text.innerText` line.
+
+```js
+const matches = sellWeapon.toString().match(/text\.innerText/g);
+assert.equal(matches.length, 2);
+```
+
+You should use compound assignment on `text.innerText`.
+
+```js
+const matches = sellWeapon.toString().match(/text\.innerText\s*\+=/g);
+assert.equal(matches.length, 1);
+```
+
+You should add the string `In your inventory you have:` to the second `text.innerText` line. Spacing matters.
+
+```js
+assert.match(sellWeapon.toString(), /text\.innerText\s*\+=\s*('|") In your inventory you have: \1/);
+```
+
+You should use the concatenation operator to add the value of `inventory` to the end of your second `text.innerText` line.
+
+```js
+assert.match(sellWeapon.toString(), /text\.innerText\s*\+=\s*('|") In your inventory you have: \1\s*\+\s*inventory/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+--fcc-editable-region--
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d7b8ab568b4649998954.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d7b8ab568b4649998954.md
new file mode 100644
index 00000000000..3e59ee00a2d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d7b8ab568b4649998954.md
@@ -0,0 +1,237 @@
+---
+id: 62a8d7b8ab568b4649998954
+title: Step 107
+challengeType: 0
+dashedName: step-107
+---
+
+# --description--
+
+Use an `else` statement to run when the `inventory` length is not more than one. Set the `text.innerText` to say `Don't sell your only weapon!`.
+
+# --hints--
+
+Your `sellWeapon` function should have an `else` statement.
+
+```js
+assert.match(sellWeapon.toString(), /else/);
+```
+
+You should set `text.innerText` to `Don't sell your only weapon!`.
+
+```js
+assert.match(sellWeapon.toString(), /text\.innerText\s*=\s*('|")Don't sell your only weapon!\1/);
+```
+
+Your new `text.innerText` line should be in your `else` statement.
+
+```js
+inventory = ["Naomi"];
+sellWeapon();
+assert.equal(text.innerText, "Don't sell your only weapon!");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+--fcc-editable-region--
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ }
+}
+--fcc-editable-region--
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d81f539f004776dd9b1e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d81f539f004776dd9b1e.md
new file mode 100644
index 00000000000..41a4aa00816
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8d81f539f004776dd9b1e.md
@@ -0,0 +1,310 @@
+---
+id: 62a8d81f539f004776dd9b1e
+title: Step 108
+challengeType: 0
+dashedName: step-108
+---
+
+# --description--
+
+Now you can start the code to fight monsters. To keep your code organized, your `fightDragon` function has been moved for you to be near the other `fight` functions.
+
+Below your `weapons` array, define a `monsters` variable and assign it an array. Set that array to have three objects, each with a `name`, `level`, and `health` properties. The first object's values should be `slime`, `2`, and `15`, in order. The second should be `fanged beast`, `8`, and `60`. The third should be `dragon`, `20`, and `300`.
+
+# --hints--
+
+You should use `const` to declare a `monsters` variable.
+
+```js
+assert.match(code, /const\s*monsters/);
+```
+
+Your `monsters` variable should be an array.
+
+```js
+assert.isArray(monsters);
+```
+
+Your `monsters` variable should have 3 values.
+
+```js
+assert.lengthOf(monsters, 3);
+```
+
+Your `monsters` array should have 3 objects.
+
+```js
+assert(monsters.every(val => typeof val === "object"));
+```
+
+The first value in your `monsters` array should be an object with a `name` property set to `slime`.
+
+```js
+assert.equal(monsters[0].name, "slime");
+```
+
+The first value in your `monsters` array should be an object with a `level` property set to `2`.
+
+```js
+assert.equal(monsters[0].level, 2);
+```
+
+The first value in your `monsters` array should be an object with a `health` property set to `15`.
+
+```js
+assert.equal(monsters[0].health, 15);
+```
+
+The second value in your `monsters` array should be an object with a `name` property set to `fanged beast`.
+
+```js
+assert.equal(monsters[1].name, "fanged beast");
+```
+
+The second value in your `monsters` array should be an object with a `level` property set to `8`.
+
+```js
+assert.equal(monsters[1].level, 8);
+```
+
+The second value in your `monsters` array should be an object with a `health` property set to `60`.
+
+```js
+assert.equal(monsters[1].health, 60);
+```
+
+The third value in your `monsters` array should be an object with a `name` property set to `dragon`.
+
+```js
+assert.equal(monsters[2].name, "dragon");
+```
+
+The third value in your `monsters` array should be an object with a `level` property set to `20`.
+
+```js
+assert.equal(monsters[2].level, 20);
+```
+
+The third value in your `monsters` array should be an object with a `health` property set to `300`.
+
+```js
+assert.equal(monsters[2].health, 300);
+```
+
+You should not add any extra properties to your objects.
+
+```js
+assert.deepEqual(monsters, [
+ {name: "slime", level: 2, health: 15},
+ {name: "fanged beast", level: 8, health: 60},
+ {name: "dragon", level: 20, health: 300}
+])
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+--fcc-editable-region--
+
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dd468debb449b4454086.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dd468debb449b4454086.md
new file mode 100644
index 00000000000..4167fc0a12b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dd468debb449b4454086.md
@@ -0,0 +1,250 @@
+---
+id: 62a8dd468debb449b4454086
+title: Step 109
+challengeType: 0
+dashedName: step-109
+---
+
+# --description--
+
+Fighting each type of monster will use similar logic. Create an empty function called `goFight` to manage this logic.
+
+# --hints--
+
+You should use the `function` keyword to declare `goFight`.
+
+```js
+assert.match(code, /function\s*goFight/);
+```
+
+`goFight` should be an empty function.
+
+```js
+assert.match(goFight.toString(), /goFight\s*\(\s*\)\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+
+}
+
+function fightBeast() {
+
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dd9cdb16324b04cfd958.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dd9cdb16324b04cfd958.md
new file mode 100644
index 00000000000..b960134fac7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dd9cdb16324b04cfd958.md
@@ -0,0 +1,260 @@
+---
+id: 62a8dd9cdb16324b04cfd958
+title: Step 110
+challengeType: 0
+dashedName: step-110
+---
+
+# --description--
+
+In your `fightSlime` function, set `fighting` equal to `0` - the index of `slime` in the `monsters` array. Remember that you already declared `fighting` earlier in your code, so you do not need `let` or `const` here.
+
+On the next line, call the `goFight` function.
+
+# --hints--
+
+You should set `fighting` equal to `0`.
+
+```js
+assert.match(fightSlime.toString(), /fighting\s*=\s*0;/);
+```
+
+You should not use `let` or `const`.
+
+```js
+assert.notMatch(fightSlime.toString(), /let|const|var/);
+```
+
+You should call the `goFight` function.
+
+```js
+assert.match(fightSlime.toString(), /goFight\(\);/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+--fcc-editable-region--
+function fightSlime() {
+
+}
+--fcc-editable-region--
+
+function fightBeast() {
+
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+
+function goFight() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dfcf7fb1044d2f478fd1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dfcf7fb1044d2f478fd1.md
new file mode 100644
index 00000000000..7952788a9b8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8dfcf7fb1044d2f478fd1.md
@@ -0,0 +1,259 @@
+---
+id: 62a8dfcf7fb1044d2f478fd1
+title: Step 111
+challengeType: 0
+dashedName: step-111
+---
+
+# --description--
+
+Following the same pattern, use that code in the `fightBeast` and `fightDragon` functions. Remember that `beast` is at index `1` and `dragon` is at index `2`. Also, remove the `console.log` call from your `fightDragon` function.
+
+# --hints--
+
+You should set `fighting` to `1` in your `fightBeast` function.
+
+```js
+assert.match(fightBeast.toString(), /fighting\s*=\s*1;/);
+```
+
+You should set `fighting` to `2` in your `fightDragon` function.
+
+```js
+assert.match(fightDragon.toString(), /fighting\s*=\s*2;/);
+```
+
+You should remove the `console.log` from your `fightDragon` function.
+
+```js
+assert.notMatch(fightDragon.toString(), /console\.log/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+--fcc-editable-region--
+function fightBeast() {
+
+}
+
+function fightDragon() {
+ console.log("Fighting dragon.");
+}
+--fcc-editable-region--
+
+function goFight() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e0d1d0110b4ec421489f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e0d1d0110b4ec421489f.md
new file mode 100644
index 00000000000..5eccfafdc9b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e0d1d0110b4ec421489f.md
@@ -0,0 +1,269 @@
+---
+id: 62a8e0d1d0110b4ec421489f
+title: Step 112
+challengeType: 0
+dashedName: step-112
+---
+
+# --description--
+
+At the end of your code, create two empty functions named `attack` and `dodge`.
+
+# --hints--
+
+You should use the `function` keyword to declare `attack`.
+
+```js
+assert.match(code, /function\s*attack/);
+```
+
+`attack` should be an empty function.
+
+```js
+assert.match(attack.toString(), /attack\s*\(\s*\)\s*\{\s*\}/);
+```
+
+You should use the `function` keyword to declare `dodge`.
+
+```js
+assert.match(code, /function\s*dodge/);
+```
+
+`dodge` should be an empty function.
+
+```js
+assert.match(dodge.toString(), /dodge\s*\(\s*\)\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e142f7f0bd4fed898de3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e142f7f0bd4fed898de3.md
new file mode 100644
index 00000000000..70d0725b1d9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e142f7f0bd4fed898de3.md
@@ -0,0 +1,288 @@
+---
+id: 62a8e142f7f0bd4fed898de3
+title: Step 113
+challengeType: 0
+dashedName: step-113
+---
+
+# --description--
+
+Add a new object to the end of the `locations` array, following the same properties as the rest of the objects. Set `name` to `fight`, `button text` to an array with `Attack`, `Dodge`, and `Run`, `button functions` to an array with `attack`, `dodge`, and `goTown`, and `text` to `You are fighting a monster.`.
+
+# --hints--
+
+Your `locations` array should have 4 values in it.
+
+```js
+console.log(locations);
+assert.lengthOf(locations, 4);
+```
+
+Your new value should be an object.
+
+```js
+assert.isObject(locations[3]);
+```
+
+Your new object should have a `name` property set to `fight`.
+
+```js
+assert.equal(locations[3].name, "fight");
+```
+
+Your new object should have a `button text` property set to an array with the strings `Attack`, `Dodge`, and `Run`.
+
+```js
+assert.deepEqual(locations[3]["button text"], ["Attack", "Dodge", "Run"]);
+```
+
+Your new object should have a `button functions` property set to an array with the variables `attack`, `dodge`, and `goTown`.
+
+```js
+assert.deepEqual(locations[3]["button functions"], [attack, dodge, goTown]);
+```
+
+Your new object should have a `text` property set to `You are fighting a monster.`.
+
+```js
+assert.equal(locations[3].text, "You are fighting a monster.");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ }
+];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+
+}
+
+function attack() {
+
+}
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e1dc897df55108bcb5e8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e1dc897df55108bcb5e8.md
new file mode 100644
index 00000000000..d87c8179a6e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e1dc897df55108bcb5e8.md
@@ -0,0 +1,269 @@
+---
+id: 62a8e1dc897df55108bcb5e8
+title: Step 114
+challengeType: 0
+dashedName: step-114
+---
+
+# --description--
+
+In the `goFight` function, call your `update` function with the fourth object in `locations` as an argument.
+
+# --hints--
+
+You should call `update` in your `goFight` function.
+
+```js
+assert.match(goFight.toString(), /update/);
+```
+
+You should pass the fourth object in your `locations` array to your `update` call.
+
+```js
+assert.match(goFight.toString(), /update\(locations\[3\]\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+--fcc-editable-region--
+function goFight() {
+
+}
+--fcc-editable-region--
+
+function attack() {
+
+}
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e21398ad61520edb724f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e21398ad61520edb724f.md
new file mode 100644
index 00000000000..898d748c27b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e21398ad61520edb724f.md
@@ -0,0 +1,270 @@
+---
+id: 62a8e21398ad61520edb724f
+title: Step 115
+challengeType: 0
+dashedName: step-115
+---
+
+# --description--
+
+Below your `update` call, set the `monsterHealth` to be the health of the current monster. You can get this value by accessing the `health` property of `monsters[fighting]` with dot notation.
+
+# --hints--
+
+You should use bracket notation to access the `monsters` array at the `fighting` index.
+
+```js
+assert.match(goFight.toString(), /monsters\[fighting\]/);
+```
+
+You should assign the value of `monsters[fighting]` to the `monsterHealth` variable.
+
+```js
+assert.match(goFight.toString(), /monsterHealth\s*=\s*monsters\[fighting\](\.health|\[('|")health\2\])/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+--fcc-editable-region--
+function goFight() {
+ update(locations[3]);
+
+}
+--fcc-editable-region--
+
+function attack() {
+
+}
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e24c673b075317cc0b09.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e24c673b075317cc0b09.md
new file mode 100644
index 00000000000..64379cb2b5d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e24c673b075317cc0b09.md
@@ -0,0 +1,281 @@
+---
+id: 62a8e24c673b075317cc0b09
+title: Step 116
+challengeType: 0
+dashedName: step-116
+---
+
+# --description--
+
+The HTML element that shows the monster's stats has been hidden with CSS. Display the `monsterStats` element by updating the `display` property of the `style` property to `block`. For example, updating the `first` property of the `name` property of `user` would look like:
+
+```js
+user.name.first = "Naomi";
+```
+
+# --hints--
+
+You should use dot notation to access the `style` property of `monsterStats`.
+
+```js
+assert.match(goFight.toString(), /monsterStats\.style/);
+```
+
+You should use dot notation to access the `display` property of the `style` property.
+
+```js
+assert.match(goFight.toString(), /monsterStats\.style\.display/);
+```
+
+You should set the `display` property to `block`.
+
+```js
+assert.match(goFight.toString(), /monsterStats\.style\.display\s*=\s*('|")block\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+--fcc-editable-region--
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+
+}
+--fcc-editable-region--
+
+function attack() {
+
+}
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e271f8e3d1541f9624ad.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e271f8e3d1541f9624ad.md
new file mode 100644
index 00000000000..8a264681379
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e271f8e3d1541f9624ad.md
@@ -0,0 +1,284 @@
+---
+id: 62a8e271f8e3d1541f9624ad
+title: Step 117
+challengeType: 0
+dashedName: step-117
+---
+
+# --description--
+
+Now, set the `innerText` property of `monsterName` to be the `name` property of the current monster. Do the same for `monsterHealthText` and the `health` property.
+
+# --hints--
+
+You should use dot notation to access the `innerText` property of `monsterName`.
+
+```js
+assert.match(goFight.toString(), /monsterName\.innerText/);
+```
+
+You should set the `innerText` property of `monsterName` to be the `name` value of the current monster. Remember that you can get the current monster with `monsters[fighting]`.
+
+```js
+assert.match(goFight.toString(), /monsterName\.innerText\s*=\s*monsters\[fighting\]\.name/);
+```
+
+You should use dot notation to access the `innerText` property of `monsterHealthText`.
+
+```js
+assert.match(goFight.toString(), /monsterHealthText\.innerText/);
+```
+
+You should set the `innerText` property of `monsterHealthText` to be the `health` value of the current monster. Remember that you assigned this value to a `monsterHealth` variable.
+
+```js
+assert.match(goFight.toString(), /monsterHealthText\.innerText\s*=\s*monsterHealth/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+--fcc-editable-region--
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+
+}
+--fcc-editable-region--
+
+function attack() {
+
+}
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e35675c18c56354c08cf.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e35675c18c56354c08cf.md
new file mode 100644
index 00000000000..d332dfa1870
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e35675c18c56354c08cf.md
@@ -0,0 +1,285 @@
+---
+id: 62a8e35675c18c56354c08cf
+title: Step 118
+challengeType: 0
+dashedName: step-118
+---
+
+# --description--
+
+Now you can build the `attack` function. First, update the `text` message to say `The [monster name] attacks.`, replacing `[monster name]` with the name of the monster. Remember you can use the concatenation operator for this.
+
+# --hints--
+
+You should use dot notation to access the `innerText` property of `text`.
+
+```js
+assert.match(attack.toString(), /text\.innerText/);
+```
+
+You should assign the string `The` to `innerText` property of `text`.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*=\s*('|")The \1/);
+```
+
+You should use the concatenation operator to add the value of `monsters[fighting].name` to the `The` string.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*=\s*('|")The \1\s*\+\s*monsters\[fighting\]\.name/);
+```
+
+You should use the concatenation operator to add the string `attacks.` to the `monsters[fighting].name` string.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*=\s*('|")The \1\s*\+\s*monsters\[fighting\]\.name\s*\+\s*('|") attacks\.\2/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+
+}
+--fcc-editable-region--
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e41e2f190c58404dd46e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e41e2f190c58404dd46e.md
new file mode 100644
index 00000000000..a96685f85e9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e41e2f190c58404dd46e.md
@@ -0,0 +1,293 @@
+---
+id: 62a8e41e2f190c58404dd46e
+title: Step 119
+challengeType: 0
+dashedName: step-119
+---
+
+# --description--
+
+On a new line, add the string `You attack it with your [weapon].` to the `text` value, replacing `[weapon]` with the player's current weapon.
+
+# --hints--
+
+You should use dot notation to access the `innerText` property of `text` on a new line.
+
+```js
+const match = attack.toString().match(/text\.innerText/g);
+assert.lengthOf(match, 2);
+```
+
+You should use compound assignment with `text.innerText`.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*\+=/);
+```
+
+You should add the string `You attack it with your` to the `text.innerText` value. Remember that spacing matters.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*\+=\s*('|") You attack it with your \1/);
+```
+
+You should use the concatenation operator to add the current weapon to the string. You can get the current weapon with `weapons[currentWeapon].name`.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*\+=\s*('|") You attack it with your \1\s*\+\s*weapons\[currentWeapon\]\.name/);
+```
+
+You should use the concatenation operator to end your string with `.`.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*\+=\s*('|") You attack it with your \1\s*\+\s*weapons\[currentWeapon\]\.name\s*\+\s*('|")\.\2/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+
+}
+--fcc-editable-region--
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e45cc600c3591cee671a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e45cc600c3591cee671a.md
new file mode 100644
index 00000000000..7ebd6d5383a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e45cc600c3591cee671a.md
@@ -0,0 +1,275 @@
+---
+id: 62a8e45cc600c3591cee671a
+title: Step 120
+challengeType: 0
+dashedName: step-120
+---
+
+# --description--
+
+Next, set `health` to equal `health` minus the monster's level. Remember you can get this from the `monsters[fighting].level` property.
+
+# --hints--
+
+You should use compound assignment with `health`.
+
+```js
+assert.match(attack.toString(), /health\s*-=/);
+```
+
+You should subtract the monster's current level from `health`.
+
+```js
+assert.match(attack.toString(), /health\s*-=\s*monsters\[fighting\]\.level/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+
+}
+--fcc-editable-region--
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e49f4df7af5ae2d7a616.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e49f4df7af5ae2d7a616.md
new file mode 100644
index 00000000000..687f2f04e57
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e49f4df7af5ae2d7a616.md
@@ -0,0 +1,288 @@
+---
+id: 62a8e49f4df7af5ae2d7a616
+title: Step 121
+challengeType: 0
+dashedName: step-121
+---
+
+# --description--
+
+Set `monsterHealth` to `monsterHealth` minus the power of the player's current weapon. Remember you have the `currentWeapon` variable and the `power` property.
+
+# --hints--
+
+You should use compound assignment to modify the `monsterHealth` variable.
+
+```js
+assert.match(attack.toString(), /monsterHealth\s*-=/);
+```
+
+You should use bracket notation with `currentWeapon` to access `weapons`.
+
+```js
+assert.match(attack.toString(), /weapons\[currentWeapon\]/);
+```
+
+You should use dot notation to access the `power` property of `weapons[currentWeapon]`.
+
+```js
+assert.match(attack.toString(), /weapons\[currentWeapon\]\.power/);
+```
+
+You should subtract the `power` of the current weapon from `monsterHealth`.
+
+```js
+assert.match(attack.toString(), /monsterHealth\s*-=\s*weapons\[currentWeapon\]\.power/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+
+}
+--fcc-editable-region--
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e4dc6a60f85bf256a0cb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e4dc6a60f85bf256a0cb.md
new file mode 100644
index 00000000000..0b795dd3c3b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8e4dc6a60f85bf256a0cb.md
@@ -0,0 +1,316 @@
+---
+id: 62a8e4dc6a60f85bf256a0cb
+title: Step 122
+challengeType: 0
+dashedName: step-122
+---
+
+# --description--
+
+JavaScript offers the built-in `Math` utility which offers a number of mathematical tools. One of those is `Math.random()`, which generates a random number between 0 and 1. Another is `Math.floor()`, which rounds a given number down to the nearest integer.
+
+Using these, you can generate a random number within a range. For example, this generates a random number between 1 and 5: `Math.floor(Math.random() * 5) + 1;`.
+
+Following this pattern, use the addition operator (`+`) to add a random number between `1` and the value of `xp` to your `monsterHealth` variable change.
+
+# --hints--
+
+You should use the same `monsterHealth` line you already wrote.
+
+```js
+assert.lengthOf(attack.toString().match(/monsterHealth/g), 1);
+```
+
+You should add to the `weapons[currentWeapon].power` value.
+
+```js
+assert.match(attack.toString(), /monsterHealth\s*-=\s*weapons\[currentWeapon\]\.power\s*\+/);
+```
+
+You should use `Math.floor()`.
+
+```js
+assert.match(attack.toString(), /Math\.floor/);
+```
+
+You should use `Math.random()`.
+
+```js
+assert.match(attack.toString(), /Math\.random/);
+```
+
+You should multiply `Math.random()` by the value of `xp`.
+
+```js
+assert.match(attack.toString(), /Math\.random\(\)\s*\*\s*xp/);
+```
+
+You should use `Math.floor()` to round the result of `Math.random() * xp` down.
+
+```js
+assert.match(attack.toString(), /Math\.floor\(\s*Math\.random\(\)\s*\*\s*xp\s*\)/);
+```
+
+You should add `1` to the result of `Math.floor()`.
+
+```js
+assert.match(attack.toString(), /Math\.floor\(\s*Math\.random\(\)\s*\*\s*xp\s*\)\s*\+\s*1/);
+```
+
+You should add the result of `Math.floor(Math.random() * xp) + 1` to the result of `weapons[currentWeapon].power`.
+
+```js
+assert.match(attack.toString(), /monsterHealth\s*-=\s*weapons\[currentWeapon\]\.power\s*\+\s*Math\.floor\(\s*Math\.random\(\)\s*\*\s*xp\s*\)\s*\+\s*1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power;
+}
+--fcc-editable-region--
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ed36d7a7915dfa444ba2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ed36d7a7915dfa444ba2.md
new file mode 100644
index 00000000000..5e0e6059dff
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ed36d7a7915dfa444ba2.md
@@ -0,0 +1,289 @@
+---
+id: 62a8ed36d7a7915dfa444ba2
+title: Step 123
+challengeType: 0
+dashedName: step-123
+---
+
+# --description--
+
+Update `healthText.innerText` and `monsterHealthText.innerText` to equal `health` and `monsterHealth`.
+
+# --hints--
+
+You should update `healthText.innerText`.
+
+```js
+assert.match(attack.toString(), /healthText\.innerText/);
+```
+
+You should set `healthText.innerText` to `health`.
+
+```js
+assert.match(attack.toString(), /healthText\.innerText\s*=\s*health/);
+```
+
+You should update `monsterHealthText.innerText`.
+
+```js
+assert.match(attack.toString(), /monsterHealthText\.innerText/);
+```
+
+You should set `monsterHealthText.innerText` to `monsterHealth`.
+
+```js
+assert.match(attack.toString(), /monsterHealthText\.innerText\s*=\s*monsterHealth/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+
+}
+--fcc-editable-region--
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8edd05e27cc668051686f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8edd05e27cc668051686f.md
new file mode 100644
index 00000000000..055ca35f7fe
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8edd05e27cc668051686f.md
@@ -0,0 +1,285 @@
+---
+id: 62a8edd05e27cc668051686f
+title: Step 124
+challengeType: 0
+dashedName: step-124
+---
+
+# --description--
+
+Add an `if` statement to check if `health` is less than or equal to `0`. If it is, call the `lose` function.
+
+# --hints--
+
+Your `attack` function should have an `if` statement.
+
+```js
+assert.match(attack.toString(), /if/);
+```
+
+Your `if` statement should check if `health` is less than or equal to `0`.
+
+```js
+assert.match(attack.toString(), /if\s*\(health\s*<=\s*0\)/);
+```
+
+Your `if` statement should call the `lose` function.
+
+```js
+assert.match(attack.toString(), /lose\(\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+
+}
+--fcc-editable-region--
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ee154c8946678775c4a4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ee154c8946678775c4a4.md
new file mode 100644
index 00000000000..b7fb3ea4a67
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ee154c8946678775c4a4.md
@@ -0,0 +1,297 @@
+---
+id: 62a8ee154c8946678775c4a4
+title: Step 125
+challengeType: 0
+dashedName: step-125
+---
+
+# --description--
+
+You can make an `else` statement conditional by using `else if`. Here's an example:
+
+```js
+if (num > 10) {
+
+} else if (num < 5) {
+
+}
+```
+
+At the end of your `if` statement, add an `else if` statement to check if `monsterHealth` is less than or equal to `0`. In your `else if`, call the `defeatMonster` function.
+
+# --hints--
+
+You should have an `else if` statement.
+
+```js
+assert.match(attack.toString(), /else if/);
+```
+
+Your `else if` statement should check if `monsterHealth` is less than or equal to `0`.
+
+```js
+assert.match(attack.toString(), /else\s*if\s*\(\s*monsterHealth\s*<=\s*0\s*\)/);
+```
+
+Your `else if` statement should call the `defeatMonster` function.
+
+```js
+assert.match(attack.toString(), /else\s*if\s*\(\s*monsterHealth\s*<=\s*0\s*\)\s*\{\s*defeatMonster/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ }
+}
+--fcc-editable-region--
+
+function dodge() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ee71f018e968a056d369.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ee71f018e968a056d369.md
new file mode 100644
index 00000000000..94244500db9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ee71f018e968a056d369.md
@@ -0,0 +1,297 @@
+---
+id: 62a8ee71f018e968a056d369
+title: Step 126
+challengeType: 0
+dashedName: step-126
+---
+
+# --description--
+
+At the end of your code, create the `defeatMonster` and `lose` functions. Leave them empty for now.
+
+# --hints--
+
+You should use the `function` keyword to declare `defeatMonster`.
+
+```js
+assert.match(code, /function\s+defeatMonster/);
+```
+
+`defeatMonster` should be an empty function.
+
+```js
+assert.match(defeatMonster.toString(), /defeatMonster\s*\(\)\s*\{\s*\}/);
+```
+
+You should use the `function` keyword to declare `lose`.
+
+```js
+assert.match(code, /function\s+lose/);
+```
+
+`lose` should be an empty function.
+
+```js
+assert.match(lose.toString(), /lose\s*\(\)\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eec45f77bc69e8775294.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eec45f77bc69e8775294.md
new file mode 100644
index 00000000000..74b7964b09f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eec45f77bc69e8775294.md
@@ -0,0 +1,291 @@
+---
+id: 62a8eec45f77bc69e8775294
+title: Step 127
+challengeType: 0
+dashedName: step-127
+---
+
+# --description--
+
+Inside the `dodge` function, set `text.innerText` equal to the string `You dodge the attack from the [monster]`. Replace `[monster]` with the name of the monster, using the `name` property.
+
+# --hints--
+
+You should assign the string `You dodge the attack from the` to the `text.innerText` property. Remember that spacing matters.
+
+```js
+assert.match(dodge.toString(), /text\.innerText\s*=\s*('|")You dodge the attack from the \1/);
+```
+
+You should use the concatenation operator to add the name of the monster to the end of the string. You can get this with `monster[fighting].name`.
+
+```js
+assert.match(dodge.toString(), /text\.innerText\s*=\s*('|")You dodge the attack from the \1\s*\+\s*monsters\[fighting\]\.name/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+--fcc-editable-region--
+function dodge() {
+
+}
+--fcc-editable-region--
+
+function defeatMonster() {
+
+}
+
+function lose() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eefe2e68b66ac563816b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eefe2e68b66ac563816b.md
new file mode 100644
index 00000000000..f67c008aa05
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eefe2e68b66ac563816b.md
@@ -0,0 +1,299 @@
+---
+id: 62a8eefe2e68b66ac563816b
+title: Step 128
+challengeType: 0
+dashedName: step-128
+---
+
+# --description--
+
+In your `defeatMonster` function, set `gold` equal to `gold` plus the monster's level times `6.7`. You can get the monster's level with the `level` property.
+
+Here is an example of setting `num` to `num` plus `5` * `8`: `num += 5 * 8`. Use `Math.floor()` to round the result down.
+
+# --hints--
+
+You should use compound assignment to modify `gold`.
+
+```js
+assert.match(defeatMonster.toString(), /gold\s*\+=/);
+```
+
+You should use `Math.floor()` to round the result of the monster's level times `6.7`.
+
+```js
+assert.match(defeatMonster.toString(), /Math\.floor\(\s*monsters\[fighting\]\.level\s*\*\s*6\.7\s*\)/);
+```
+
+You should add the result of `Math.floor(gold + monsters[fighting].level * 6.7)` to `gold`.
+
+```js
+assert.match(defeatMonster.toString(), /gold\s*\+=\s*Math\.floor\(\s*monsters\[fighting\]\.level\s*\*\s*6\.7\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+--fcc-editable-region--
+function defeatMonster() {
+
+}
+--fcc-editable-region--
+
+function lose() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ef6a52292f6bdca4f6f8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ef6a52292f6bdca4f6f8.md
new file mode 100644
index 00000000000..678fd1314fc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ef6a52292f6bdca4f6f8.md
@@ -0,0 +1,292 @@
+---
+id: 62a8ef6a52292f6bdca4f6f8
+title: Step 129
+challengeType: 0
+dashedName: step-129
+---
+
+# --description--
+
+Set `xp` to `xp` plus the monster's level.
+
+# --hints--
+
+You should use compound assignment to modify `xp`.
+
+```js
+assert.match(defeatMonster.toString(), /xp\s*\+=/);
+```
+
+You should add the monster's level to `xp`.
+
+```js
+assert.match(defeatMonster.toString(), /xp\s*\+=\s*monsters\[fighting\]\.level/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+--fcc-editable-region--
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+
+}
+--fcc-editable-region--
+
+function lose() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ef8f0c76a46cd221a68c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ef8f0c76a46cd221a68c.md
new file mode 100644
index 00000000000..c2913614de6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8ef8f0c76a46cd221a68c.md
@@ -0,0 +1,293 @@
+---
+id: 62a8ef8f0c76a46cd221a68c
+title: Step 130
+challengeType: 0
+dashedName: step-130
+---
+
+# --description--
+
+Now update `goldText` and `xpText` to display the updated values.
+
+# --hints--
+
+You should update `goldText.innerText` to the value of `gold`.
+
+```js
+assert.match(defeatMonster.toString(), /goldText\.innerText\s*=\s*gold/);
+```
+
+You should update `xpText.innerText` to the value of `xp`.
+
+```js
+assert.match(defeatMonster.toString(), /xpText\.innerText\s*=\s*xp/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+--fcc-editable-region--
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+
+}
+--fcc-editable-region--
+
+function lose() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8efb0e3ce826db8daf80f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8efb0e3ce826db8daf80f.md
new file mode 100644
index 00000000000..0101b5e2285
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8efb0e3ce826db8daf80f.md
@@ -0,0 +1,295 @@
+---
+id: 62a8efb0e3ce826db8daf80f
+title: Step 131
+challengeType: 0
+dashedName: step-131
+---
+
+# --description--
+
+Finish the `defeatMonster` function by calling the `update` function with `locations[4]` as the argument.
+
+# --hints--
+
+You should call the `update` function.
+
+```js
+assert.match(defeatMonster.toString(), /update/);
+```
+
+You should pass `locations[4]` as the argument.
+
+```js
+assert.match(defeatMonster.toString(), /update\(locations\[4\]\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+--fcc-editable-region--
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+
+}
+--fcc-editable-region--
+
+function lose() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eff21c0b0f6ebe5b8e38.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eff21c0b0f6ebe5b8e38.md
new file mode 100644
index 00000000000..81ada2618f1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8eff21c0b0f6ebe5b8e38.md
@@ -0,0 +1,321 @@
+---
+id: 62a8eff21c0b0f6ebe5b8e38
+title: Step 132
+challengeType: 0
+dashedName: step-132
+---
+
+# --description--
+
+Your `locations` array doesn't have a fifth element, so `locations[4]` doesn't work.
+
+Add a new object at the end of the `locations` array, following the same structure as the other objects. Set `name` to `kill monster`, set `button text` to an array with three `Go to town square` strings, set `button functions` to an array with three `goTown` variables, and set `text` to `The monster screams Arg! as it dies. You gain experience points and find gold.`.
+
+# --hints--
+
+Your `locations` array should have five values.
+
+```js
+assert.lengthOf(locations, 5);
+```
+
+Your fifth `locations` value should be an object.
+
+```js
+assert.isObject(locations[4]);
+```
+
+Your fifth `locations` value should have a `name` property with the value `kill monster`.
+
+```js
+assert.equal(locations[4].name, 'kill monster');
+```
+
+Your fifth `locations` value should have a `button text` array with three `Go to town square` strings.
+
+```js
+assert.deepEqual(locations[4]["button text"], ['Go to town square', 'Go to town square', 'Go to town square']);
+```
+
+Your fifth `locations` value should have a `button functions` array with three `goTown` variables.
+
+```js
+assert.deepEqual(locations[4]["button functions"], [goTown, goTown, goTown]);
+```
+
+Your fifth `locations` value should have a `text` property with the value `The monster screams Arg! as it dies. You gain experience points and find gold.`.
+
+```js
+assert.equal(locations[4].text, 'The monster screams Arg! as it dies. You gain experience points and find gold.');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+--fcc-editable-region--
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ }
+];
+--fcc-editable-region--
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f06fb318666fef69f91e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f06fb318666fef69f91e.md
new file mode 100644
index 00000000000..94eba04f32e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f06fb318666fef69f91e.md
@@ -0,0 +1,303 @@
+---
+id: 62a8f06fb318666fef69f91e
+title: Step 133
+challengeType: 0
+dashedName: step-133
+---
+
+# --description--
+
+The word `Arg!` should have quotes around it. Besides escaping quotes, there is another way you can include quotation marks inside a string.
+
+Change the double quotes around the string `The monster screams Arg! as it dies. You gain experience points and find gold.` to single quotes `'`, then add double quotes around `Arg!`.
+
+# --hints--
+
+You should use single quotes around the string.
+
+```js
+assert.match(code, /'The monster screams "?Arg!"? as it dies. You gain experience points and find gold.'/);
+```
+
+You should use double quotes around `Arg!`.
+
+```js
+assert.equal(locations[4].text, 'The monster screams "Arg!" as it dies. You gain experience points and find gold.');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+--fcc-editable-region--
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: "The monster screams Arg! as it dies. You gain experience points and find gold."
+ }
+--fcc-editable-region--
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f14fe6d1fc72454648c7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f14fe6d1fc72454648c7.md
new file mode 100644
index 00000000000..b52900db0ee
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f14fe6d1fc72454648c7.md
@@ -0,0 +1,310 @@
+---
+id: 62a8f14fe6d1fc72454648c7
+title: Step 134
+challengeType: 0
+dashedName: step-134
+---
+
+# --description--
+
+After a monster is defeated, the monster's stat box should no longer display.
+
+On the first line of the `update` function, use `monsterStats.style.display` to change the `display` value to `none`.
+
+# --hints--
+
+You should use `monsterStats.style.display` in the `update` function.
+
+```js
+assert.match(update.toString(), /monsterStats\.style\.display/);
+```
+
+You should set `monsterStats.style.display` to `none`.
+
+```js
+assert.match(update.toString(), /monsterStats\.style\.display\s*=\s*('|")none\1/);
+```
+
+You should add your code in the first line of the `update` function.
+
+```js
+assert.match(update.toString(), /update\s*\(\s*location\s*\)\s*\{\s*monsterStats\.style\.display\s*=\s*('|")none\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+--fcc-editable-region--
+function update(location) {
+
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+--fcc-editable-region--
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f1d5f5ddbf74c07f733b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f1d5f5ddbf74c07f733b.md
new file mode 100644
index 00000000000..de99851e153
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f1d5f5ddbf74c07f733b.md
@@ -0,0 +1,296 @@
+---
+id: 62a8f1d5f5ddbf74c07f733b
+title: Step 135
+challengeType: 0
+dashedName: step-135
+---
+
+# --description--
+
+In the `lose` function, call the `update` function and pass in the sixth object of your `locations` array. Note that you haven't created this object just yet.
+
+# --hints--
+
+Test 1
+
+```js
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+--fcc-editable-region--
+function lose() {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f20463b324759953edad.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f20463b324759953edad.md
new file mode 100644
index 00000000000..097ae332be3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f20463b324759953edad.md
@@ -0,0 +1,356 @@
+---
+id: 62a8f20463b324759953edad
+title: Step 136
+challengeType: 0
+dashedName: step-136
+---
+
+# --description--
+
+At the end of your code, create a `restart` function. Inside this function, set `xp` to `0`, `health` to `100`, `gold` to `50`, `currentWeapon` to `0`, and set `inventory` to an array with the string `stick`.
+
+Also update the `innerText` properties of `goldText`, `healthText`, and `xpText` to their current values.
+
+Finally, call the `goTown()` function.
+
+# --hints--
+
+You should use the `function` keyword to declare `restart`.
+
+```js
+assert.match(code, /function\s+restart/);
+```
+
+Your `restart` function should set `xp` to `0`.
+
+```js
+assert.match(restart.toString(), /xp\s*=\s*0/);
+```
+
+Your `restart` function should set `health` to `100`.
+
+```js
+assert.match(restart.toString(), /health\s*=\s*100/);
+```
+
+Your `restart` function should set `gold` to `50`.
+
+```js
+assert.match(restart.toString(), /gold\s*=\s*50/);
+```
+
+Your `restart` function should set `currentWeapon` to `0`.
+
+```js
+assert.match(restart.toString(), /currentWeapon\s*=\s*0/);
+```
+
+Your `restart` function should set `inventory` to an array with the string `stick`.
+
+```js
+assert.match(restart.toString(), /inventory\s*=\s*\[\s*('|")stick\1\s*\]/);
+```
+
+Your `restart` function should call the `goTown()` function.
+
+```js
+assert.match(restart.toString(), /goTown\(\)/);
+```
+
+You should set `goldText.innerText` to the value of `gold`.
+
+```js
+assert.match(restart.toString(), /goldText\.innerText\s*=\s*gold/);
+```
+
+You should set `healthText.innerText` to the value of `health`.
+
+```js
+assert.match(restart.toString(), /healthText\.innerText\s*=\s*health/);
+```
+
+You should set `xpText.innerText` to the value of `xp`.
+
+```js
+assert.match(restart.toString(), /xpText\.innerText\s*=\s*xp/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f256b813a476cae51f49.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f256b813a476cae51f49.md
new file mode 100644
index 00000000000..c2291ca73c1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f256b813a476cae51f49.md
@@ -0,0 +1,353 @@
+---
+id: 62a8f256b813a476cae51f49
+title: Step 138
+challengeType: 0
+dashedName: step-138
+---
+
+# --description--
+
+Back to your `attack` function - inside the `else if` block, create another `if` and `else` statement. If the player is fighting the dragon (`fighting` would be `2`), call the `winGame` function. Move the `defeatMonster()` call to the `else` block.
+
+Here is an example that checks if `num` is equal to `5`:
+
+```js
+if (num === 5) {
+
+} else {
+
+}
+```
+
+# --hints--
+
+You should add a new `if` statement in your `else if` block.
+
+```js
+const block = attack.toString().split("else if");
+assert.include(block[1], "if");
+```
+
+Your new `if` statement should check if `fighting` is strictly equal to `2`.
+
+```js
+const block = attack.toString().split("else if");
+assert.match(block[1], /if\s*\(\s*fighting\s*===\s*2\s*\)/);
+```
+
+You should call the `winGame` function in your `if` block.
+
+```js
+const block = attack.toString().split("else if");
+assert.match(block[1], /if\s*\(\s*fighting\s*===\s*2\s*\)\s*\{\s*winGame\(\)/);
+```
+
+You should add an `else` block.
+
+```js
+const block = attack.toString().split("else if");
+assert.include(block[1], "else");
+```
+
+Your `else` block should call the `defeatMonster` function.
+
+```js
+const block = attack.toString().split("else if");
+assert.match(block[1], /else\s*\{\s*defeatMonster\(\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f2bc37675e77d5835235.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f2bc37675e77d5835235.md
new file mode 100644
index 00000000000..cd564871491
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f2bc37675e77d5835235.md
@@ -0,0 +1,355 @@
+---
+id: 62a8f2bc37675e77d5835235
+title: Step 139
+challengeType: 0
+dashedName: step-139
+---
+
+# --description--
+
+JavaScript has a conditional operator called the ternary operator . This can be used as a one-line `if-else` expression. The syntax is: `condition ? true : false`.
+
+Here is an example of an `if-else` expression changed to a ternary:
+
+```js
+if (num > 5) {
+ bigger()
+} else {
+ smaller()
+}
+
+num > 5 ? bigger() : smaller();
+```
+
+Change your new `if-else` expression to a ternary.
+
+# --hints--
+
+You should remove the `if` and `else` from your `else if` block.
+
+```js
+const block = attack.toString().split("else if");
+assert.notMatch(block[1], /if/);
+assert.notMatch(block[1], /else/);
+```
+
+You should check if `fighting` is equal to `2`.
+
+```js
+const block = attack.toString().split("else if");
+assert.match(block[1], /fighting\s*===\s*2/);
+```
+
+Using the ternary syntax, you should call `winGame` if `fighting` is equal to `2`.
+
+```js
+const block = attack.toString().split("else if");
+assert.match(block[1], /fighting\s*===\s*2\s*\?\s*winGame\(\)/);
+```
+
+Using the ternary syntax, you should call `defeatMonster` if `fighting` is not equal to `2`.
+
+```js
+const block = attack.toString().split("else if");
+assert.match(block[1], /fighting\s*===\s*2\s*\?\s*winGame\(\)\s*\:\s*defeatMonster\(\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ if (fighting === 2) {
+ winGame();
+ } else {
+ defeatMonster();
+ }
+ }
+}
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f35bde1750791f58773f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f35bde1750791f58773f.md
new file mode 100644
index 00000000000..6cf34e927c5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a8f35bde1750791f58773f.md
@@ -0,0 +1,322 @@
+---
+id: 62a8f35bde1750791f58773f
+title: Step 140
+challengeType: 0
+dashedName: step-140
+---
+
+# --description--
+
+After the `lose` function, create a function called `winGame`. Inside the `winGame` function, call the `update` function and pass in `locations[6]`.
+
+# --hints--
+
+You should use the `function` keyword to declare `winGame`.
+
+```js
+assert.match(code, /function\s+winGame/);
+```
+
+Your `winGame` function should call the `update` function and pass in `locations[6]`.
+
+```js
+assert.match(winGame.toString(), /update\s*\(\s*locations\[6\]\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a94114ce0b8918b487390f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a94114ce0b8918b487390f.md
new file mode 100644
index 00000000000..db3f566d44b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62a94114ce0b8918b487390f.md
@@ -0,0 +1,348 @@
+---
+id: 62a94114ce0b8918b487390f
+title: Step 141
+challengeType: 0
+dashedName: step-141
+---
+
+# --description--
+
+Add another object in the `locations` array. Everything should be the same as the `lose` object, except the `name` should be `win` and the `text` should be `You defeat the dragon! YOU WIN THE GAME! 🎉`.
+
+# --hints--
+
+You should have seven values in the `locations` array.
+
+```js
+assert.lengthOf(locations, 7);
+```
+
+Your seventh `locations` value should be an object.
+
+```js
+assert.isObject(locations[6]);
+```
+
+Your seventh `locations` value should have a `name` property with the value `win`.
+
+```js
+assert.equal(locations[6].name, 'win');
+```
+
+Your seventh `locations` value should have a `button text` array with three `REPLAY?` strings.
+
+```js
+assert.deepEqual(locations[6]["button text"], ['REPLAY?', 'REPLAY?', 'REPLAY?']);
+```
+
+Your seventh `locations` value should have a `button functions` array with three `restart` variables.
+
+```js
+assert.deepEqual(locations[6]["button functions"], [restart, restart, restart]);
+```
+
+Your seventh `locations` value should have a `text` property with the value `You defeat the dragon! YOU WIN THE GAME! 🎉`.
+
+```js
+assert.equal(locations[6].text, 'You defeat the dragon! YOU WIN THE GAME! 🎉');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+--fcc-editable-region--
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ }
+--fcc-editable-region--
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1cea594f152ba626b872.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1cea594f152ba626b872.md
new file mode 100644
index 00000000000..d38e7a2c1e2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1cea594f152ba626b872.md
@@ -0,0 +1,326 @@
+---
+id: 62aa1cea594f152ba626b872
+title: Step 142
+challengeType: 0
+dashedName: step-142
+---
+
+# --description--
+
+Your game could be complete now, but you can also make it more interesting.
+
+Inside your `attack` function, change your `health -= monsters[fighting].level;` line to `health -= getMonsterAttackValue(monsters[fighting].level);`. This sets `health` equal to `health` minus the return value of the `getMonsterAttackValue` function, and passes the `level` of the monster as an argument.
+
+# --hints--
+
+You should update your `health` line to be `health -= getMonsterAttackValue(monsters[fighting].level);`.
+
+```js
+assert.match(attack.toString(), /health\s*-=\s*getMonsterAttackValue\(monsters\[fighting\].level\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1d6736ba262cfa74344b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1d6736ba262cfa74344b.md
new file mode 100644
index 00000000000..1dd06a164f4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1d6736ba262cfa74344b.md
@@ -0,0 +1,332 @@
+---
+id: 62aa1d6736ba262cfa74344b
+title: Step 143
+challengeType: 0
+dashedName: step-143
+---
+
+# --description--
+
+Below your `attack` function, create an empty function named `getMonsterAttackValue`. It should take `level` as a parameter.
+
+# --hints--
+
+You should use the `function` keyword to declare `getMonsterAttackValue`.
+
+```js
+assert.match(code, /function\s+getMonsterAttackValue/);
+```
+
+Your `getMonsterAttackValue` should take `level` as a parameter.
+
+```js
+assert.match(code, /getMonsterAttackValue\(\s*level\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1d9f535e102e4663e7a6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1d9f535e102e4663e7a6.md
new file mode 100644
index 00000000000..62f2bd62862
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1d9f535e102e4663e7a6.md
@@ -0,0 +1,342 @@
+---
+id: 62aa1d9f535e102e4663e7a6
+title: Step 144
+challengeType: 0
+dashedName: step-144
+---
+
+# --description--
+
+The attack of the monster will be based on the monster's `level` and the player's `xp`. In the `getMonsterAttackValue` function, use `const` to create a variable called `hit`. Assign it the equation `(level * 5) - (Math.floor(Math.random() * xp));`.
+
+This will set the monster's attack to five times their `level` minus a random number between 0 and the player's `xp`.
+
+# --hints--
+
+You should use `const` to declare the variable `hit`.
+
+```js
+assert.match(code, /const\s*hit/);
+```
+
+You should use the equation `(level * 5) - (Math.floor(Math.random() * xp))`.
+
+```js
+assert.match(getMonsterAttackValue, /(level\s*\*\s*5)\s*-\s*(Math.floor\(Math.random\(\)\s*\*\s*xp\))/);
+```
+
+You should set `hit` to the value of `(level * 5) - (Math.floor(Math.random() * xp))`.
+
+```js
+assert.match(code, /hit\s*=\s*\(level\s*\*\s*5\)\s*-\s*\(Math.floor\(Math.random\(\)\s*\*\s*xp\)\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+--fcc-editable-region--
+function getMonsterAttackValue(level) {
+
+}
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1e3c7c3d552fb04f0f18.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1e3c7c3d552fb04f0f18.md
new file mode 100644
index 00000000000..0e1f69267c5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1e3c7c3d552fb04f0f18.md
@@ -0,0 +1,328 @@
+---
+id: 62aa1e3c7c3d552fb04f0f18
+title: Step 145
+challengeType: 0
+dashedName: step-145
+---
+
+# --description--
+
+Log the value of `hit` to the console to use in debugging. Remember that you can do this with `console.log()`.
+
+# --hints--
+
+You should use the `console.log()` function to log the value of `hit`.
+
+```js
+assert.match(getMonsterAttackValue.toString(), /console\.log\(\s*hit\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+--fcc-editable-region--
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+}
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1e8ccd579330e097ce44.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1e8ccd579330e097ce44.md
new file mode 100644
index 00000000000..bcc2b14ee5a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1e8ccd579330e097ce44.md
@@ -0,0 +1,338 @@
+---
+id: 62aa1e8ccd579330e097ce44
+title: Step 146
+challengeType: 0
+dashedName: step-146
+---
+
+# --description--
+
+Functions run specific blocks of code when they are called, but they can also return a value. This value can be assigned to a variable and used elsewhere in your code.
+
+Use the `return` keyword to return the value of `hit` at the end of the function.
+
+# --hints--
+
+You should use the `return` keyword to return the value of `hit`.
+
+```js
+assert.match(getMonsterAttackValue, /return\s*hit/);
+```
+
+Your function should return the expected value.
+
+```js
+xp = 0;
+assert.equal(getMonsterAttackValue(1), 5);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+--fcc-editable-region--
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+}
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1eec891ed731db227a36.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1eec891ed731db227a36.md
new file mode 100644
index 00000000000..725aa7e720a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1eec891ed731db227a36.md
@@ -0,0 +1,350 @@
+---
+id: 62aa1eec891ed731db227a36
+title: Step 147
+challengeType: 0
+dashedName: step-147
+---
+
+# --description--
+
+If you play the game in its current state you might notice a bug. If your `xp` is high enough, the `getMonsterAttackValue` function will return a negative number, which will actually add to your total health when fighting a monster!
+
+In `getMonsterAttackValue`, change `return hit` to a ternary operator that returns `hit` if `hit` is greater than `0`, or returns `0` if it is not.
+
+Here is an example of returning a value based on `condition` with a ternary:
+
+```js
+return condition ? true : false;
+```
+
+# --hints--
+
+You should use a ternary to change the `return` value if `hit` is greater than `0`.
+
+```js
+assert.match(getMonsterAttackValue.toString(), /return\s+hit\s*>\s*0/);
+```
+
+You should use a ternary to return `hit` if `hit` is greater than `0`
+
+```js
+assert.match(getMonsterAttackValue.toString(), /return\s+hit\s*>\s*0\s*\?\s*hit/);
+```
+
+You should use a ternary to return `0` if `hit` is not greater than `0`.
+
+```js
+assert.match(getMonsterAttackValue.toString(), /return\s+hit\s*>\s*0\s*\?\s*hit\s*:\s*0/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+--fcc-editable-region--
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit;
+}
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1fed3d4e873366ff3131.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1fed3d4e873366ff3131.md
new file mode 100644
index 00000000000..eea6535bec1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa1fed3d4e873366ff3131.md
@@ -0,0 +1,331 @@
+---
+id: 62aa1fed3d4e873366ff3131
+title: Step 148
+challengeType: 0
+dashedName: step-148
+---
+
+# --description--
+
+In your `attack` function, below the `health` variable, create an `if` statement. Set the condition to call the `isMonsterHit` function.
+
+# --hints--
+
+You should add an `if` statement which calls `isMonsterHit` in the condition.
+
+```js
+assert.match(attack.toString(), /if\s*\(\s*isMonsterHit\s*\(\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+--fcc-editable-region--
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa204c1e1d33348ff09944.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa204c1e1d33348ff09944.md
new file mode 100644
index 00000000000..6b3bc12e219
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa204c1e1d33348ff09944.md
@@ -0,0 +1,333 @@
+---
+id: 62aa204c1e1d33348ff09944
+title: Step 149
+challengeType: 0
+dashedName: step-149
+---
+
+# --description--
+
+Move your `monsterHealth` assignment into your `if` block.
+
+# --hints--
+
+You should move your `monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1` into your `if` block.
+
+```js
+assert.match(attack.toString(), /if\s*\(isMonsterHit\(\)\s*\)\s*\{\s*monsterHealth\s*-=\s*weapons\[currentWeapon\]\.power\s*\+\s*Math\.floor\(Math\.random\(\)\s*\*\s*xp\)\s*\+\s*1/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+
+ }
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+--fcc-editable-region--
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa20e9cf1be9358f5aceae.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa20e9cf1be9358f5aceae.md
new file mode 100644
index 00000000000..788bdafd4ad
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa20e9cf1be9358f5aceae.md
@@ -0,0 +1,338 @@
+---
+id: 62aa20e9cf1be9358f5aceae
+title: Step 150
+challengeType: 0
+dashedName: step-150
+---
+
+# --description--
+
+Add an `else` statement to the first `if` statement inside you `attack()` function. In the `else` statement, use the `+=` operator to add the text `You miss.` to the end of `text.innerText`.
+
+# --hints--
+
+You should add an `else` block after your `if (isMonsterHit())` block.
+
+```js
+assert.match(attack.toString(), /if\s*\(isMonsterHit\(\)\s*\)\s*\{\s*monsterHealth\s*-=\s*weapons\[currentWeapon\]\.power\s*\+\s*Math\.floor\(Math\.random\(\)\s*\*\s*xp\)\s*\+\s*1;\s*\}\s*else/)
+```
+
+You should add the text `You miss.` to the end of `text.innerText`. Remember to use compound assignment.
+
+```js
+assert.match(attack.toString(), /if\s*\(isMonsterHit\(\)\s*\)\s*\{\s*monsterHealth\s*-=\s*weapons\[currentWeapon\]\.power\s*\+\s*Math\.floor\(Math\.random\(\)\s*\*\s*xp\)\s*\+\s*1;\s*\}\s*else\s*\{\s*text\.innerText\s*\+=\s*('|")\sYou miss\.\1/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+--fcc-editable-region--
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2136fc49b836dfedb959.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2136fc49b836dfedb959.md
new file mode 100644
index 00000000000..7a5d427b22f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2136fc49b836dfedb959.md
@@ -0,0 +1,342 @@
+---
+id: 62aa2136fc49b836dfedb959
+title: Step 151
+challengeType: 0
+dashedName: step-151
+---
+
+# --description--
+
+Now create the `isMonsterHit` function. This will return a boolean value (true or false) to be used in your `if` statement. Return the result of the comparison `Math.random() > .2`.
+
+# --hints--
+
+You should use the `function` keyword to declare `isMonsterHit`.
+
+```js
+assert.match(code, /function\s+isMonsterHit/);
+```
+
+Your `isMonsterHit` function should return the result of the comparison `Math.random() > .2`.
+
+```js
+assert.match(isMonsterHit.toString(), /return\s*Math\.random\(\)\s*>\s*0?\.2/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa21971e3b743844849985.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa21971e3b743844849985.md
new file mode 100644
index 00000000000..9d747a00c12
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa21971e3b743844849985.md
@@ -0,0 +1,356 @@
+---
+id: 62aa21971e3b743844849985
+title: Step 152
+challengeType: 0
+dashedName: step-152
+---
+
+# --description--
+
+The player should hit if either `Math.random() > .2` **or** if the player's health is less than 20.
+
+At the end of your `return` statement, use the logical or operator `||` and check if `health` is less than `20`.
+
+The logical or operator will use the first value if it is truthy – that is, anything apart from `NaN`, `null`, `0`, `-0`, `0n`, `""`, and `false`. Otherwise, it will use the second value.
+
+For example: `num < 10 || num > 20`.
+
+# --hints--
+
+Your `isMonsterHit` function should use the logical or operator.
+
+```js
+assert.match(isMonsterHit.toString(), /\|\|/);
+```
+
+Your logical or operator should use `health < 20` as the fallback value.
+
+```js
+assert.match(isMonsterHit.toString(), /\|\|\s*health\s*<\s*20/);
+```
+
+Your function should return the result of the comparison `Math.random() > .2` **or** `health < 20`.
+
+```js
+assert.match(isMonsterHit.toString(), /return\s*Math\.random\(\)\s*>\s*0?\.2\s*\|\|\s*health\s*<\s*20/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+--fcc-editable-region--
+function isMonsterHit() {
+ return Math.random() > .2;
+}
+--fcc-editable-region--
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa21ea8d9d9f396b95dd87.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa21ea8d9d9f396b95dd87.md
new file mode 100644
index 00000000000..34820846dd6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa21ea8d9d9f396b95dd87.md
@@ -0,0 +1,346 @@
+---
+id: 62aa21ea8d9d9f396b95dd87
+title: Step 153
+challengeType: 0
+dashedName: step-153
+---
+
+# --description--
+
+On every attack, there should be a chance that the player's weapon breaks. At the end of the `attack` function, add an empty `if` expression with the condition `Math.random() <= .1`.
+
+# --hints--
+
+You should add an `if` statement to your `attack` function.
+
+```js
+const ifs = attack.toString().match(/if/g);
+assert.lengthOf(ifs, 4);
+```
+
+Your new `if` statement should check `Math.random() <= .1`.
+
+```js
+assert.match(attack.toString(), /if\s*\(\s*Math\.random\(\)\s*<=\s*0?\.1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+
+}
+--fcc-editable-region--
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa226207f33d3ad4c6f546.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa226207f33d3ad4c6f546.md
new file mode 100644
index 00000000000..bb4bb752806
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa226207f33d3ad4c6f546.md
@@ -0,0 +1,367 @@
+---
+id: 62aa226207f33d3ad4c6f546
+title: Step 154
+challengeType: 0
+dashedName: step-154
+---
+
+# --description--
+
+Use the `+=` operator to add `Your [weapon] breaks.`, with a space in front of `Your`, to the end of `text.innerText`. Replace `[weapon]` with the last item in the `inventory` array using `inventory.pop()`, which will remove the last item in the array AND return it so it appears in your string.
+
+# --hints--
+
+You should use the compound assignment operator to modify `text.innerText`.
+
+```js
+const concat = attack.toString().match(/\+=/g);
+assert.lengthOf(concat, 3);
+```
+
+You should use the `pop` method on the `inventory` array.
+
+```js
+assert.match(attack.toString(), /inventory\.pop\(\)/);
+```
+
+You should add `Your`, with a space before and after it, to `text.innerText`.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*\+=\s*('|")\sYour\s\1/);
+```
+
+You should add the return value of `inventory.pop()` to the `Your` string.
+
+```js
+console.log(attack.toString());
+assert.match(attack.toString(), /text\.innerText\s*\+=\s*('|")\sYour\s\1\s*\+\s*inventory\.pop\(\)/);
+```
+
+You should add `breaks.`, with a space in front of it, to the end of your string.
+
+```js
+assert.match(attack.toString(), /text\.innerText\s*\+=\s*('|")\sYour\s\1\s*\+\s*inventory\.pop\(\)\s*\+\s*('|")\sbreaks\.\2/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1) {
+
+ }
+}
+--fcc-editable-region--
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa22aba186563bcbf2c395.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa22aba186563bcbf2c395.md
new file mode 100644
index 00000000000..44980b592f0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa22aba186563bcbf2c395.md
@@ -0,0 +1,350 @@
+---
+id: 62aa22aba186563bcbf2c395
+title: Step 155
+challengeType: 0
+dashedName: step-155
+---
+
+# --description--
+
+Remember that the increment operator `++` can be used to increase a variable's value by 1. There is also a decrement operator `--` that can be used to decrease a variable's value by 1.
+
+Decrement the value of `currentWeapon` in your `if` statement, after you update the text.
+
+# --hints--
+
+You should use the decrement operator.
+
+```js
+assert.match(attack.toString(), /--/);
+```
+
+You should decrement `currentWeapon` in your `if` statement.
+
+```js
+assert.match(attack.toString(), /currentWeapon\s*--/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+
+ }
+}
+--fcc-editable-region--
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa234322d4ad3e8bce42cc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa234322d4ad3e8bce42cc.md
new file mode 100644
index 00000000000..c801177ae2d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa234322d4ad3e8bce42cc.md
@@ -0,0 +1,364 @@
+---
+id: 62aa234322d4ad3e8bce42cc
+title: Step 156
+challengeType: 0
+dashedName: step-156
+---
+
+# --description--
+
+We don't want a player's only weapon to break. The logical AND operator checks if two statements are true.
+
+Use the logical AND operator `&&` to add a second condition to your `if` statement. The player's weapon should only break if `inventory.length` does not equal (`!==`) one.
+
+Here is an example of an `if` statement with two conditions:
+
+```js
+if (firstName === "Quincy" && lastName === "Larson") {
+
+}
+```
+
+# --hints--
+
+You should not modify your existing `if` statement.
+
+```js
+assert.match(attack.toString(), /if\s*\(Math\.random\(\)\s*\<=\s*\.1/);
+```
+
+You should use the logical AND operator `&&`.
+
+```js
+assert.match(attack.toString(), /if\s*\(Math\.random\(\)\s*\<=\s*\.1\s*&&/);
+```
+
+You should use the logical AND operator to check if `inventory.length` does not equal `1`.
+
+```js
+assert.match(attack.toString(), /if\s*\(Math\.random\(\)\s*\<=\s*\.1\s*&&\s*inventory\.length\s*\!\=\=\s*1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+--fcc-editable-region--
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+--fcc-editable-region--
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2469c77b363fdb4f0e06.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2469c77b363fdb4f0e06.md
new file mode 100644
index 00000000000..10cb8603022
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2469c77b363fdb4f0e06.md
@@ -0,0 +1,358 @@
+---
+id: 62aa2469c77b363fdb4f0e06
+title: Step 157
+challengeType: 0
+dashedName: step-157
+---
+
+# --description--
+
+Now you can add a small easter egg (hidden feature) to your game.
+
+Create a new function called `easterEgg` which calls the `update` function with `locations[7]` as the argument.
+
+# --hints--
+
+You should use the `function` keyword to declare `easterEgg`.
+
+```js
+assert.match(code, /function\s+easterEgg\s*/);
+```
+
+`easterEgg` should call the `update` function.
+
+```js
+assert.match(easterEgg.toString(), /update\(/);
+```
+
+`easterEgg` should call the `update` function with `locations[7]` as the argument.
+
+```js
+assert.match(easterEgg.toString(), /update\(\s*locations\[7\]\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa252c3b1073415ba2b898.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa252c3b1073415ba2b898.md
new file mode 100644
index 00000000000..a502101c334
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa252c3b1073415ba2b898.md
@@ -0,0 +1,355 @@
+---
+id: 62aa252c3b1073415ba2b898
+title: Step 158
+challengeType: 0
+dashedName: step-158
+---
+
+# --description--
+
+Create an empty `pick` function with a parameter named `guess`.
+
+# --hints--
+
+You should use the `function` keyword to declare `pick`.
+
+```js
+assert.match(code, /function\s+pick\s*/);
+```
+
+`pick` should take a parameter named `guess`.
+
+```js
+assert.match(pick.toString(), /pick\s*\(\s*guess\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa258da314ef42ba0a1858.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa258da314ef42ba0a1858.md
new file mode 100644
index 00000000000..5f657de3877
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa258da314ef42ba0a1858.md
@@ -0,0 +1,384 @@
+---
+id: 62aa258da314ef42ba0a1858
+title: Step 159
+challengeType: 0
+dashedName: step-159
+---
+
+# --description--
+
+Create two new functions named `pickTwo` and `pickEight`.
+
+Inside each of those, call the `pick()` function and pass either `2` or `8` as the argument depending on the function name.
+
+# --hints--
+
+You should use the `function` keyword to declare `pickTwo`.
+
+```js
+assert.match(code, /function\s+pickTwo\s*/);
+```
+
+You should use the `function` keyword to declare `pickEight`.
+
+```js
+assert.match(code, /function\s+pickEight\s*/);
+```
+
+`pickTwo` should call the `pick` function.
+
+```js
+assert.match(pickTwo.toString(), /pick\(/);
+```
+
+`pickTwo` should call the `pick` function with `2` as the argument.
+
+```js
+assert.match(pickTwo.toString(), /pick\(\s*2\s*\)/);
+```
+
+`pickEight` should call the `pick` function.
+
+```js
+assert.match(pickEight.toString(), /pick\(/);
+```
+
+`pickEight` should call the `pick` function with `8` as the argument.
+
+```js
+assert.match(pickEight.toString(), /pick\(\s*8\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+function pick(guess) {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa25fcb5837d43b4d9873d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa25fcb5837d43b4d9873d.md
new file mode 100644
index 00000000000..d47f53f5a8b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa25fcb5837d43b4d9873d.md
@@ -0,0 +1,389 @@
+---
+id: 62aa25fcb5837d43b4d9873d
+title: Step 160
+challengeType: 0
+dashedName: step-160
+---
+
+# --description--
+
+Add another object to your `locations` array. Set `name` to `easter egg`, set `button text` to an array with the strings `2`, `8`, and `Go to town square?`, set `button functions` to an array with the variables `pickTwo`, `pickEight`, and `goTown`, and `text` to `You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!`.
+
+# --hints--
+
+Your `locations` array should have 8 values.
+
+```js
+assert.lengthOf(locations, 8);
+```
+
+Your eighth `locations` value should be an object.
+
+```js
+assert.isObject(locations[7]);
+```
+
+Your eighth `locations` value should have a `name` property with the value `easter egg`.
+
+```js
+assert.equal(locations[7].name, "easter egg");
+```
+
+Your eighth `locations` value should have a `button text` array with the strings `2`, `8`, and `Go to town square?`.
+
+```js
+assert.deepEqual(locations[7]["button text"], ["2", "8", "Go to town square?"]);
+```
+
+Your eighth `locations` value should have a `button functions` an array with the variables `pickTwo`, `pickEight`, and `goTown`.
+
+```js
+assert.deepEqual(locations[7]["button functions"], [pickTwo, pickEight, goTown]);
+```
+
+Your eighth `locations` value should have a `text` property with the value `You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!`.
+
+```js
+assert.equal(locations[7].text, "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+--fcc-editable-region--
+ }
+
+--fcc-editable-region--
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+function pick(guess) {
+
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2626c3c10244b94c787b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2626c3c10244b94c787b.md
new file mode 100644
index 00000000000..c335f2d7bc9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2626c3c10244b94c787b.md
@@ -0,0 +1,364 @@
+---
+id: 62aa2626c3c10244b94c787b
+title: Step 161
+challengeType: 0
+dashedName: step-161
+---
+
+# --description--
+
+Inside `pick`, use `let` to initialize a variable named `numbers` and set it to an empty array.
+
+# --hints--
+
+Your `pick` function should initalize `numbers` to an empty array `[]`.
+
+```js
+assert.match(pick.toString(), /numbers\s*=\s*\[\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa264d23cdaa45a20efada.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa264d23cdaa45a20efada.md
new file mode 100644
index 00000000000..bb3a88b2824
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa264d23cdaa45a20efada.md
@@ -0,0 +1,381 @@
+---
+id: 62aa264d23cdaa45a20efada
+title: Step 162
+challengeType: 0
+dashedName: step-162
+---
+
+# --description--
+
+After your `numbers` array, create a `while` loop. A while loop accepts a condition, and will run the code in the block until the condition is no longer true.
+
+Your `while` loop should run while `numbers.length` is less than `10`.
+
+Here is an example of a `while` loop that runs while `i` is less than five.
+
+```js
+while (i < 5) {
+
+}
+```
+
+# --hints--
+
+Your `pick` function should have a `while` loop.
+
+```js
+assert.match(pick.toString(), /while\s*\(/);
+```
+
+Your `while` loop should run while `numbers.length < 10`.
+
+```js
+assert.match(pick.toString(), /while\s*\(\s*numbers.length\s*<\s*10\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa26cca3cd3d46c431e73b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa26cca3cd3d46c431e73b.md
new file mode 100644
index 00000000000..beace6c6228
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa26cca3cd3d46c431e73b.md
@@ -0,0 +1,379 @@
+---
+id: 62aa26cca3cd3d46c431e73b
+title: Step 163
+challengeType: 0
+dashedName: step-163
+---
+
+# --description--
+
+Inside your `while` loop, push a random number between 0 and 10 to the end of the `numbers` array. You can create this random number with `Math.floor(Math.random() * 11)`.
+
+# --hints--
+
+You should use the `push` method to add a random number to the end of the `numbers` array.
+
+```js
+assert.match(pick.toString(), /numbers\.push\(/);
+```
+
+You should use `Math.floor(Math.random() * 11)` to create the random number.
+
+```js
+assert.match(pick.toString(), /Math\.floor\(Math\.random\(\)\s*\*\s*11\s*\)/);
+```
+
+You should `push` the result of `Math.floor(Math.random() * 11)` to the end of the `numbers` array.
+
+```js
+assert.match(pick.toString(), /numbers\.push\(\s*Math\.floor\(Math\.random\(\)\s*\*\s*11\s*\)\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27227399d647e1c37a3c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27227399d647e1c37a3c.md
new file mode 100644
index 00000000000..c0e732491ac
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27227399d647e1c37a3c.md
@@ -0,0 +1,380 @@
+---
+id: 62aa27227399d647e1c37a3c
+title: Step 164
+challengeType: 0
+dashedName: step-164
+---
+
+# --description--
+
+After the `while` loop, set `text.innerText` to equal `You picked [guess]. Here are the random numbers:`. Replace `guess` with the player's guess.
+
+# --hints--
+
+You should set `text.innerText` to the string `You picked`. Remember that spacing matters.
+
+```js
+assert.match(pick.toString(), /text\.innerText\s*=\s*('|")You picked \1/);
+```
+
+You should use the concatenation operator to add the value of the `guess` parameter to your `You picked` string.
+
+```js
+assert.match(pick.toString(), /text\.innerText\s*=\s*('|")You picked \1\s*\+\s*guess/);
+```
+
+You should use the concatenation operator to add the string `. Here are the random numbers:` to your `"You picked " + guess` string.
+
+```js
+assert.match(pick.toString(), /text\.innerText\s*=\s*('|")You picked \1\s*\+\s*guess\s*\+\s*('|")\.\sHere are the random numbers:\2/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27560def7048d7b4a095.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27560def7048d7b4a095.md
new file mode 100644
index 00000000000..7b34447692f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27560def7048d7b4a095.md
@@ -0,0 +1,368 @@
+---
+id: 62aa27560def7048d7b4a095
+title: Step 165
+challengeType: 0
+dashedName: step-165
+---
+
+# --description--
+
+Before the final quote in that string you added, insert the new line escape character `\n`. This will cause the next part you add to `text.innerText` to appear on a new line.
+
+# --hints--
+
+You should add the new line escape character `\n` to your `. Here are the random numbers:` string.
+
+```js
+assert.match(pick.toString(), /text\.innerText\s*=\s*('|")You picked \1\s*\+\s*guess\s*\+\s*('|")\.\sHere are the random numbers:\\n\2/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:";
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27c40ca6f04ab8be5fac.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27c40ca6f04ab8be5fac.md
new file mode 100644
index 00000000000..c57f4d75914
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa27c40ca6f04ab8be5fac.md
@@ -0,0 +1,375 @@
+---
+id: 62aa27c40ca6f04ab8be5fac
+title: Step 166
+challengeType: 0
+dashedName: step-166
+---
+
+# --description--
+
+A `for` loop runs for a specific number of times. We will break down how a `for` loop runs in the next several steps. For now, copy this loop below and paste it at the end of your `pick` function.
+
+```js
+for (let x = 1; x < 5; x++) {
+
+}
+```
+
+# --hints--
+
+You should copy the above loop into your `pick` function.
+
+```js
+assert.match(pick.toString(), /for\s*\(\s*(let|var)\s*x\s*=\s*1\s*;\s*x\s*<\s*5\s*;\s*x\s*\+\+\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28032d863d4bd8058799.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28032d863d4bd8058799.md
new file mode 100644
index 00000000000..4b4af2f8669
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28032d863d4bd8058799.md
@@ -0,0 +1,375 @@
+---
+id: 62aa28032d863d4bd8058799
+title: Step 167
+challengeType: 0
+dashedName: step-167
+---
+
+# --description--
+
+`for` loops are declared with three expressions separated by semicolons. `for (a; b; c)`, where `a` is the initialization expression, `b` is the condition, and `c` is the final expression.
+
+The initialization expression is executed only once, before the loop starts, and is often used to define and set up the loop variable. Think of it like declaring a counter to use in your loop.
+
+Many `for` loops use `i` as the counter and start from 0, so change `let x = 1;` to `let i = 0;`.
+
+# --hints--
+
+You should change your initialization in the `for` loop to be `let i = 0;`.
+
+```js
+assert.match(pick.toString(), /for\s*\(\s*(let|var)\s*i\s*=\s*0\s*;/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let x = 1; x < 5; x++) {
+
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa287434dc284cea01157c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa287434dc284cea01157c.md
new file mode 100644
index 00000000000..7067e31d3f3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa287434dc284cea01157c.md
@@ -0,0 +1,373 @@
+---
+id: 62aa287434dc284cea01157c
+title: Step 168
+challengeType: 0
+dashedName: step-168
+---
+
+# --description--
+
+The second statement in a `for` loop, the condition statement, is evaluated at the beginning of every loop iteration. The loop will continue as long as the condition evaluates to be true.
+
+We want the loop to run 10 times, so change `x < 5` to `i < 10`.
+
+# --hints--
+
+You should update your condition statement to be `i < 10`.
+
+```js
+assert.match(pick.toString(), /for\s*\(\s*(let|var)\s*i\s*=\s*0\s*;\s*i\s*<\s*10\s*;/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; x < 5; x++) {
+
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28bbd6323e4dfb3ac43e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28bbd6323e4dfb3ac43e.md
new file mode 100644
index 00000000000..72bbc1f15f8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28bbd6323e4dfb3ac43e.md
@@ -0,0 +1,373 @@
+---
+id: 62aa28bbd6323e4dfb3ac43e
+title: Step 169
+challengeType: 0
+dashedName: step-169
+---
+
+# --description--
+
+The last statement in a `for` loop, the final expression, is executed at the end of each loop iteration.
+
+Since we changed the initialization statement to use `i` instead of `x`, change `x++` to `i++`. This will increment the initializer `i` by 1 after each loop.
+
+# --hints--
+
+You should change your final expression to `i++`.
+
+```js
+assert.match(pick.toString(), /for\s*\(\s*(let|var)\s*i\s*=\s*0\s*;\s*i\s*<\s*10\s*;\s*i\+\+\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; i < 10; x++) {
+
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28fb651bf14efa2dbb16.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28fb651bf14efa2dbb16.md
new file mode 100644
index 00000000000..94da3ef415e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa28fb651bf14efa2dbb16.md
@@ -0,0 +1,390 @@
+---
+id: 62aa28fb651bf14efa2dbb16
+title: Step 170
+challengeType: 0
+dashedName: step-170
+---
+
+# --description--
+
+Now you can write the logic to run in the loop. Inside your `for` loop, use the `+=` operator to add to the end of `text.innerText`. Add the number at index `i` of the `numbers` array, using `numbers[i]`. Then add a new line, using the escape sequence you used earlier.
+
+# --hints--
+
+You should use compound assignment to add to the end of `text.innerText`.
+
+```js
+assert.match(pick.toString(), /text\.innerText\s*\+=/);
+```
+
+You should use bracket notation to access `numbers[i]`.
+
+```js
+assert.match(pick.toString(), /numbers\[i\]/);
+```
+
+You should add `numbers[i]` to your `text.innerText` value.
+
+```js
+assert.match(pick.toString(), /text\.innerText\s*\+=\s*numbers\[i\]/);
+```
+
+You should add a new-line character after the `numbers[i]` value. Remember that you can do this with `\n`.
+
+```js
+console.log(pick.toString());
+assert.match(pick.toString(), /text\.innerText\s*\+=\s*numbers\[i\]\s*\+\s*('|")\\n\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; i < 10; i++) {
+
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2943669c9d5026af6985.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2943669c9d5026af6985.md
new file mode 100644
index 00000000000..b1540f1ac41
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2943669c9d5026af6985.md
@@ -0,0 +1,387 @@
+---
+id: 62aa2943669c9d5026af6985
+title: Step 171
+challengeType: 0
+dashedName: step-171
+---
+
+# --description--
+
+The `indexOf()` array method returns the first index at which a given element can be found in the array, or `-1` if the element is not present.
+
+After your `for` loop, add an `if` expression to check if the `guess` is in the `numbers` array. You can check if `indexOf` is not equal (`!==`) to `-1`.
+
+Here is an example of the `indexOf` syntax:
+
+```js
+const numbers = [1, 2, 3];
+numbers.indexOf(2) // 1
+```
+
+# --hints--
+
+Your `pick` function should have an `if` statement.
+
+```js
+assert.match(pick.toString(), /if/);
+```
+
+Your `if` statement should check if the `guess` is in the `numbers` array. You can check if `indexOf` is not equal (`!==`) to `-1`.
+
+```js
+assert.match(pick.toString(), /if\s*\(numbers\.indexOf\(\s*guess\s*\)\s*!==\s*-1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; i < 10; i++) {
+ text.innerText += numbers[i] + "\n";
+ }
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2999ec27ec516655eba6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2999ec27ec516655eba6.md
new file mode 100644
index 00000000000..ee088d679f6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2999ec27ec516655eba6.md
@@ -0,0 +1,386 @@
+---
+id: 62aa2999ec27ec516655eba6
+title: Step 172
+challengeType: 0
+dashedName: step-172
+---
+
+# --description--
+
+Inside the `if` expression, add the string `Right! You win 20 gold!` to the end of `text.innerText`. Also, add `20` to the value of `gold` and update the `goldText.innerText`.
+
+# --hints--
+
+You should use compound assignment to add the string `Right! You win 20 gold!` to the end of `text.innerText`.
+
+```js
+assert.match(pick.toString(), /text\.innerText\s*\+=\s*('|")Right! You win 20 gold!\1/);
+```
+
+You should use compound assignment to add `20` to the value of `gold`.
+
+```js
+assert.match(pick.toString(), /gold\s*\+=\s*20/);
+```
+
+You should update the `goldText.innerText` to reflect the new value of `gold`.
+
+```js
+assert.match(pick.toString(), /goldText\.innerText\s*\=\s*gold/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; i < 10; i++) {
+ text.innerText += numbers[i] + "\n";
+ }
+ if (numbers.indexOf(guess) !== -1) {
+
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa29d8f8f88152c91350ca.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa29d8f8f88152c91350ca.md
new file mode 100644
index 00000000000..13ed8152080
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa29d8f8f88152c91350ca.md
@@ -0,0 +1,394 @@
+---
+id: 62aa29d8f8f88152c91350ca
+title: Step 173
+challengeType: 0
+dashedName: step-173
+---
+
+# --description--
+
+Now add an `else` expression. Inside, add `Wrong! You lose 10 health!` to the end of `text.innerText`. Subtract `10` from `health` and update `healthText.innerText`.
+
+# --hints--
+
+You should add an `else` block.
+
+```js
+assert.match(pick.toString(), /else\s*\{/);
+```
+
+Your `else` block should use compound assignment to add `Wrong! You lose 10 health!` to the end of `text.innerText`.
+
+```js
+assert.match(pick.toString(), /text\.innerText\s*\+=\s*('|")Wrong! You lose 10 health!\1/);
+```
+
+Your `else` block should use compound assignment to subtract `10` from `health`.
+
+```js
+assert.match(pick.toString(), /health\s*-=\s*10/);
+```
+
+Your `else` block should update the `healthText.innerText` to reflect the new value of `health`.
+
+```js
+assert.match(pick.toString(), /healthText\.innerText\s*=\s*health/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; i < 10; i++) {
+ text.innerText += numbers[i] + "\n";
+ }
+ if (numbers.indexOf(guess) !== -1) {
+ text.innerText += "Right! You win 20 gold!";
+ gold += 20;
+ goldText.innerText = gold;
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2aec2f09d454253aad6c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2aec2f09d454253aad6c.md
new file mode 100644
index 00000000000..17491c06783
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2aec2f09d454253aad6c.md
@@ -0,0 +1,394 @@
+---
+id: 62aa2aec2f09d454253aad6c
+title: Step 174
+challengeType: 0
+dashedName: step-174
+---
+
+# --description--
+
+Since you subtracted health from the player, you need to check if the player's `health` is less than or equal to `0`. If it is, call the `lose` function.
+
+# --hints--
+
+Your `pick` function should have a second `if` statement.
+
+```js
+const match = pick.toString().match(/if/g);
+assert.isAtLeast(match.length, 2);
+```
+
+Your `if` statement should check if the player's `health` is less than or equal to `0`.
+
+```js
+assert.match(pick.toString(), /if\s*\(\s*health\s*<=\s*0\s*\)/);
+```
+
+Your `if` statement should call the `lose` function.
+
+```js
+assert.match(pick.toString(), /lose\(\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+--fcc-editable-region--
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; i < 10; i++) {
+ text.innerText += numbers[i] + "\n";
+ }
+ if (numbers.indexOf(guess) !== -1) {
+ text.innerText += "Right! You win 20 gold!";
+ gold += 20;
+ goldText.innerText = gold;
+ } else {
+ text.innerText += "Wrong! You lose 10 health!";
+ health -= 10;
+ healthText.innerText = health;
+
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2ba9cd881355a6f0a5a8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2ba9cd881355a6f0a5a8.md
new file mode 100644
index 00000000000..f9bcbbb6387
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62aa2ba9cd881355a6f0a5a8.md
@@ -0,0 +1,746 @@
+---
+id: 62aa2ba9cd881355a6f0a5a8
+title: Step 175
+challengeType: 0
+dashedName: step-175
+---
+
+# --description--
+
+Looking at your `kill monster` object, `button functions` currently has three `goTown` variables. Replace the third one with `easterEgg` - this is how a player will access the hidden feature of the game. Do not change the `button text`.
+
+With this, your RPG game is complete! You can now play around - can you defeat the dragon?
+
+# --hints--
+
+You should update your fifth `locations` object to have a `button functions` property of `[goTown, goTown, easterEgg]`.
+
+```js
+assert.deepEqual(locations[4]["button functions"], [goTown, goTown, easterEgg]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+--fcc-editable-region--
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+--fcc-editable-region--
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; i < 10; i++) {
+ text.innerText += numbers[i] + "\n";
+ }
+ if (numbers.indexOf(guess) !== -1) {
+ text.innerText += "Right! You win 20 gold!";
+ gold += 20;
+ goldText.innerText = gold;
+ } else {
+ text.innerText += "Wrong! You lose 10 health!";
+ health -= 10;
+ healthText.innerText = health;
+ if (health <= 0) {
+ lose();
+ }
+ }
+}
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, easterEgg],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+ {
+ name: "lose",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You die. ☠️"
+ },
+ {
+ name: "win",
+ "button text": ["REPLAY?", "REPLAY?", "REPLAY?"],
+ "button functions": [restart, restart, restart],
+ text: "You defeat the dragon! YOU WIN THE GAME! 🎉"
+ },
+ {
+ name: "easter egg",
+ "button text": ["2", "8", "Go to town square?"],
+ "button functions": [pickTwo, pickEight, goTown],
+ text: "You find a secret game. Pick a number above. Ten numbers will be randomly chosen between 0 and 10. If the number you choose matches one of the random numbers, you win!"
+ }
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= getMonsterAttackValue(monsters[fighting].level);
+ if (isMonsterHit()) {
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ } else {
+ text.innerText += " You miss.";
+ }
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ fighting === 2 ? winGame() : defeatMonster();
+ }
+ if (Math.random() <= .1 && inventory.length !== 1) {
+ text.innerText += " Your " + inventory.pop() + " breaks.";
+ currentWeapon--;
+ }
+}
+
+function getMonsterAttackValue(level) {
+ const hit = (level * 5) - (Math.floor(Math.random() * xp));
+ console.log(hit);
+ return hit > 0 ? hit : 0;
+}
+
+function isMonsterHit() {
+ return Math.random() > .2 || health < 20;
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function winGame() {
+ update(locations[6]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+
+function easterEgg() {
+ update(locations[7]);
+}
+
+function pickTwo() {
+ pick(2);
+}
+
+function pickEight() {
+ pick(8);
+}
+
+function pick(guess) {
+ let numbers = [];
+ while (numbers.length < 10) {
+ numbers.push(Math.floor(Math.random() * 11));
+ }
+ text.innerText = "You picked " + guess + ". Here are the random numbers:\n";
+ for (let i = 0; i < 10; i++) {
+ text.innerText += numbers[i] + "\n";
+ }
+ if (numbers.indexOf(guess) !== -1) {
+ text.innerText += "Right! You win 20 gold!";
+ gold += 20;
+ goldText.innerText = gold;
+ } else {
+ text.innerText += "Wrong! You lose 10 health!";
+ health -= 10;
+ healthText.innerText = health;
+ if (health <= 0) {
+ lose();
+ }
+ }
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62b46e3a8d4be31be5af793d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62b46e3a8d4be31be5af793d.md
new file mode 100644
index 00000000000..d98f9e81298
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62b46e3a8d4be31be5af793d.md
@@ -0,0 +1,121 @@
+---
+id: 62b46e3a8d4be31be5af793d
+title: Step 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+We have run in to a slight problem. You are trying to query your page for a button element, but your `script` tag is in the `head` of your HTML. This means your code runs before the browser has finished reading the HTML, and your `document.querySelector()` will not see the button - because the browser hasn't processed it yet.
+
+To fix this, move your `script` element out of the `head` element, and place it at the end of your `body` element (just before the closing `` tag.)
+
+# --hints--
+
+Your `script` element should not be in your `head` element.
+
+```js
+const script = document.querySelector('script[data-src$="script.js"]');
+assert.notEqual(script.parentElement.tagName, "HEAD");
+```
+
+Your `script` element should come at the end of your `body` element.
+
+```js
+const script = document.querySelector('script[data-src$="script.js"]');
+assert.equal(script.previousElementSibling.tagName, "DIV");
+assert.isNull(script.nextElementSibling);
+assert.equal(script.parentElement.tagName, "BODY");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+--fcc-editable-region--
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+--fcc-editable-region--
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+let button1 = document.querySelector("#button1");
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62ba17beef16c563069a65d8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62ba17beef16c563069a65d8.md
new file mode 100644
index 00000000000..d600cbab293
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62ba17beef16c563069a65d8.md
@@ -0,0 +1,339 @@
+---
+id: 62ba17beef16c563069a65d8
+title: Step 137
+challengeType: 0
+dashedName: step-137
+---
+
+# --description--
+
+In the `locations` array, add another object at the end. Set the `name` property to `lose`, set `button text` to an array with three `REPLAY?` strings, set `button functions` to an array with three `restart` variables, and set `text` to `You die. ☠️`. You can copy that text to use the emote.
+
+# --hints--
+
+You should have six values in the `locations` array.
+
+```js
+assert.lengthOf(locations, 6);
+```
+
+Your sixth `locations` value should be an object.
+
+```js
+assert.isObject(locations[5]);
+```
+
+Your sixth `locations` value should have a `name` property with the value `lose`.
+
+```js
+assert.equal(locations[5].name, 'lose');
+```
+
+Your sixth `locations` value should have a `button text` array with three `REPLAY?` strings.
+
+```js
+assert.deepEqual(locations[5]["button text"], ['REPLAY?', 'REPLAY?', 'REPLAY?']);
+```
+
+Your sixth `locations` value should have a `button functions` array with three `restart` variables.
+
+```js
+assert.deepEqual(locations[5]["button functions"], [restart, restart, restart]);
+```
+
+Your sixth `locations` value should have a `text` property with the value `You die. ☠️`.
+
+```js
+assert.equal(locations[5].text, 'You die. ☠️');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+const button1 = document.querySelector('#button1');
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+const monsterHealthText =document.querySelector("#monsterHealth");
+const weapons = [
+ { name: 'stick', power: 5 },
+ { name: 'dagger', power: 30 },
+ { name: 'claw hammer', power: 50 },
+ { name: 'sword', power: 100 }
+];
+const monsters = [
+ {
+ name: "slime",
+ level: 2,
+ health: 15
+ },
+ {
+ name: "fanged beast",
+ level: 8,
+ health: 60
+ },
+ {
+ name: "dragon",
+ level: 20,
+ health: 300
+ }
+]
+const locations = [
+ {
+ name: "town square",
+ "button text": ["Go to store", "Go to cave", "Fight dragon"],
+ "button functions": [goStore, goCave, fightDragon],
+ text: "You are in the town square. You see a sign that says \"Store\"."
+ },
+ {
+ name: "store",
+ "button text": ["Buy 10 health (10 gold)", "Buy weapon (30 gold)", "Go to town square"],
+ "button functions": [buyHealth, buyWeapon, goTown],
+ text: "You enter the store."
+ },
+ {
+ name: "cave",
+ "button text": ["Fight slime", "Fight fanged beast", "Go to town square"],
+ "button functions": [fightSlime, fightBeast, goTown],
+ text: "You enter the cave. You see some monsters."
+ },
+ {
+ name: "fight",
+ "button text": ["Attack", "Dodge", "Run"],
+ "button functions": [attack, dodge, goTown],
+ text: "You are fighting a monster."
+ },
+ {
+ name: "kill monster",
+ "button text": ["Go to town square", "Go to town square", "Go to town square"],
+ "button functions": [goTown, goTown, goTown],
+ text: 'The monster screams "Arg!" as it dies. You gain experience points and find gold.'
+ },
+--fcc-editable-region--
+
+--fcc-editable-region--
+];
+
+// initialize buttons
+button1.onclick = goStore;
+button2.onclick = goCave;
+button3.onclick = fightDragon;
+
+function update(location) {
+ monsterStats.style.display = "none";
+ button1.innerText = location["button text"][0];
+ button2.innerText = location["button text"][1];
+ button3.innerText = location["button text"][2];
+ button1.onclick = location["button functions"][0];
+ button2.onclick = location["button functions"][1];
+ button3.onclick = location["button functions"][2];
+ text.innerText = location.text;
+}
+
+function goTown() {
+ update(locations[0]);
+}
+
+function goStore() {
+ update(locations[1]);
+}
+
+function goCave() {
+ update(locations[2]);
+}
+
+function buyHealth() {
+ if (gold >= 10) {
+ gold -= 10;
+ health += 10;
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ } else {
+ text.innerText = "You do not have enough gold to buy health.";
+ }
+}
+
+function buyWeapon() {
+ if (currentWeapon < weapons.length - 1) {
+ if (gold >= 30) {
+ gold -= 30;
+ currentWeapon++;
+ goldText.innerText = gold;
+ let newWeapon = weapons[currentWeapon].name;
+ text.innerText = "You now have a " + newWeapon + ".";
+ inventory.push(newWeapon);
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "You do not have enough gold to buy a weapon.";
+ }
+ } else {
+ text.innerText = "You already have the most powerful weapon!";
+ button2.innerText = "Sell weapon for 15 gold";
+ button2.onclick = sellWeapon;
+ }
+}
+
+function sellWeapon() {
+ if (inventory.length > 1) {
+ gold += 15;
+ goldText.innerText = gold;
+ let currentWeapon = inventory.shift();
+ text.innerText = "You sold a " + currentWeapon + ".";
+ text.innerText += " In your inventory you have: " + inventory;
+ } else {
+ text.innerText = "Don't sell your only weapon!";
+ }
+}
+
+function fightSlime() {
+ fighting = 0;
+ goFight();
+}
+
+function fightBeast() {
+ fighting = 1;
+ goFight();
+}
+
+function fightDragon() {
+ fighting = 2;
+ goFight();
+}
+
+function goFight() {
+ update(locations[3]);
+ monsterHealth = monsters[fighting].health;
+ monsterStats.style.display = "block";
+ monsterName.innerText = monsters[fighting].name;
+ monsterHealthText.innerText = monsterHealth;
+}
+
+function attack() {
+ text.innerText = "The " + monsters[fighting].name + " attacks.";
+ text.innerText += " You attack it with your " + weapons[currentWeapon].name + ".";
+ health -= monsters[fighting].level;
+ monsterHealth -= weapons[currentWeapon].power + Math.floor(Math.random() * xp) + 1;
+ healthText.innerText = health;
+ monsterHealthText.innerText = monsterHealth;
+ if (health <= 0) {
+ lose();
+ } else if (monsterHealth <= 0) {
+ defeatMonster();
+ }
+}
+
+function dodge() {
+ text.innerText = "You dodge the attack from the " + monsters[fighting].name;
+}
+
+function defeatMonster() {
+ gold += Math.floor(monsters[fighting].level * 6.7);
+ xp += monsters[fighting].level;
+ goldText.innerText = gold;
+ xpText.innerText = xp;
+ update(locations[4]);
+}
+
+function lose() {
+ update(locations[5]);
+}
+
+function restart() {
+ xp = 0;
+ health = 100;
+ gold = 50;
+ currentWeapon = 0;
+ inventory = ["stick"];
+ goldText.innerText = gold;
+ healthText.innerText = health;
+ xpText.innerText = xp;
+ goTown();
+}
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc1ee0c5a89717d4785729.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc1ee0c5a89717d4785729.md
new file mode 100644
index 00000000000..50b06ed7911
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc1ee0c5a89717d4785729.md
@@ -0,0 +1,114 @@
+---
+id: 62fc1ee0c5a89717d4785729
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Give your `#monsterStats` element the same `border` and `padding` as your `#stats` element. Set its color to `white` and give it a `red` background.
+
+# --hints--
+
+You should have a `#monsterStats` selector.
+
+```js
+const monsterStats = new __helpers.CSSHelp(document).getStyle('#monsterStats');
+assert.exists(monsterStats);
+```
+
+Your `#monsterStats` selector should have a `border` of `1px solid black`.
+
+```js
+const border = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('border');
+assert.equal(border, '1px solid black');
+```
+
+Your `#monsterStats` selector should have `5px` of padding.
+
+```js
+const padding = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('padding');
+assert.equal(padding, '5px');
+```
+
+Your `#monsterStats` selector should have a `color` of `white`.
+
+```js
+const color = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('color');
+assert.equal(color, 'white');
+```
+
+Your `#monsterStats` selector should have a `background-color` of `red`.
+
+```js
+const background = new __helpers.CSSHelp(document).getStyle('#monsterStats')?.getPropertyValue('background-color');
+assert.equal(background, 'red');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc20387ef88d1d1998aac5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc20387ef88d1d1998aac5.md
new file mode 100644
index 00000000000..8db7f52b284
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc20387ef88d1d1998aac5.md
@@ -0,0 +1,127 @@
+---
+id: 62fc20387ef88d1d1998aac5
+title: Step 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Use `querySelector()` to get the other two `button` elements using their `id`s: `button2` and `button3`. Store them in variables called `button2` and `button3`. Remember to use `const`.
+
+# --hints--
+
+You should declare a `button2` variable with `const`.
+
+```js
+assert.match(code, /const button2/);
+```
+
+Your `button2` variable should have the value of your `#button2` element.
+
+```js
+assert.deepEqual(button2, document.querySelector('#button2'));
+```
+
+You should declare a `button3` variable with `const`.
+
+```js
+assert.match(code, /const button3/);
+```
+
+Your `button3` variable should have the value of your `#button3` element.
+
+```js
+assert.deepEqual(button3, document.querySelector('#button3'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+--fcc-editable-region--
+const button1 = document.querySelector("#button1");
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc211760bfc220f4734800.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc211760bfc220f4734800.md
new file mode 100644
index 00000000000..6eb76f2bd78
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-basic-javascript-by-building-a-role-playing-game/62fc211760bfc220f4734800.md
@@ -0,0 +1,125 @@
+---
+id: 62fc211760bfc220f4734800
+title: Step 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Finally, use `querySelector()` to get the `#monsterHealth` element. Because you have already declared a `monsterHealth` variable earlier, you need to use a different variable name for this element.
+
+Declare a new variable with the `const` keyword and name it `monsterHealthText`.
+
+# --hints--
+
+You should declare a `monsterHealthText` variable with `const`.
+
+```js
+assert.match(code, /const monsterHealthText/);
+```
+
+Your `monsterHealthText` variable should have the value of your `#monsterHealth` element.
+
+```js
+assert.deepEqual(monsterHealthText, document.querySelector('#monsterHealth'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+ RPG - Dragon Repeller
+
+
+
+
+ XP: 0
+ Health: 100
+ Gold: 50
+
+
+ Go to store
+ Go to cave
+ Fight dragon
+
+
+ Monster Name:
+ Health:
+
+
+ Welcome to Dragon Repeller. You must defeat the dragon that is preventing people from leaving the town. You are in the town square. Where do you want to go? Use the buttons above.
+
+
+
+
+
+```
+
+```css
+body {
+ background-color: darkblue;
+}
+
+#text {
+ background-color: black;
+ color: white;
+ padding: 10px;
+}
+
+#game {
+ max-width: 500px;
+ max-height: 400px;
+ background-color: lightgray;
+ color: white;
+ margin: 0 auto;
+ padding: 10px;
+}
+
+#controls, #stats {
+ border: 1px solid black;
+ padding: 5px;
+ color: black;
+}
+
+#monsterStats {
+ display: none;
+ border: 1px solid black;
+ padding: 5px;
+ color: white;
+ background-color: red;
+}
+
+.stat {
+ padding-right: 10px;
+}
+```
+
+```js
+let xp = 0;
+let health = 100;
+let gold = 50;
+let currentWeapon = 0;
+let fighting;
+let monsterHealth;
+let inventory = ["stick"];
+
+--fcc-editable-region--
+const button1 = document.querySelector("#button1");
+const button2 = document.querySelector("#button2");
+const button3 = document.querySelector("#button3");
+const text = document.querySelector("#text");
+const xpText = document.querySelector("#xpText");
+const healthText = document.querySelector("#healthText");
+const goldText = document.querySelector("#goldText");
+const monsterStats = document.querySelector("#monsterStats");
+const monsterName = document.querySelector("#monsterName");
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec14d1c216aa063f0be4af.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec14d1c216aa063f0be4af.md
new file mode 100644
index 00000000000..d65212aca6b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec14d1c216aa063f0be4af.md
@@ -0,0 +1,214 @@
+---
+id: 63ec14d1c216aa063f0be4af
+title: Step 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+You will be building a shopping cart application. The HTML and CSS are already provided, but you will need to build the JavaScript to make the page interactive.
+
+To start, you will need to get some of your elements from the DOM. Start by using `document.getElementById()` to get the`#cart-container`, `#products-container`, and `#dessert-card-container` elements. Store them in variables named `cartContainer`, `productsContainer`, and `dessertCards`, respectively.
+
+Since these will not change, remember to use `const` to declare them.
+
+# --hints--
+
+You should use `document.getElementById()` to get the `#cart-container` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)cart-container\1\s*\)/);
+```
+
+You should assign the `#cart-container` element to a variable named `cartContainer`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+cartContainer\s*=\s*document\.getElementById\(\s*('|"|`)cart-container\1\s*\)/);
+```
+
+You should use `document.getElementById()` to get the `#products-container` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)products-container\1\s*\)/);
+```
+
+You should assign the `#products-container` element to a variable named `productsContainer`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+productsContainer\s*=\s*document\.getElementById\(\s*('|"|`)products-container\1\s*\)/);
+```
+
+You should use `document.getElementById()` to get the `#dessert-card-container` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)dessert-card-container\1\s*\)/);
+```
+
+You should assign the `#dessert-card-container` element to a variable named `dessertCards`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+dessertCards\s*=\s*document\.getElementById\(\s*('|"|`)dessert-card-container\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec19978a066607e23439f8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec19978a066607e23439f8.md
new file mode 100644
index 00000000000..98110e0bc8a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec19978a066607e23439f8.md
@@ -0,0 +1,201 @@
+---
+id: 63ec19978a066607e23439f8
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Now you need to get your two buttons. Continuing the pattern, get the `#cart-btn` and `#clear-cart-btn` elements. Store them in variables named `cartBtn` and `clearCartBtn`, respectively.
+
+# --hints--
+
+You should use `document.getElementById()` to get the `#cart-btn` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)cart-btn\1\s*\)/);
+```
+
+You should assign the `#cart-btn` element to a variable named `cartBtn`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+cartBtn\s*=\s*document\.getElementById\(\s*('|"|`)cart-btn\1\s*\)/);
+```
+
+You should use `document.getElementById()` to get the `#clear-cart-btn` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)clear-cart-btn\1\s*\)/);
+```
+
+You should assign the `#clear-cart-btn` element to a variable named `clearCartBtn`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+clearCartBtn\s*=\s*document\.getElementById\(\s*('|"|`)clear-cart-btn\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1a16f930b108b8a76806.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1a16f930b108b8a76806.md
new file mode 100644
index 00000000000..b3616baccb4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1a16f930b108b8a76806.md
@@ -0,0 +1,227 @@
+---
+id: 63ec1a16f930b108b8a76806
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Next is to get your totals. Get the `#total-items`, `#subtotal`, `#taxes`, and `#total` elements. Store them in variables named `totalNumberOfItems`, `cartSubTotal`, `cartTaxes`, and `cartTotal`, respectively.
+
+# --hints--
+
+You should use `document.getElementById()` to get the `#total-items` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)total-items\1\s*\)/);
+```
+
+You should assign the `#total-items` element to a variable named `totalNumberOfItems`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+totalNumberOfItems\s*=\s*document\.getElementById\(\s*('|"|`)total-items\1\s*\)/);
+```
+
+You should use `document.getElementById()` to get the `#subtotal` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)subtotal\1\s*\)/);
+```
+
+You should assign the `#subtotal` element to a variable named `cartSubTotal`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+cartSubTotal\s*=\s*document\.getElementById\(\s*('|"|`)subtotal\1\s*\)/);
+```
+
+You should use `document.getElementById()` to get the `#taxes` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)taxes\1\s*\)/);
+```
+
+You should assign the `#taxes` element to a variable named `cartTaxes`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+cartTaxes\s*=\s*document\.getElementById\(\s*('|"|`)taxes\1\s*\)/);
+```
+
+You should use `document.getElementById()` to get the `#total` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)total\1\s*\)/);
+```
+
+You should assign the `#total` element to a variable named `cartTotal`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+cartTotal\s*=\s*document\.getElementById\(\s*('|"|`)total\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1bbf5584390a7d08d41f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1bbf5584390a7d08d41f.md
new file mode 100644
index 00000000000..a973654d0d6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1bbf5584390a7d08d41f.md
@@ -0,0 +1,209 @@
+---
+id: 63ec1bbf5584390a7d08d41f
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+The last element to get is the `#show-hide-cart` element. Store it in a variable named `showHideCartSpan`.
+
+Then, use `let` to declare a variable named `isCartShowing` and set it to `false`.
+
+# --hints--
+
+You should use `document.getElementById()` to get the `#show-hide-cart` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)show-hide-cart\1\s*\)/);
+```
+
+You should assign the `#show-hide-cart` element to a variable named `showHideCartSpan`. Remember to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+showHideCartSpan\s*=\s*document\.getElementById\(\s*('|"|`)show-hide-cart\1\s*\)/);
+```
+
+You should use `let` to declare a variable named `isCartShowing`.
+
+```js
+assert.match(code, /let\s+isCartShowing/);
+```
+
+You should set the `isCartShowing` variable to `false`.
+
+```js
+assert.match(code, /let\s+isCartShowing\s*=\s*false/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1cb59f2a4c0be5b6dfa0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1cb59f2a4c0be5b6dfa0.md
new file mode 100644
index 00000000000..172acaf6e3f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec1cb59f2a4c0be5b6dfa0.md
@@ -0,0 +1,198 @@
+---
+id: 63ec1cb59f2a4c0be5b6dfa0
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+A shopping cart does not serve much purpose without products. Declare a `products` variable and set it to an empty array. Using an array will allow you to store multiple products.
+
+# --hints--
+
+You should declare a `products` variable with `const`.
+
+```js
+assert.match(code, /const\s+products/);
+```
+
+You should set the `products` variable to an empty array.
+
+```js
+assert.match(code, /const\s+products\s*=\s*\[\s*\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec20a06fff670d37befbd9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec20a06fff670d37befbd9.md
new file mode 100644
index 00000000000..0815e4ecb06
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec20a06fff670d37befbd9.md
@@ -0,0 +1,226 @@
+---
+id: 63ec20a06fff670d37befbd9
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+You now need to start adding products. Before you do that, you need to consider the structure of your product data. A product will need a unique identifier to distinguish it from other products, a price so people know how much it costs, and a name so people know what they are buying. You should also add a category to each product.
+
+Add an object to your `products` array. Give this object an `id` property set to the number `1`, a `name` property set to `Vanilla Cupcakes (6 Pack)`, a `price` property set to the number `12.99`, and a `category` property set to `Cupcake`.
+
+# --hints--
+
+Your products array should have one value.
+
+```js
+assert.equal(products.length, 1);
+```
+
+Your products array should have an object as its first value.
+
+```js
+assert.isObject(products[0]);
+```
+
+Your products array should have an object with an `id` property set to the number `1`.
+
+```js
+assert.equal(products[0].id, 1);
+```
+
+Your products array should have an object with a `name` property set to `Vanilla Cupcakes (6 Pack)`.
+
+```js
+assert.equal(products[0].name, 'Vanilla Cupcakes (6 Pack)');
+```
+
+Your products array should have an object with a `price` property set to the number `12.99`.
+
+```js
+assert.equal(products[0].price, 12.99);
+```
+
+Your products array should have an object with a `category` property set to `Cupcake`.
+
+```js
+assert.equal(products[0].category, 'Cupcake');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+--fcc-editable-region--
+const products = [
+
+];
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec3287b182ec0efe8a3135.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec3287b182ec0efe8a3135.md
new file mode 100644
index 00000000000..30754019c8c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec3287b182ec0efe8a3135.md
@@ -0,0 +1,472 @@
+---
+id: 63ec3287b182ec0efe8a3135
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Following that same data structure, add the products from this table (in order) to your `products` array. Increment the `id` for each product, counting up.
+
+| `name` | `price` | `category` |
+| ------------------------------ | ------- | ----------- |
+| `French Macaroon` | `3.99` | `Macaroon` |
+| `Pumpkin Cupcake` | `3.99` | `Cupcake` |
+| `Chocolate Cupcake` | `5.99` | `Cupcake` |
+| `Chocolate Pretzels (4 Pack)` | `10.99` | `Pretzel` |
+| `Strawberry Ice Cream` | `2.99` | `Ice Cream` |
+| `Chocolate Macaroons (4 Pack)` | `9.99` | `Macaroon` |
+| `Strawberry Pretzel` | `4.99` | `Pretzel` |
+| `Butter Pecan Ice Cream` | `2.99` | `Ice Cream` |
+| `Rocky Road Ice Cream` | `2.99` | `Ice Cream` |
+| `Vanilla Macaroons (5 Pack)` | `11.99` | `Macaroon` |
+| `Lemon Cupcakes (4 Pack)` | `12.99` | `Cupcake` |
+
+# --hints--
+
+Your second object in the `products` array should have an `id` property set to the number `2`.
+
+```js
+assert.equal(products[1].id, 2);
+```
+
+Your second object in the `products` array should have a `name` property set to `French Macaroon`.
+
+```js
+assert.equal(products[1].name, 'French Macaroon');
+```
+
+Your second object in the `products` array should have a `price` property set to the number `3.99`.
+
+```js
+assert.equal(products[1].price, 3.99);
+```
+
+Your second object in the `products` array should have a `category` property set to `Macaroon`.
+
+```js
+assert.equal(products[1].category, 'Macaroon');
+```
+
+Your third object in the `products` array should have an `id` property set to the number `3`.
+
+```js
+assert.equal(products[2].id, 3);
+```
+
+Your third object in the `products` array should have a `name` property set to `Pumpkin Cupcake`.
+
+```js
+assert.equal(products[2].name, 'Pumpkin Cupcake');
+```
+
+Your third object in the `products` array should have a `price` property set to the number `3.99`.
+
+```js
+assert.equal(products[2].price, 3.99);
+```
+
+Your third object in the `products` array should have a `category` property set to `Cupcake`.
+
+```js
+assert.equal(products[2].category, 'Cupcake');
+```
+
+Your fourth object in the `products` array should have an `id` property set to the number `4`.
+
+```js
+assert.equal(products[3].id, 4);
+```
+
+Your fourth object in the `products` array should have a `name` property set to `Chocolate Cupcake`.
+
+```js
+assert.equal(products[3].name, 'Chocolate Cupcake');
+```
+
+Your fourth object in the `products` array should have a `price` property set to the number `5.99`.
+
+```js
+assert.equal(products[3].price, 5.99);
+```
+
+Your fourth object in the `products` array should have a `category` property set to `Cupcake`.
+
+```js
+assert.equal(products[3].category, 'Cupcake');
+```
+
+Your fifth object in the `products` array should have an `id` property set to the number `5`.
+
+```js
+assert.equal(products[4].id, 5);
+```
+
+Your fifth object in the `products` array should have a `name` property set to `Chocolate Pretzels (4 Pack)`.
+
+```js
+assert.equal(products[4].name, 'Chocolate Pretzels (4 Pack)');
+```
+
+Your fifth object in the `products` array should have a `price` property set to the number `10.99`.
+
+```js
+assert.equal(products[4].price, 10.99);
+```
+
+Your fifth object in the `products` array should have a `category` property set to `Pretzel`.
+
+```js
+assert.equal(products[4].category, 'Pretzel');
+```
+
+Your sixth object in the `products` array should have an `id` property set to the number `6`.
+
+```js
+assert.equal(products[5].id, 6);
+```
+
+Your sixth object in the `products` array should have a `name` property set to `Strawberry Ice Cream`.
+
+```js
+assert.equal(products[5].name, 'Strawberry Ice Cream');
+```
+
+Your sixth object in the `products` array should have a `price` property set to the number `2.99`.
+
+```js
+assert.equal(products[5].price, 2.99);
+```
+
+Your sixth object in the `products` array should have a `category` property set to `Ice Cream`.
+
+```js
+assert.equal(products[5].category, 'Ice Cream');
+```
+
+Your seventh object in the `products` array should have an `id` property set to the number `7`.
+
+```js
+assert.equal(products[6].id, 7);
+```
+
+Your seventh object in the `products` array should have a `name` property set to `Chocolate Macaroons (4 Pack)`.
+
+```js
+assert.equal(products[6].name, 'Chocolate Macaroons (4 Pack)');
+```
+
+Your seventh object in the `products` array should have a `price` property set to the number `9.99`.
+
+```js
+assert.equal(products[6].price, 9.99);
+```
+
+Your seventh object in the `products` array should have a `category` property set to `Macaroon`.
+
+```js
+assert.equal(products[6].category, 'Macaroon');
+```
+
+Your eighth object in the `products` array should have an `id` property set to the number `8`.
+
+```js
+assert.equal(products[7].id, 8);
+```
+
+Your eighth object in the `products` array should have a `name` property set to `Strawberry Pretzel`.
+
+```js
+assert.equal(products[7].name, 'Strawberry Pretzel');
+```
+
+Your eighth object in the `products` array should have a `price` property set to the number `4.99`.
+
+```js
+assert.equal(products[7].price, 4.99);
+```
+
+Your eighth object in the `products` array should have a `category` property set to `Pretzel`.
+
+```js
+assert.equal(products[7].category, 'Pretzel');
+```
+
+Your ninth object in the `products` array should have an `id` property set to the number `9`.
+
+```js
+assert.equal(products[8].id, 9);
+```
+
+Your ninth object in the `products` array should have a `name` property set to `Butter Pecan Ice Cream`.
+
+```js
+assert.equal(products[8].name, 'Butter Pecan Ice Cream');
+```
+
+Your ninth object in the `products` array should have a `price` property set to the number `2.99`.
+
+```js
+assert.equal(products[8].price, 2.99);
+```
+
+Your ninth object in the `products` array should have a `category` property set to `Ice Cream`.
+
+```js
+assert.equal(products[8].category, 'Ice Cream');
+```
+
+Your tenth object in the `products` array should have an `id` property set to the number `10`.
+
+```js
+assert.equal(products[9].id, 10);
+```
+
+Your tenth object in the `products` array should have a `name` property set to `Rocky Road Ice Cream`.
+
+```js
+assert.equal(products[9].name, 'Rocky Road Ice Cream');
+```
+
+Your tenth object in the `products` array should have a `price` property set to the number `2.99`.
+
+```js
+assert.equal(products[9].price, 2.99);
+```
+
+Your tenth object in the `products` array should have a `category` property set to `Ice Cream`.
+
+```js
+assert.equal(products[9].category, 'Ice Cream');
+```
+
+Your eleventh object in the `products` array should have an `id` property set to the number `11`.
+
+```js
+assert.equal(products[10].id, 11);
+```
+
+Your eleventh object in the `products` array should have a `name` property set to `Vanilla Macaroons (5 Pack)`.
+
+```js
+assert.equal(products[10].name, 'Vanilla Macaroons (5 Pack)');
+```
+
+Your eleventh object in the `products` array should have a `price` property set to the number `11.99`.
+
+```js
+assert.equal(products[10].price, 11.99);
+```
+
+Your eleventh object in the `products` array should have a `category` property set to `Macaroon`.
+
+```js
+assert.equal(products[10].category, 'Macaroon');
+```
+
+Your twelfth object in the `products` array should have an `id` property set to the number `12`.
+
+```js
+assert.equal(products[11].id, 12);
+```
+
+Your twelfth object in the `products` array should have a `name` property set to `Lemon Cupcakes (4 Pack)`.
+
+```js
+assert.equal(products[11].name, 'Lemon Cupcakes (4 Pack)');
+```
+
+Your twelfth object in the `products` array should have a `price` property set to the number `12.99`.
+
+```js
+assert.equal(products[11].price, 12.99);
+```
+
+Your twelfth object in the `products` array should have a `category` property set to `Cupcake`.
+
+```js
+assert.equal(products[11].category, 'Cupcake');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+--fcc-editable-region--
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+
+];
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec3427fc3e9214c9ed2a14.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec3427fc3e9214c9ed2a14.md
new file mode 100644
index 00000000000..2a000e8614e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec3427fc3e9214c9ed2a14.md
@@ -0,0 +1,281 @@
+---
+id: 63ec3427fc3e9214c9ed2a14
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Now that you have your list of products, you can use JavaScript to insert them into the HTML. With this approach, if you decide to add more products, the HTML will automatically reflect that.
+
+Start by calling the `.forEach` method of your `products` array. Use arrow syntax to create an empty callback function.
+
+# --hints--
+
+You should call the `.forEach` method of your `products` array.
+
+```js
+assert.match(code, /products\.forEach\(/);
+```
+
+You should use arrow syntax to create an empty callback function.
+
+```js
+assert.match(code, /\(\s*\)\s*=>\s*\{\s*\}/)
+```
+
+You should pass your empty callback function to the `.forEach` method.
+
+```js
+assert.match(code, /products\.forEach\(\s*\(\s*\)\s*=>\s*\{\s*\}\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec36f6133df7160be3ec66.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec36f6133df7160be3ec66.md
new file mode 100644
index 00000000000..e9a2c069456
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec36f6133df7160be3ec66.md
@@ -0,0 +1,277 @@
+---
+id: 63ec36f6133df7160be3ec66
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Remember that you can use destructuring to extract multiple values from an array or object in a single statement.
+
+For the first parameter of your callback function, destructure the `name`, `id`, `price`, and `category` properties from the object passed in.
+
+# --hints--
+
+You should use destructuring to declare `name`, `id`, `price`, and `category` parameters. For this test, order matters.
+
+```js
+assert.match(code, /\{\s*name\s*,\s*id\s*,\s*price\s*,\s*category\s*\}/);
+```
+
+Your destructuring should be the first parameter of the callback function.
+
+```js
+assert.match(code, /products.forEach\(\s*\(\s*\{\s*name\s*,\s*id\s*,\s*price\s*,\s*category\s*\}\s*\)\s*=>/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+--fcc-editable-region--
+products.forEach(
+ () => {}
+);
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec47b454495519739486a7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec47b454495519739486a7.md
new file mode 100644
index 00000000000..4add604d105
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ec47b454495519739486a7.md
@@ -0,0 +1,283 @@
+---
+id: 63ec47b454495519739486a7
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+You need to display the available products in your HTML. Start by using the addition assignment operator to add an empty template literal string to the `innerHTML` property of the `dessertCards` variable.
+
+# --hints--
+
+You should use access the `innerHTML` property of the `dessertCards` variable.
+
+```js
+assert.match(code, /dessertCards\.innerHTML/);
+```
+
+You should use the addition assignment operator on the `innerHTML` property.
+
+```js
+assert.match(code, /dessertCards\.innerHTML\s*\+=\s*/);
+```
+
+You should add an empty template literal string to the `innerHTML` property.
+
+```js
+assert.match(code, /dessertCards\.innerHTML\s*\+=\s*`\s*`/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+--fcc-editable-region--
+products.forEach(
+ ({ name, id, price, category }) => {
+
+ }
+);
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5d38a5d29d0696f8d820.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5d38a5d29d0696f8d820.md
new file mode 100644
index 00000000000..02a59b523b4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5d38a5d29d0696f8d820.md
@@ -0,0 +1,297 @@
+---
+id: 63ee5d38a5d29d0696f8d820
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+In your template literal, create a `div` element with a class of `dessert-card`. In that `div`, create an `h2` element and give it the text of the `name` variable.
+
+# --hints--
+
+You should create a `div` element.
+
+```js
+assert.isAtLeast(document.querySelectorAll('div')?.length, 12);
+```
+
+Your `div` element should have a class of `dessert-card`.
+
+```js
+assert.equal(document.querySelectorAll('.dessert-card')?.length, 12);
+```
+
+You should create an `h2` element.
+
+```js
+assert.isAtLeast(document.querySelectorAll('h2')?.length, 12);
+```
+
+Your `h2` element should have the text of the `name` variable.
+
+```js
+assert.equal(document.querySelectorAll('h2')[0]?.textContent, 'Vanilla Cupcakes (6 Pack)');
+```
+
+Your `h2` element should be inside the `div` element.
+
+```js
+assert.equal(document.querySelectorAll('div h2')?.length, 12);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+--fcc-editable-region--
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+ `;
+ }
+);
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5d8f9e7168076e932fe2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5d8f9e7168076e932fe2.md
new file mode 100644
index 00000000000..96485328760
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5d8f9e7168076e932fe2.md
@@ -0,0 +1,309 @@
+---
+id: 63ee5d8f9e7168076e932fe2
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+After your `h2` element, create two `p` elements. Give the first a `class` of `dessert-price`, and the text of the `price` variable with a dollar sign in front of it. Give the second a `class` of `product-category`, and the text `Category:` followed by the value of the `category` variable.
+
+# --hints--
+
+You should create two `p` elements.
+
+```js
+assert.equal(document.querySelector('.dessert-card')?.children.length, 3);
+assert.equal(document.querySelector('.dessert-card')?.querySelectorAll('p')?.length, 2)
+```
+
+Your `p` elements should come after your `h2` element.
+
+```js
+assert.equal(document.querySelector('.dessert-card')?.children[0].tagName, 'H2');
+assert.equal(document.querySelector('.dessert-card')?.children[1].tagName, 'P');
+assert.equal(document.querySelector('.dessert-card')?.children[2].tagName, 'P');
+```
+
+Your first `p` element should have a `class` of `dessert-price`.
+
+```js
+assert.equal(document.querySelector('.dessert-card')?.children[1].className, 'dessert-price');
+```
+
+Your first `p` element should have the text of the `price` variable with a dollar sign in front of it.
+
+```js
+assert.equal(document.querySelector('.dessert-card')?.children[1].textContent, '$12.99');
+```
+
+Your second `p` element should have a `class` of `product-category`.
+
+```js
+assert.equal(document.querySelector('.dessert-card')?.children[2].className, 'product-category');
+```
+
+Your second `p` element should have the text `Category:` followed by the value of the `category` variable.
+
+```js
+assert.equal(document.querySelector('.dessert-card')?.children[2].textContent, 'Category: Cupcake');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+--fcc-editable-region--
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
+
+ `;
+ }
+);
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5e0f08e82208364c4128.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5e0f08e82208364c4128.md
new file mode 100644
index 00000000000..6092f597046
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5e0f08e82208364c4128.md
@@ -0,0 +1,304 @@
+---
+id: 63ee5e0f08e82208364c4128
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Finally, after your `p` elements, create a `button` element. Give it an `id` set to the value of the `id` variable, a `class` of `btn add-to-cart-btn`, and use `Add to cart` for the text.
+
+# --hints--
+
+You should create a `button` element.
+
+```js
+assert.equal(document.querySelectorAll('.dessert-card button')?.length, 12);
+```
+
+Your `button` element should come after your `p` elements.
+
+```js
+assert.equal(document.querySelector('.dessert-card button')?.previousElementSibling?.tagName, 'P');
+assert.isNull(document.querySelector('.dessert-card button')?.nextElementSibling);
+```
+
+Your `button` element should have an `id` set to the value of the `id` variable.
+
+```js
+assert.equal(document.querySelector('.dessert-card button')?.id, '1');
+```
+
+Your `button` element should have a `class` of `btn add-to-cart-btn`.
+
+```js
+assert.include(document.querySelector('.dessert-card button')?.className, 'btn');
+assert.include(document.querySelector('.dessert-card button')?.className, 'add-to-cart-btn');
+```
+
+Your `button` element should have the text `Add to cart`.
+
+```js
+assert.equal(document.querySelector('.dessert-card button')?.textContent?.trim(), 'Add to cart');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+--fcc-editable-region--
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
+
+ `;
+ }
+);
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5ea8be892e0955ab346c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5ea8be892e0955ab346c.md
new file mode 100644
index 00000000000..44ba9af32dc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5ea8be892e0955ab346c.md
@@ -0,0 +1,303 @@
+---
+id: 63ee5ea8be892e0955ab346c
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+You are already familiar with an HTML `class`, but JavaScript also has a class . In JavaScript, a class is like a blueprint for creating objects. It allows you to define a set of properties and methods, and instantiate (or create) new objects with those properties and methods.
+
+The `class` keyword is used to declare a class. Here is an example of declaring a `Computer` class:
+
+```js
+class Computer {};
+```
+
+Declare a `ShoppingCart` class.
+
+# --hints--
+
+You should declare a `ShoppingCart` variable.
+
+```js
+assert.match(code, /ShoppingCart/);
+```
+
+You should use the `class` keyword to declare a `ShoppingCart` class.
+
+```js
+assert.match(code, /class\s+ShoppingCart\s*/);
+```
+
+Your `ShoppingCart` class should be empty.
+
+```js
+assert.match(code, /class\s+ShoppingCart\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5fc113bcb20a5db9214b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5fc113bcb20a5db9214b.md
new file mode 100644
index 00000000000..87839e53275
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee5fc113bcb20a5db9214b.md
@@ -0,0 +1,300 @@
+---
+id: 63ee5fc113bcb20a5db9214b
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Classes have a special `constructor` method, which is called when a new instance of the class is created. The `constructor` method is a great place to initialize properties of the class. Here is an example of a class with a `constructor` method:
+
+```js
+class Computer {
+ constructor() {
+ }
+}
+```
+
+Add an empty `constructor` method to the `ShoppingCart` class.
+
+# --hints--
+
+You should add a `constructor` method to the `ShoppingCart` class.
+
+```js
+assert.match(code, /class\s+ShoppingCart\s*\{\s*constructor\(\s*\)\s*/)
+```
+
+Your `constructor` method should be empty.
+
+```js
+assert.match(code, /class\s+ShoppingCart\s*\{\s*constructor\(\s*\)\s*\{\s*\}\s*\}/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+--fcc-editable-region--
+class ShoppingCart {
+
+};
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee611d478dca0b77f6a393.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee611d478dca0b77f6a393.md
new file mode 100644
index 00000000000..4f7a2390687
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee611d478dca0b77f6a393.md
@@ -0,0 +1,316 @@
+---
+id: 63ee611d478dca0b77f6a393
+title: Step 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+The `this` keyword in JavaScript is used to refer to the current object. Depending on where `this` is used, what it references changes. In the case of a class, it refers to the instance of the object being constructed. You can use the `this` keyword to set the properties of the object being instantiated. Here is an example:
+
+```js
+class Computer {
+ constructor() {
+ this.ram = 16;
+ }
+}
+```
+
+In your constructor, use the `this` keyword to set the `items` property to an empty array. Also, set the `total` property to `0`, and the `taxRate` property to `8.25`.
+
+# --hints--
+
+You should use the `this` keyword to set the `items` property of your class to an empty array.
+
+```js
+assert.match(code, /this\.items/);
+const cart = new ShoppingCart();
+assert.isArray(cart.items);
+assert.isEmpty(cart.items);
+```
+
+You should use the `this` keyword to set the `total` property of your class to `0`.
+
+```js
+assert.match(code, /this\.total/);
+const cart = new ShoppingCart();
+assert.equal(cart.total, 0);
+```
+
+You should use the `this` keyword to set the `taxRate` property of your class to `8.25`.
+
+```js
+assert.match(code, /this\.taxRate/);
+const cart = new ShoppingCart();
+assert.equal(cart.taxRate, 8.25);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+--fcc-editable-region--
+class ShoppingCart {
+ constructor() {
+
+ }
+};
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee7c664f9b65137d925c8a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee7c664f9b65137d925c8a.md
new file mode 100644
index 00000000000..86c81b0332a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63ee7c664f9b65137d925c8a.md
@@ -0,0 +1,321 @@
+---
+id: 63ee7c664f9b65137d925c8a
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Your `ShoppingCart` class needs the ability to add items. Create an empty `addItem` method, which takes two parameters: `id` and `products`. Creating a method might look like this:
+
+```js
+class Computer {
+ constructor() {
+ this.ram = 16;
+ }
+
+ addRam(amount) {
+ this.ram += amount;
+ }
+}
+```
+
+The first parameter, `id`, is the `id` of the product the user has added to their cart. The second parameter, `products`, is an array of product objects. By using a parameter instead of directly referencing your existing `products` array, this method will be more flexible if you wanted to add additional product lists in the future.
+
+# --hints--
+
+Your `ShoppingCart` class should have an `addItem` method.
+
+```js
+const cart = new ShoppingCart();
+assert.isFunction(cart.addItem);
+```
+
+Your `addItem` method should take two parameters: `id` and `products`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /\(\s*id\s*,\s*products\s*\)/);
+```
+
+Your `addItem` method should be empty.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /\(\s*id\s*,\s*products\s*\)\s*\{\s*\}/);
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+--fcc-editable-region--
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+
+};
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea5cea403a81a68ae493c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea5cea403a81a68ae493c.md
new file mode 100644
index 00000000000..88900979e4b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea5cea403a81a68ae493c.md
@@ -0,0 +1,331 @@
+---
+id: 63eea5cea403a81a68ae493c
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+You need to find the product that the user is adding to the cart. Remember that arrays have a `.find()` method. In your `addItem` function, declare a `product` variable, and assign it the value of calling the `.find()` method on the `products` array.
+
+For the callback to `.find()`, pass a function that takes a single parameter `item`, and returns whether the `id` property of `item` is strictly equal to the `id` parameter passed to `addItem`.
+
+# --hints--
+
+You should declare a `product` variable in your `addItem` function.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /product\s*=/);
+```
+
+You should call the `.find()` method on your `products` array.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /products\.find\(/);
+```
+
+You should pass a callback function to the `.find()` method.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /products\.find\(\s*function\s*\(/);
+```
+
+The callback function should take a single parameter.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /products\.find\(\s*function\s*\(\s*item\s*\)/);
+```
+
+The callback function should return whether the `id` property of `item` is strictly equal to the `id` parameter passed to `addItem`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /products\.find\(\s*function\s*\(\s*item\s*\)\s*\{\s*return\s+item\.id\s*===\s*id\s*;?\s*\}/);
+```
+
+You should assign the value of the `.find()` method to the `product` variable.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /product\s*=\s*products\.find\(/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea817673c8e1c22927fa6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea817673c8e1c22927fa6.md
new file mode 100644
index 00000000000..fa4bbc91e2f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea817673c8e1c22927fa6.md
@@ -0,0 +1,309 @@
+---
+id: 63eea817673c8e1c22927fa6
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Use `const` and destructuring to extract `name` and `price` variables from `product`.
+
+# --hints--
+
+You should use destructuring to get the `name` and `price` variables.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /\{\s*name\s*,\s*price\s*\}/);
+```
+
+You should use `const` to declare the `name` and `price` variables.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /const\s*\{\s*name\s*,\s*price\s*\}/);
+```
+
+You should use destructuring to get the `name` and `price` variables from `product`.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /const\s*\{\s*name\s*,\s*price\s*\}\s*=\s*product;?\b/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea8e1e143ae1d098c8c9d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea8e1e143ae1d098c8c9d.md
new file mode 100644
index 00000000000..21089f88380
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eea8e1e143ae1d098c8c9d.md
@@ -0,0 +1,311 @@
+---
+id: 63eea8e1e143ae1d098c8c9d
+title: Step 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Now you need to push the `product` into the cart's `items` array. Remember to use the `this` keyword.
+
+# --hints--
+
+You should call the `push` method on the `items` array.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /items\.push\(/);
+```
+
+Remember you need to use the `this` keyword to access the `items` array.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /this\.items\.push\(/);
+```
+
+You should `push` the `product` variable to the `items` array.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+assert.deepEqual(cart.items, [products[0]]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eeb8e86becbf1e75c2cb0d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eeb8e86becbf1e75c2cb0d.md
new file mode 100644
index 00000000000..f1583334ed8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eeb8e86becbf1e75c2cb0d.md
@@ -0,0 +1,312 @@
+---
+id: 63eeb8e86becbf1e75c2cb0d
+title: Step 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+You now need a total count of each product that the user has in the cart. Declare a `totalCountPerProduct` variable, and assign it an empty object.
+
+# --hints--
+
+You should declare a `totalCountPerProduct` variable in your `addItem` function.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /totalCountPerProduct\s*=/);
+```
+
+You should use `const` to declare `totalCountPerProduct`.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /const\s+totalCountPerProduct\s*=/);
+```
+
+You should assign an empty object to `totalCountPerProduct`.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /const\s+totalCountPerProduct\s*=\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eedebb0ec0231ff1cede1a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eedebb0ec0231ff1cede1a.md
new file mode 100644
index 00000000000..af217952d82
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eedebb0ec0231ff1cede1a.md
@@ -0,0 +1,327 @@
+---
+id: 63eedebb0ec0231ff1cede1a
+title: Step 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Use the `.forEach()` method to loop through the `items` array. Pass an empty callback function that takes a single parameter `dessert`.
+
+# --hints--
+
+You should use the `.forEach()` method on your `items` array.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /items\.forEach\(/);
+```
+
+Remember to use the `this` keyword to access the `items` array.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /this\.items\.forEach\(/);
+```
+
+You should pass a callback function to the `.forEach()` method.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /this\.items\.forEach\(\s*function\s*\(/);
+```
+
+Your callback function should take a single parameter.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /this\.items\.forEach\(\s*function\s*\(\s*dessert\s*\)/);
+```
+
+Your callback function should be empty.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /this\.items\.forEach\(\s*function\s*\(\s*dessert\s*\)\s*\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63efdbc22a0c56070beabed7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63efdbc22a0c56070beabed7.md
new file mode 100644
index 00000000000..24c1ac26daf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63efdbc22a0c56070beabed7.md
@@ -0,0 +1,323 @@
+---
+id: 63efdbc22a0c56070beabed7
+title: Step 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+In your `forEach` callback, you need to update the `totalCountPerProduct` object. Using the `id` of the current `dessert` as your property, update the value of the property to be the current value plus one. Do not use the addition assignment operator for this.
+
+# --hints--
+
+You should use dot notation to access the `id` property of `dessert`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /dessert\.id/);
+```
+
+You should use bracket notation to access the property of `totalCountPerProduct` that corresponds to `dessert.id`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /totalCountPerProduct\[\s*dessert\.id\s*\]/);
+```
+
+You should use the assignment operator to update the value of the property of `totalCountPerProduct` that corresponds to `dessert.id`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /totalCountPerProduct\[\s*dessert\.id\s*\]\s*=/);
+```
+
+You should update the value of `totalCountPerProduct` to be the current value plus one.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /totalCountPerProduct\[\s*dessert\.id\s*\]\s*=\s*totalCountPerProduct\[\s*dessert\.id\s*\]\s*\+\s*1/);
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+
+ })
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63efe370bbfc4a08d500118e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63efe370bbfc4a08d500118e.md
new file mode 100644
index 00000000000..cba3963dbee
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63efe370bbfc4a08d500118e.md
@@ -0,0 +1,324 @@
+---
+id: 63efe370bbfc4a08d500118e
+title: Step 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+You now have a small bug. When you try to access a property of an object and the property doesn't exist, you get `undefined`. This means if the dessert isn't already present in the `totalCountPerProduct` object, you end up trying to add `1` to `undefined`, which results in `NaN`.
+
+To fix this, you can use the `||` operator to set the value to `0` if it doesn't exist. Wrap your right-hand `totalCountPerProduct[data.id]` in parentheses, and add `|| 0` to the end of the expression.
+
+# --hints--
+
+You should wrap your right-hand `totalCountPerProduct[data.id]` in parentheses.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /totalCountPerProduct\[\s*dessert\.id\s*\]\s*=\s*\(\s*totalCountPerProduct\[\s*dessert\.id\s*\]/);
+```
+
+You should use the `||` operator.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /totalCountPerProduct\[\s*dessert\.id\s*\]\s*=\s*\(\s*totalCountPerProduct\[\s*dessert\.id\s*\]\s*\|\|\s*/);
+```
+
+You should use `0` as your fallback value.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /totalCountPerProduct\[\s*dessert\.id\s*\]\s*=\s*\(\s*totalCountPerProduct\[\s*dessert\.id\s*\]\s*\|\|\s*0\s*\)/);
+```
+
+You should still add `1` to the value.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /totalCountPerProduct\[\s*dessert\.id\s*\]\s*=\s*\(\s*totalCountPerProduct\[\s*dessert\.id\s*\]\s*\|\|\s*0\s*\)\s*\+\s*1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = totalCountPerProduct[dessert.id] + 1;
+ })
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eff02f00e69a0b2ac10b43.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eff02f00e69a0b2ac10b43.md
new file mode 100644
index 00000000000..5e3da866f36
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eff02f00e69a0b2ac10b43.md
@@ -0,0 +1,317 @@
+---
+id: 63eff02f00e69a0b2ac10b43
+title: Step 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Now you need to get prepared to update the display with the new product the user added. Declare a `currentProductCount` variable, and assign it the value of the `totalCountPerProduct` object's property matching the `id` of `product`.
+
+# --hints--
+
+You should declare a `currentProductCount` variable in your `addItem` function.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCount\s*=/);
+```
+
+You should use `const` to declare `currentProductCount`.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /const\s+currentProductCount\s*=/);
+```
+
+You should assign the value of `totalCountPerProduct[product.id]` to `currentProductCount`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCount\s*=\s*totalCountPerProduct\[product\.id\]/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eff98ffb1d5a0d24ec79cb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eff98ffb1d5a0d24ec79cb.md
new file mode 100644
index 00000000000..a1b63e599ad
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63eff98ffb1d5a0d24ec79cb.md
@@ -0,0 +1,336 @@
+---
+id: 63eff98ffb1d5a0d24ec79cb
+title: Step 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+You haven't written the code to generate the HTML yet, but if a product has already been added to the user's cart then there will be a matching element which you'll need.
+
+Use `.getElementById()` to get the matching element - you'll be setting the `id` value to `product-count-for-id${product.id}`, so use a template literal to query that value.
+
+Assign your query to a `currentProductCountSpan` variable.
+
+# --hints--
+
+You should declare a `currentProductCountSpan` variable.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCountSpan\s*=/);
+```
+
+You should use `const` to declare `currentProductCountSpan`.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /const\s+currentProductCountSpan\s*=/);
+```
+
+You should use `document.getElementById()` to get the matching element.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /document\.getElementById\(/);
+```
+
+You should use a template literal to query the `id` value.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /document\.getElementById\(\s*`product-count-for-id\$\{(product\.)?id\}`\s*\)/);
+```
+
+You should assign the value of `document.getElementById()` to `currentProductCountSpan`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCountSpan\s*=\s*document\.getElementById\(/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63effe558c87a70e7072e447.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63effe558c87a70e7072e447.md
new file mode 100644
index 00000000000..4573e021ac0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63effe558c87a70e7072e447.md
@@ -0,0 +1,327 @@
+---
+id: 63effe558c87a70e7072e447
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+The behaviour of the `addItem` method needs to change if the product is already in the cart or not. Create a ternary that checks if the current product is already in the cart. Use `undefined` for both the truthy and falsy expressions to avoid a syntax error.
+
+# --hints--
+
+You should check if `currentProductCount` is greater than `1`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCount\s*>\s*1/);
+```
+
+You should use a ternary operator with your `currentProductCount > 1` condition.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCount\s*>\s*1\s*\?/);
+```
+
+You should use `undefined` as the truthy expression.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCount\s*>\s*1\s*\?\s*undefined/);
+```
+
+You should use `undefined` as the falsy expression.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCount\s*>\s*1\s*\?\s*undefined\s*:\s*undefined/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0165121a9181342d5bc66.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0165121a9181342d5bc66.md
new file mode 100644
index 00000000000..aebdaf9a24f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0165121a9181342d5bc66.md
@@ -0,0 +1,320 @@
+---
+id: 63f0165121a9181342d5bc66
+title: Step 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+For your truthy expression, removing the `undefined`, you need to update the `textContent` of the `currentProductCountSpan` to be the `currentProductCount` followed by an `x`. Use a template literal to do so.
+
+# --hints--
+
+You should remove the `undefined` from your truthy expression.
+
+```js
+const cart = new ShoppingCart();
+assert.notMatch(cart.addItem.toString(), /currentProductCount\s*>\s*1\s*\?\s*undefined/);
+```
+
+You should access the `textContent` property of `currentProductCountSpan`.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /currentProductCount\s*>\s*1\s*\?\s*currentProductCountSpan\.textContent/);
+```
+
+You should use template literal syntax to update the `textContent` to be `${currentProductCount}x`.
+
+```js
+const afterAdd = code.split("addItem")[1];
+assert.match(afterAdd, /currentProductCount\s*>\s*1\s*\?\s*currentProductCountSpan\.textContent\s*=\s*`\$\{currentProductCount\}x`\s*:/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1 ? undefined : undefined;
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f017b4ad028a148eb713c0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f017b4ad028a148eb713c0.md
new file mode 100644
index 00000000000..b6f14c6ae69
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f017b4ad028a148eb713c0.md
@@ -0,0 +1,345 @@
+---
+id: 63f017b4ad028a148eb713c0
+title: Step 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+For your falsy expression, you'll need to add new HTML to your `productsContainer`. Start by removing the `undefined`, then use the addition assignment operator and template literal syntax to add a `div` with the `class` set to `product` and the `id` set to `dessert${id}` to the `innerHTML` property of the `productsContainer`.
+
+# --hints--
+
+You should remove the `undefined` from your falsy expression.
+
+```js
+const cart = new ShoppingCart();
+assert.notMatch(cart.addItem.toString(), /undefined/);
+```
+
+You should use the addition assignment operator to add HTML to the `productsContainer`. Remember that HTML goes in the `innerHTML` property.
+
+```js
+const cart = new ShoppingCart();
+assert.match(cart.addItem.toString(), /productsContainer\.innerHTML\s*\+=\s*/);
+```
+
+You should use template literal syntax to add HTML to the `productsContainer`.
+
+```js
+assert.match(code, /productsContainer\.innerHTML\s*\+=\s*`/);
+```
+
+You should add a `div` to the `productsContainer`.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+assert.equal(productsContainer.children?.[0]?.tagName, "DIV");
+```
+
+Your `div` should have the `class` set to `product`.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+assert.equal(productsContainer.children?.[0]?.className, "product");
+```
+
+Your `div` should have the `id` set to `dessert${id}`.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+assert.equal(productsContainer.children?.[0]?.id, "dessert1");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : undefined;
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f01861f813e01564c95315.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f01861f813e01564c95315.md
new file mode 100644
index 00000000000..dd3815162fa
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f01861f813e01564c95315.md
@@ -0,0 +1,325 @@
+---
+id: 63f01861f813e01564c95315
+title: Step 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Inside your `div`, add two `p` elements. Set the text of the second `p` element to be the value of the `price` variable.
+
+# --hints--
+
+You should add two `p` elements inside your `div` element.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+const div = document.querySelector('.product');
+assert.equal(div?.children.length, 2);
+assert.equal(div?.children[0].tagName, 'P');
+assert.equal(div?.children[1].tagName, 'P');
+```
+
+Your second `p` element should have the text of the `price` variable.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+const div = document.querySelector('.product');
+assert.equal(div?.children[1].textContent, '12.99');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+
+ `;
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f018f04e487e164dc27bd9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f018f04e487e164dc27bd9.md
new file mode 100644
index 00000000000..da747a73c32
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f018f04e487e164dc27bd9.md
@@ -0,0 +1,349 @@
+---
+id: 63f018f04e487e164dc27bd9
+title: Step 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+In your first `p` element, add a `span` element. Give the `span` a class of `product-count` and an `id` of `product-count-for-id${id}`. Then, after the span, give your `p` element the text of the `name` variable.
+
+# --hints--
+
+Your first `p` element should have a `span` element.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+const div = document.querySelector('.product');
+const p = div.querySelector('p');
+assert.equal(p.children.length, 1);
+assert.equal(p.children[0].tagName, 'SPAN');
+```
+
+Your `span` element should have a `class` of `product-count`.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+const div = document.querySelector('.product');
+const p = div.querySelector('p');
+assert.equal(p.children[0].className, 'product-count');
+```
+
+Your `span` element should have an `id` of `product-count-for-id${id}`.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+const div = document.querySelector('.product');
+const p = div.querySelector('p');
+assert.equal(p.children[0].id, 'product-count-for-id1');
+```
+
+Your first `p` element should have the text of the `name` variable. This should be outside the span.
+
+```js
+const cart = new ShoppingCart();
+cart.addItem(1, products);
+const div = document.querySelector('.product');
+const p = div.querySelector('p');
+assert.equal(p.innerText.trim(), 'Vanilla Cupcakes (6 Pack)');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+--fcc-editable-region--
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+ `;
+ }
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f01c9791a0aa1751c73760.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f01c9791a0aa1751c73760.md
new file mode 100644
index 00000000000..852ac25d2b7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f01c9791a0aa1751c73760.md
@@ -0,0 +1,334 @@
+---
+id: 63f01c9791a0aa1751c73760
+title: Step 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+There is still more functionality that your `ShoppingCart` class needs, but first you need to be able to test the code you have currently written. You'll need to instantiate a new `ShoppingCart` object and assign it to a variable. Here is an example of instantiating the `Computer` class from earlier examples:
+
+```js
+const myComputer = new Computer();
+```
+
+Declare a `cart` variable, and assign it a new `ShoppingCart` object. Note the use of the `new` keyword when instantiating the object.
+
+# --hints--
+
+You should use `const` to declare a `cart` variable.
+
+```js
+assert.match(code, /const\s+cart\s*=/);
+```
+
+You should use the `new` keyword to instantiate a new `ShoppingCart` object.
+
+```js
+assert.match(code, /new\s+ShoppingCart\s*\(\s*\)/);
+```
+
+You should assign your new `ShoppingCart` object to the `cart` variable.
+
+```js
+assert.isTrue(cart instanceof ShoppingCart);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0224ceb16dc196d2c860a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0224ceb16dc196d2c860a.md
new file mode 100644
index 00000000000..c2590b8a8ea
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0224ceb16dc196d2c860a.md
@@ -0,0 +1,335 @@
+---
+id: 63f0224ceb16dc196d2c860a
+title: Step 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+You need to get all of the `Add to cart` buttons that you added to the DOM earlier. Declare an `addToCartBtns` variable, and assign it the value of calling the `getElementsByClassName()` method on the `document` object, passing in the string `add-to-cart-btn`.
+
+# --hints--
+
+You should use `const` to declare your `addToCartBtns` variable.
+
+```js
+assert.match(code, /const\s+addToCartBtns\s*=/);
+```
+
+You should call the `getElementsByClassName()` method on the `document` object.
+
+```js
+assert.match(code, /document\s*\.\s*getElementsByClassName\s*\(/);
+```
+
+You should pass the string `add-to-cart-btn` to the `getElementsByClassName()` method.
+
+```js
+assert.match(code, /document\s*\.\s*getElementsByClassName\s*\(\s*('|"|`)add-to-cart-btn\1\s*\)/);
+```
+
+You should assign the value returned by the `getElementsByClassName()` method to the `addToCartBtns` variable.
+
+```js
+assert.deepEqual(addToCartBtns, document.getElementsByClassName('add-to-cart-btn'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+const cart = new ShoppingCart();
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f026d041bc6c1a3d5cba0f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f026d041bc6c1a3d5cba0f.md
new file mode 100644
index 00000000000..fd0129e37ca
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f026d041bc6c1a3d5cba0f.md
@@ -0,0 +1,339 @@
+---
+id: 63f026d041bc6c1a3d5cba0f
+title: Step 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+You need to iterate through the buttons in your `addToCartBtns` variable. However, `.getElementsByClassName()` returns a Collection, which does not have a `forEach` method.
+
+Use the spread operator on the `addToCartBtns` variable to convert it into an array. Then, use the `forEach` method to iterate through the array. Do not pass a callback function yet.
+
+# --hints--
+
+You should use the spread operator on the `addToCartBtns` variable.
+
+```js
+assert.match(code, /\.\.\.addToCartBtns/);
+```
+
+You should spread the `addToCartBtns` variable into an array.
+
+```js
+assert.match(code, /\[\s*\.\.\.addToCartBtns\s*\]/);
+```
+
+You should use the `forEach` method on the array you created.
+
+```js
+assert.match(code, /\[\s*\.\.\.addToCartBtns\s*\]\s*\.\s*forEach\s*\(/);
+```
+
+You should not pass a callback function to the `forEach` method.
+
+```js
+assert.match(code, /\[\s*\.\.\.addToCartBtns\s*\]\s*\.\s*forEach\s*\(\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0284532742c1b26c7a052.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0284532742c1b26c7a052.md
new file mode 100644
index 00000000000..cae3ba72dbe
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0284532742c1b26c7a052.md
@@ -0,0 +1,339 @@
+---
+id: 63f0284532742c1b26c7a052
+title: Step 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Add your callback function to the `forEach` method. It should take a `btn` parameter. Then, in the callback, add an event listener to the `btn`. The event listener should listen for a `click` event, and should take another callback with an `event` parameter. The second callback should be empty.
+
+# --hints--
+
+You should use arrow syntax to add a callback function to the `forEach` method which takes a `btn` parameter.
+
+```js
+assert.match(code, /\[\s*\.\.\.addToCartBtns\s*\]\s*\.\s*forEach\s*\(\s*\(?\s*btn\s*\)?\s*=>\s*\{/);
+```
+
+You should add an event listener to the `btn` variable.
+
+```js
+assert.match(code, /\[\s*\.\.\.addToCartBtns\s*\]\s*\.\s*forEach\s*\(\s*\(?\s*btn\s*\)?\s*=>\s*\{\s*btn\s*\.\s*addEventListener\s*\(/);
+```
+
+You should listen for a `click` event on the `btn` variable.
+
+```js
+assert.match(code, /\[\s*\.\.\.addToCartBtns\s*\]\s*\.\s*forEach\s*\(\s*\(?\s*btn\s*\)?\s*=>\s*\{\s*btn\s*\.\s*addEventListener\s*\(\s*('|"|`)click\1\s*,\s*/);
+```
+
+You should add an empty callback function to the event listener. Remember to give it an `event` parameter.
+
+```js
+assert.match(code, /\[\s*\.\.\.addToCartBtns\s*\]\s*\.\s*forEach\s*\(\s*\(?\s*btn\s*\)?\s*=>\s*\{\s*btn\s*\.\s*addEventListener\s*\(\s*('|"|`)click\1\s*,\s*\(\s*event\s*\)\s*=>\s*\{\s*\}\s*\)\s*\s*\}\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+--fcc-editable-region--
+[...addToCartBtns].forEach(
+
+);
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0289df84a581bbdbd29b7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0289df84a581bbdbd29b7.md
new file mode 100644
index 00000000000..c27e13717f0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0289df84a581bbdbd29b7.md
@@ -0,0 +1,339 @@
+---
+id: 63f0289df84a581bbdbd29b7
+title: Step 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+In your event listener callback, call the `.addItem()` method of your `cart` object, and pass in the `event.target.id`. Remember that the `id` here will be a string, so you need to convert it to a number.
+
+Pass your `products` array as the second argument.
+
+# --hints--
+
+Your event listener callback should call the `.addItem()` method of your `cart` object.
+
+```js
+assert.match(code, /cart\.addItem\(/);
+```
+
+Your `.addItem()` method should be called with the `event.target.id` as the first argument. Remember to convert the `id` to a number using `Number()`.
+
+```js
+assert.match(code, /cart\.addItem\(\s*Number\(\s*event\.target\.id\s*\)\s*/);
+```
+
+Your `.addItem()` method should be called with the `products` array as the second argument.
+
+```js
+assert.match(code, /cart\.addItem\(\s*Number\(\s*event\.target\.id\s*\)\s*,\s*products\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+--fcc-editable-region--
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+
+ })
+ }
+);
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0295e673b661ccb299e8a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0295e673b661ccb299e8a.md
new file mode 100644
index 00000000000..4b53ebc3ff1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0295e673b661ccb299e8a.md
@@ -0,0 +1,350 @@
+---
+id: 63f0295e673b661ccb299e8a
+title: Step 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+You need a way to access the total number of items in the cart. The best way to do this is to add another method to your `ShoppingCart` class, rather than accessing the `items` array directly.
+
+Add a `getCounts` method to the `ShoppingCart` class. It should return the number of items in the `items` array.
+
+# --hints--
+
+Your `ShoppingCart` class should have a `getCounts` method.
+
+```js
+assert.isFunction(cart.getCounts);
+```
+
+Remember to use the `this` keyword to access the `items` array.
+
+```js
+const afterCounts = code.split('getCounts')[1];
+assert.match(afterCounts, /this\s*\.\s*items\s*\.\s*length/);
+```
+
+Your `getCounts` method should return the number of items in the `items` array.
+
+```js
+assert.equal(cart.getCounts(), 0);
+cart.addItem(1, products);
+assert.equal(cart.getCounts(), 1);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f029b96b9e9e1df93be951.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f029b96b9e9e1df93be951.md
new file mode 100644
index 00000000000..b75a16738ae
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f029b96b9e9e1df93be951.md
@@ -0,0 +1,342 @@
+---
+id: 63f029b96b9e9e1df93be951
+title: Step 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Now you can update the total number of items on the webpage. Assign the value of your `cart` object's `.getCounts()` method to the `textContent` of the `totalNumberOfItems` variable.
+
+# --hints--
+
+You should access the `textContent` property of the `totalNumberOfItems` variable.
+
+```js
+assert.match(code, /totalNumberOfItems\s*\.\s*textContent/)
+```
+
+You should assign the value of your `cart` object's `.getCounts()` method to the `textContent` property of the `totalNumberOfItems` variable.
+
+```js
+assert.match(code, /totalNumberOfItems\s*\.\s*textContent\s*=\s*cart\s*\.\s*getCounts\(\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+--fcc-editable-region--
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+
+ })
+ }
+);
+--fcc-editable-region--
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02a4ef92d711ec1ff618c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02a4ef92d711ec1ff618c.md
new file mode 100644
index 00000000000..ff8d5d86a2e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02a4ef92d711ec1ff618c.md
@@ -0,0 +1,377 @@
+---
+id: 63f02a4ef92d711ec1ff618c
+title: Step 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+You also need to update the total price of the cart when the user adds an item. Create a `calculateTotal` method in the `ShoppingCart` class.
+
+In that method, declare a `subTotal` variable and use the `reduce` method on the `items` array to calculate the sum of the `price` property of each item in the array. Use `total` and `item` as the parameters for your callback.
+
+Remember to set your initial value in the `reduce` method.
+
+# --hints--
+
+You should create a `calculateTotal` method in the `ShoppingCart` class.
+
+```js
+assert.isFunction(cart.calculateTotal);
+```
+
+Your `calculateTotal` method should have a `subTotal` variable declared with `const`.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /const\s+subTotal\s*=/);
+```
+
+Your `calculateTotal` method should use the `reduce` method on the `items` array.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /this\s*\.\s*items\s*\.\s*reduce/);
+```
+
+Your `reduce` callback should use `total` and `item` as the first and second parameter. Remember to use arrow function syntax.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /\(\s*total\s*,\s*item\s*\)\s*=>/);
+```
+
+Your `reduce` callback should return the sum of `total` and `item.price`. Use an implicit return.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /\(\s*total\s*,\s*item\s*\)\s*=>\s*total\s*\+\s*item\.price/);
+```
+
+Your `reduce` call should have an initial value of `0`.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /this\s*\.\s*items\s*\.\s*reduce\s*\(\s*\(total,\s*item\)\s*=>\s*total\s*\+\s*item\.price\s*,\s*0\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02b22cce1c11fe9604381.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02b22cce1c11fe9604381.md
new file mode 100644
index 00000000000..8d4036f7ea6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02b22cce1c11fe9604381.md
@@ -0,0 +1,348 @@
+---
+id: 63f02b22cce1c11fe9604381
+title: Step 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Part of the total cost will include the tax, so you need to calculate that as well. Create a `calculateTaxes` method in the `ShoppingCart` class. This method should take an `amount` parameter.
+
+# --hints--
+
+You should create a `calculateTaxes` method in the `ShoppingCart` class.
+
+```js
+assert.isFunction(cart.calculateTaxes);
+```
+
+Your `calculateTaxes` method should take an `amount` parameter.
+
+```js
+assert.match(cart.calculateTaxes.toString(), /\(\s*amount\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02bdeb9b428208b97eb6b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02bdeb9b428208b97eb6b.md
new file mode 100644
index 00000000000..82d277b0ab0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02bdeb9b428208b97eb6b.md
@@ -0,0 +1,368 @@
+---
+id: 63f02bdeb9b428208b97eb6b
+title: Step 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Your `calculateTaxes` method should return the value of the `taxRate` (divided by 100, to convert it to a percent) multiplied by the `amount` parameter.
+
+For clarity, wrap the `taxRate / 100` calculation in parentheses.
+
+# --hints--
+
+You should divide the `taxRate` by 100 in your `calculateTaxes` method. Remember to use the `this` keyword.
+
+```js
+const afterCalculateTaxes = code.split('calculateTaxes')[1];
+assert.match(afterCalculateTaxes, /this\s*\.\s*taxRate\s*\/\s*100/);
+```
+
+You should wrap the `this.taxRate / 100` calculation in parentheses.
+
+```js
+const afterCalculateTaxes = code.split('calculateTaxes')[1];
+assert.match(afterCalculateTaxes, /\(\s*this\s*\.\s*taxRate\s*\/\s*100\s*\)/);
+```
+
+You should multiply the `amount` parameter by the `taxRate` divided by 100 in your `calculateTaxes` method.
+
+```js
+const afterCalculateTaxes = code.split('calculateTaxes')[1];
+assert.match(afterCalculateTaxes, /amount\s*\*\s*\(\s*this\s*\.\s*taxRate\s*\/\s*100\s*\)|\(\s*this\s*\.\s*taxRate\s*\/\s*100\s*\)\s*\*\s*amount/);
+```
+
+Your `calculateTaxes` method should return the value of the `taxRate` (divided by 100, to convert it to a percent) multiplied by the `amount` parameter.
+
+```js
+console.log(cart.calculateTaxes(10), (cart.taxRate / 100) * 10);
+assert.equal(cart.calculateTaxes(10), (cart.taxRate / 100) * 10);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+ calculateTaxes(amount) {
+
+ }
+--fcc-editable-region--
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02c6e18773921ba50aa53.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02c6e18773921ba50aa53.md
new file mode 100644
index 00000000000..0954c9b4ac6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f02c6e18773921ba50aa53.md
@@ -0,0 +1,361 @@
+---
+id: 63f02c6e18773921ba50aa53
+title: Step 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Because of the way computers store and work with numbers, calculations involving decimal numbers can result in some strange behavior. For example, `0.1 + 0.2` is not equal to `0.3`. This is because computers store decimal numbers as binary fractions, and some binary fractions cannot be represented exactly as decimal fractions.
+
+We want to clean up the number result from your calculation. Wrap your calculation in parentheses (don't include the `return` statement!) and call the `.toFixed()` method on it. Pass the `.toFixed()` method the number `2` as an argument. This will round the number to two decimal places and return a string.
+
+# --hints--
+
+You should wrap your calculation in parentheses.
+
+```js
+const afterCalculateTaxes = code.split('calculateTaxes')[1];
+assert.match(afterCalculateTaxes, /return\s*\(\s*\(\s*this\s*\.\s*taxRate\s*\/\s*100\s*\)\s*\*\s*amount\s*\)/)
+```
+
+You should call the `.toFixed()` method on your calculation.
+
+```js
+const afterCalculateTaxes = code.split('calculateTaxes')[1];
+assert.match(afterCalculateTaxes, /return\s*\(\s*\(\s*this\s*\.\s*taxRate\s*\/\s*100\s*\)\s*\*\s*amount\s*\)\s*\.\s*toFixed\(/)
+```
+
+You should pass the `.toFixed()` method the number `2` as an argument.
+
+```js
+const afterCalculateTaxes = code.split('calculateTaxes')[1];
+assert.match(afterCalculateTaxes, /return\s*\(\s*\(\s*this\s*\.\s*taxRate\s*\/\s*100\s*\)\s*\*\s*amount\s*\)\s*\.\s*toFixed\s*\(\s*2\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+ calculateTaxes(amount) {
+ return (this.taxRate / 100) * amount;
+ }
+--fcc-editable-region--
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0311f5ea9382388d6124f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0311f5ea9382388d6124f.md
new file mode 100644
index 00000000000..d925dca7812
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0311f5ea9382388d6124f.md
@@ -0,0 +1,347 @@
+---
+id: 63f0311f5ea9382388d6124f
+title: Step 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+The issue with `.toFixed()` returning a string is that you want to be able to perform calculations with the tax rate. To fix this, you can pass the `.toFixed()` call (including the calculation) to the `parseFloat()` function. This will convert the fixed string back into a number, preserving the existing decimal places.
+
+Pass your `.toFixed()` call to `parseFloat()`.
+
+# --hints--
+
+You should pass your entire calculation (excluding the `return` statement) to `parseFloat()`.
+
+```js
+const afterCalculateTaxes = code.split('calculateTaxes')[1];
+assert.match(afterCalculateTaxes, /return\s*parseFloat\(\s*\(\s*\(\s*this\s*\.\s*taxRate\s*\/\s*100\s*\)\s*\*\s*amount\s*\)\s*\.\s*toFixed\s*\(\s*2\s*\)\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+ calculateTaxes(amount) {
+ return ((this.taxRate / 100) * amount).toFixed(2);
+ }
+--fcc-editable-region--
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f033fdb1fbcc254999fcc3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f033fdb1fbcc254999fcc3.md
new file mode 100644
index 00000000000..b0527ca7c31
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f033fdb1fbcc254999fcc3.md
@@ -0,0 +1,339 @@
+---
+id: 63f033fdb1fbcc254999fcc3
+title: Step 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+Your cart currently isn't visible on the webpage. To make it visible, start by adding an event listener to the `cartBtn` variable, listening for the click event. The callback does not need any parameters.
+
+# --hints--
+
+You should add an event listener to the `cartBtn` variable.
+
+```js
+assert.match(code, /cartBtn\s*\.\s*addEventListener\s*\(/);
+```
+
+You should listen for a `click` event on the `cartBtn` variable.
+
+```js
+assert.match(code, /cartBtn\s*\.\s*addEventListener\s*\(\s*('|"|`)click\1\s*/);
+```
+
+You should add an empty callback function (using arrow syntax) to the event listener. Remember that it does not need any parameters.
+
+```js
+assert.match(code, /cartBtn\s*\.\s*addEventListener\s*\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*\}\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ })
+ }
+);
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03446c2ed3e264be6c7fc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03446c2ed3e264be6c7fc.md
new file mode 100644
index 00000000000..48e1daa6e0e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03446c2ed3e264be6c7fc.md
@@ -0,0 +1,335 @@
+---
+id: 63f03446c2ed3e264be6c7fc
+title: Step 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Start by inverting the value of `isCartShowing`. Remember that you can use the logical not operator `!` to invert the value of a boolean. Assign the inverted value to `isCartShowing`.
+
+# --hints--
+
+You should invert the value of `isCartShowing`.
+
+```js
+assert.match(code, /!isCartShowing/);
+```
+
+You should assign the inverted value of `isCartShowing` to `isCartShowing`.
+
+```js
+assert.match(code, /isCartShowing\s*=\s*!isCartShowing/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ })
+ }
+);
+
+--fcc-editable-region--
+cartBtn.addEventListener("click", () => {
+
+});
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0348a54a177272071a595.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0348a54a177272071a595.md
new file mode 100644
index 00000000000..1e9f9959098
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0348a54a177272071a595.md
@@ -0,0 +1,348 @@
+---
+id: 63f0348a54a177272071a595
+title: Step 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Now assign the `textContent` of the `showHideCartSpan` variable the result of a ternary expression which checks if `isCartShowing` is true. If it is, set the `textContent` to `Hide`, otherwise set it to `Show`.
+
+# --hints--
+
+You should use the assignment operator on the `textContent` property of the `showHideCartSpan` variable.
+
+```js
+assert.match(code, /showHideCartSpan\s*\.\s*textContent\s*=\s*/)
+```
+
+You should use ternary syntax to check if `isCartShowing` is true.
+
+```js
+assert.match(code, /showHideCartSpan\s*\.\s*textContent\s*=\s*isCartShowing\s*\?\s*/)
+```
+
+You should set the `textContent` of the `showHideCartSpan` variable to `Hide` if `isCartShowing` is true.
+
+```js
+assert.match(code, /showHideCartSpan\s*\.\s*textContent\s*=\s*isCartShowing\s*\?\s*('|"|`)Hide\1\s*:\s*/)
+```
+
+You should set the `textContent` of the `showHideCartSpan` variable to `Show` if `isCartShowing` is false.
+
+```js
+assert.match(code, /showHideCartSpan\s*\.\s*textContent\s*=\s*isCartShowing\s*\?\s*('|"|`)Hide\1\s*:\s*('|"|`)Show\2/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ })
+ }
+);
+
+--fcc-editable-region--
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+
+});
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f034d012f74627ce538d3a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f034d012f74627ce538d3a.md
new file mode 100644
index 00000000000..3fcf304cca6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f034d012f74627ce538d3a.md
@@ -0,0 +1,357 @@
+---
+id: 63f034d012f74627ce538d3a
+title: Step 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Finally, update the `display` property of the `style` object of the `cartContainer` variable to another ternary which checks if `isCartShowing` is true. If it is, set the `display` property to `block`, otherwise set it to `none`.
+
+Now you should be able to see your cart and add items to it.
+
+# --hints--
+
+You should access the `display` property of the `style` property of the `cartContainer` variable.
+
+```js
+assert.match(code, /cartContainer\s*\.\s*style\s*\.\s*display/)
+```
+
+You should use the assignment operator on the `display` property of the `style` property of the `cartContainer` variable.
+
+```js
+assert.match(code, /cartContainer\s*\.\s*style\s*\.\s*display\s*=\s*/)
+```
+
+You should use ternary syntax to check if `isCartShowing` is true.
+
+```js
+assert.match(code, /cartContainer\s*\.\s*style\s*\.\s*display\s*=\s*isCartShowing\s*\?\s*/)
+```
+
+You should set the `display` property of the `style` property of the `cartContainer` variable to `block` if `isCartShowing` is true.
+
+```js
+assert.match(code, /cartContainer\s*\.\s*style\s*\.\s*display\s*=\s*isCartShowing\s*\?\s*('|"|`)block\1\s*:\s*/)
+```
+
+You should set the `display` property of the `style` property of the `cartContainer` variable to `none` if `isCartShowing` is false.
+
+```js
+assert.match(code, /cartContainer\s*\.\s*style\s*\.\s*display\s*=\s*isCartShowing\s*\?\s*('|"|`)block\1\s*:\s*('|"|`)none\2/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ })
+ }
+);
+
+--fcc-editable-region--
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+
+});
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03686c5ea863533ec71f4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03686c5ea863533ec71f4.md
new file mode 100644
index 00000000000..a4c481b5796
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03686c5ea863533ec71f4.md
@@ -0,0 +1,353 @@
+---
+id: 63f03686c5ea863533ec71f4
+title: Step 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Declare a variable `tax` and assign it the value of calling your new `.calculateTaxes()` method, passing `subTotal` as the argument.
+
+# --hints--
+
+Use `const` to declare a variable named `tax`.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /const\s+tax\s*=/);
+```
+
+Assign the value of calling your new `.calculateTaxes()` method, passing `subTotal` as the argument, to the `tax` variable.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /const\s*tax\s*=\s*this\s*\.\s*calculateTaxes\s*\(\s*subTotal\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+--fcc-editable-region--
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+
+ }
+--fcc-editable-region--
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f036ec91fdf238c90665f5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f036ec91fdf238c90665f5.md
new file mode 100644
index 00000000000..936b8a7add9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f036ec91fdf238c90665f5.md
@@ -0,0 +1,352 @@
+---
+id: 63f036ec91fdf238c90665f5
+title: Step 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Update the `total` value to be the sum of the `subTotal` and `tax` values.
+
+# --hints--
+
+You should update the `total` value. Remember to use the `this` keyword.
+
+```js
+assert.match(cart.calculateTotal.toString(), /this\.total/);
+```
+
+You should set the `total` value to be the sum of the `subTotal` and `tax` values.
+
+```js
+assert.match(cart.calculateTotal.toString(), /this\.total\s*=\s*(subTotal\s*\+\s*tax|tax\s*\+\s*subTotal)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+--fcc-editable-region--
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+
+ }
+--fcc-editable-region--
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0370b340915399d31e5eb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0370b340915399d31e5eb.md
new file mode 100644
index 00000000000..cba09f5a3e6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0370b340915399d31e5eb.md
@@ -0,0 +1,367 @@
+---
+id: 63f0370b340915399d31e5eb
+title: Step 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+You're going to update the HTML in this method as well. Set the `textContent` of the `cartSubTotal` to be the value of `subTotal` to a fixed 2 decimal places. Use template literal syntax to add the dollar sign to the beginning of the value.
+
+# --hints--
+
+You should access the `textContent` property of the `cartSubTotal` element.
+
+```js
+assert.match(cart.calculateTotal.toString(), /cartSubTotal\.textContent/);
+```
+
+You should call the `.toFixed()` method on the `subTotal` variable, passing `2` as the argument.
+
+```js
+assert.match(cart.calculateTotal.toString(), /subTotal\.toFixed\(\s*2\s*\)/);
+```
+
+You should use template literal syntax to add the dollar sign before your `.toFixed()` call.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /`\$\$\{subTotal\.toFixed\(\s*2\s*\)\}\`/);
+```
+
+You should set the `textContent` of the `cartSubTotal` element to your template string.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /cartSubTotal\.textContent\s*=\s*`\$\$\{subTotal\.toFixed\(\s*2\s*\)\}\`/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+--fcc-editable-region--
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+
+ }
+--fcc-editable-region--
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0374d5351223a747c301d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0374d5351223a747c301d.md
new file mode 100644
index 00000000000..37c08222320
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0374d5351223a747c301d.md
@@ -0,0 +1,394 @@
+---
+id: 63f0374d5351223a747c301d
+title: Step 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Following the same pattern as your `cartSubTotal`, update the `cartTaxes` to display the `tax` value, and your `cartTotal` to display the `total` property.
+
+# --hints--
+
+You should access the `textContent` property of the `cartTaxes` element.
+
+```js
+assert.match(cart.calculateTotal.toString(), /cartTaxes\.textContent/);
+```
+
+You should call the `.toFixed()` method on the `tax` variable, passing `2` as the argument.
+
+```js
+assert.match(cart.calculateTotal.toString(), /tax\.toFixed\(\s*2\s*\)/);
+```
+
+You should use template literal syntax to add the dollar sign before your `.toFixed()` call.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /`\$\$\{tax\.toFixed\(\s*2\s*\)\}\`/);
+```
+
+You should set the `textContent` of the `cartTaxes` element to `tax.toFixed` template string.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /cartTaxes\.textContent\s*=\s*`\$\$\{tax\.toFixed\(\s*2\s*\)\}\`/);
+```
+
+You should access the `textContent` property of the `cartTotal` element.
+
+```js
+assert.match(cart.calculateTotal.toString(), /cartTotal\.textContent/);
+```
+
+You should call the `.toFixed()` method on the `total` variable, passing `2` as the argument. Remember to use the `this` keyword.
+
+```js
+assert.match(cart.calculateTotal.toString(), /this\.total\.toFixed\(\s*2\s*\)/);
+```
+
+You should use template literal syntax to add the dollar sign before your `.toFixed()` call.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /`\$\$\{this\.total\.toFixed\(\s*2\s*\)\}\`/);
+```
+
+You should set the `textContent` of the `cartTotal` element to your `total.toFixed` template string.
+
+```js
+const afterCalculateTotal = code.split('calculateTotal')[1];
+assert.match(afterCalculateTotal, /cartTotal\.textContent\s*=\s*`\$\$\{this\.total\.toFixed\(\s*2\s*\)\}\`/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+--fcc-editable-region--
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+
+ }
+--fcc-editable-region--
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0378e173e3c3b7638b528.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0378e173e3c3b7638b528.md
new file mode 100644
index 00000000000..56336e0263e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f0378e173e3c3b7638b528.md
@@ -0,0 +1,352 @@
+---
+id: 63f0378e173e3c3b7638b528
+title: Step 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Finally, return the value of the `total` property. Remember your `this` keyword.
+
+# --hints--
+
+Your `calculateTotal` method should return the value of the `total` property.
+
+```js
+assert.equal(cart.calculateTotal(), 0);
+cart.addItem(1, products);
+assert.approximately(cart.calculateTotal(), 14.06, 0.1);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+--fcc-editable-region--
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+
+ }
+--fcc-editable-region--
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f038a0ae041d3c5b0cdf23.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f038a0ae041d3c5b0cdf23.md
new file mode 100644
index 00000000000..db0f9862452
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f038a0ae041d3c5b0cdf23.md
@@ -0,0 +1,353 @@
+---
+id: 63f038a0ae041d3c5b0cdf23
+title: Step 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Your last feature is to allow users to clear their cart. Add a `clearCart()` method to your `ShoppingCart` class.
+
+# --hints--
+
+Your `ShoppingCart` class should have a `clearCart` method.
+
+```js
+assert.isFunction(cart.clearCart);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ cart.calculateTotal();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f038e671d3f73d5a041973.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f038e671d3f73d5a041973.md
new file mode 100644
index 00000000000..50339959f43
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f038e671d3f73d5a041973.md
@@ -0,0 +1,371 @@
+---
+id: 63f038e671d3f73d5a041973
+title: Step 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+The first thing you should do is check if the `items` array is empty. If it is, display an `alert` to the user with the text `Your shopping cart is already empty`, then return from the function.
+
+Remember that `0` is a falsy value, so you can use the `!` operator to check if the array is empty.
+
+After displaying the alert, return from the function to stop execution.
+
+# --hints--
+
+You should create an `if` statement that checks if the `items` array is empty, using the negation operator.
+
+```js
+assert.match(cart.clearCart.toString(), /if\s*\(\s*!\s*this\s*\.\s*items\s*\.\s*length\s*\)/);
+```
+
+Your `if` statement should display an `alert` to the user with the text `Your shopping cart is already empty`.
+
+```js
+assert.match(cart.clearCart.toString(), /if\s*\(\s*!\s*this\s*\.\s*items\s*\.\s*length\s*\)\s*\{\s*alert\s*\(\s*('|"|`)Your shopping cart is already empty\1\s*\)\s*/);
+```
+
+Your `if` statement should return from the function.
+
+```js
+assert.match(cart.clearCart.toString(), /if\s*\(\s*!\s*this\s*\.\s*items\s*\.\s*length\s*\)\s*\{\s*alert\s*\(\s*('|"|`)Your shopping cart is already empty\1\s*\)\s*;?\s*return\s*;?\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+ clearCart() {
+
+ }
+--fcc-editable-region--
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ cart.calculateTotal();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f039dbcef7673e4e758fa3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f039dbcef7673e4e758fa3.md
new file mode 100644
index 00000000000..23f034e9067
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f039dbcef7673e4e758fa3.md
@@ -0,0 +1,381 @@
+---
+id: 63f039dbcef7673e4e758fa3
+title: Step 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+Browsers have a built-in `confirm()` function which displays a confirmation prompt to the user. `confirm()` accepts a string, which is the message displayed to the user. It returns `true` if the user confirms, and `false` if the user cancels.
+
+Declare a variable `isCartCleared` and assign it the value of calling `confirm()` with the string `"Are you sure you want to clear all items from your shopping cart?"`.
+
+# --hints--
+
+You should use `const` to declare the `isCartCleared` variable.
+
+```js
+const afterClearCart = code.split('clearCart()')[1];
+assert.match(afterClearCart, /const\s+isCartCleared\s*=/);
+```
+
+You should call the `confirm()` function.
+
+```js
+assert.match(cart.clearCart.toString(), /confirm\s*\(/);
+```
+
+You should pass the string `Are you sure you want to clear all items from your shopping cart?` to the `confirm()` function.
+
+```js
+assert.match(cart.clearCart.toString(), /confirm\s*\(\s*('|"|`)Are you sure you want to clear all items from your shopping cart\?\1\s*\)/);
+```
+
+You should assign the value of the `confirm()` function to the `isCartCleared` variable.
+
+```js
+assert.match(cart.clearCart.toString(), /isCartCleared\s*=\s*confirm\s*\(\s*('|"|`)Are you sure you want to clear all items from your shopping cart\?\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+ clearCart() {
+ if (!this.items.length) {
+ alert("Your shopping cart is already empty");
+ return;
+ }
+
+
+ }
+--fcc-editable-region--
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ cart.calculateTotal();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03a7143a6ef3f7f3344f0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03a7143a6ef3f7f3344f0.md
new file mode 100644
index 00000000000..be4fde050a5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03a7143a6ef3f7f3344f0.md
@@ -0,0 +1,378 @@
+---
+id: 63f03a7143a6ef3f7f3344f0
+title: Step 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+You only want to clear the cart if the user confirms the prompt. Create an `if` statement that checks if the user confirmed the prompt.
+
+In the `if` statement, set the `items` property back to an empty array, then set the `total` property to `0`.
+
+# --hints--
+
+You should create an `if` statement that checks if the user confirmed the prompt. Remember that you can check the truthiness of `isCartCleared` directly.
+
+```js
+assert.match(cart.clearCart.toString(), /if\s*\(\s*isCartCleared\s*\)/);
+```
+
+Your `if` statement should set the `items` property back to an empty array.
+
+```js
+assert.match(cart.clearCart.toString(), /if\s*\(\s*isCartCleared\s*\)\s*{\s*this\s*\.\s*items\s*=\s*\[\s*\]/);
+```
+
+Your `if` statement should set the `total` property to `0`.
+
+```js
+assert.match(cart.clearCart.toString(), /if\s*\(\s*isCartCleared\s*\)\s*{\s*this\s*\.\s*items\s*=\s*\[\s*\]\s*;?\s*this\s*\.\s*total\s*=\s*0\s*;?\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+ clearCart() {
+ if (!this.items.length) {
+ alert("Your shopping cart is already empty");
+ return;
+ }
+
+ const isCartCleared = confirm(
+ "Are you sure you want to clear all items from your shopping cart?"
+ );
+
+
+ }
+--fcc-editable-region--
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ cart.calculateTotal();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03ac2b428b2404a5a7518.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03ac2b428b2404a5a7518.md
new file mode 100644
index 00000000000..3b6705168d8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03ac2b428b2404a5a7518.md
@@ -0,0 +1,368 @@
+---
+id: 63f03ac2b428b2404a5a7518
+title: Step 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+You also need to start clearing the HTML. Set the `innerHTML` property of the `productsContainer` back to an empty string.
+
+# --hints--
+
+In your `if` statement, you should set the `innerHTML` property of the `productsContainer` back to an empty string.
+
+```js
+assert.match(cart.clearCart.toString(), /if\s*\(\s*isCartCleared\s*\)\s*{\s*this\s*\.\s*items\s*=\s*\[\s*\]\s*;?\s*this\s*\.\s*total\s*=\s*0\s*;?\s*productsContainer\.innerHTML\s*=\s*('|"|`)\1\s*;?\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+ clearCart() {
+ if (!this.items.length) {
+ alert("Your shopping cart is already empty");
+ return;
+ }
+
+ const isCartCleared = confirm(
+ "Are you sure you want to clear all items from your shopping cart?"
+ );
+
+ if (isCartCleared) {
+ this.items = [];
+ this.total = 0;
+
+ }
+ }
+--fcc-editable-region--
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ cart.calculateTotal();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03af535682e4138fdb915.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03af535682e4138fdb915.md
new file mode 100644
index 00000000000..5a1e7f099f3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03af535682e4138fdb915.md
@@ -0,0 +1,395 @@
+---
+id: 63f03af535682e4138fdb915
+title: Step 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+Set the `textContent` of the `totalNumberOfItems`, `cartSubTotal`, `cartTaxes`, and `cartTotal` elements all to the number `0`.
+
+# --hints--
+
+You should set the `textContent` of the `totalNumberOfItems` element to `0`.
+
+```js
+const secondIf = cart.clearCart.toString().split('if')[2];
+const inIf = secondIf.split('}')[0];
+assert.match(inIf, /totalNumberOfItems\.textContent\s*=\s*0/);
+```
+
+You should set the `textContent` of the `cartSubTotal` element to `0`.
+
+```js
+const secondIf = cart.clearCart.toString().split('if')[2];
+const inIf = secondIf.split('}')[0];
+assert.match(inIf, /cartSubTotal\.textContent\s*=\s*0/);
+```
+
+You should set the `textContent` of the `cartTaxes` element to `0`.
+
+```js
+const secondIf = cart.clearCart.toString().split('if')[2];
+const inIf = secondIf.split('}')[0];
+assert.match(inIf, /cartTaxes\.textContent\s*=\s*0/);
+```
+
+You should set the `textContent` of the `cartTotal` element to `0`.
+
+```js
+const secondIf = cart.clearCart.toString().split('if')[2];
+const inIf = secondIf.split('}')[0];
+assert.match(inIf, /cartTotal\.textContent\s*=\s*0/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+--fcc-editable-region--
+ clearCart() {
+ if (!this.items.length) {
+ alert("Your shopping cart is already empty");
+ return;
+ }
+
+ const isCartCleared = confirm(
+ "Are you sure you want to clear all items from your shopping cart?"
+ );
+
+ if (isCartCleared) {
+ this.items = [];
+ this.total = 0;
+ productsContainer.innerHTML = "";
+
+ }
+ }
+--fcc-editable-region--
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ cart.calculateTotal();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03b1ed5ab15420c057463.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03b1ed5ab15420c057463.md
new file mode 100644
index 00000000000..913c5c53bdb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f03b1ed5ab15420c057463.md
@@ -0,0 +1,744 @@
+---
+id: 63f03b1ed5ab15420c057463
+title: Step 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Your final step is to make your clear button functional. Add a `click` event listener to the `clearCartBtn`. For the callback, you can pass in `cart.clearCart` directly.
+
+However, doing so will not work, because the context of `this` will be the `clearCartBtn` element. You need to bind the `clearCart` method to the `cart` object.
+
+You can do this by passing `cart.clearCart.bind(cart)` as the callback.
+
+And with that, your shopping cart project is complete!
+
+# --hints--
+
+You should add an event listener to your `clearCartBtn` element.
+
+```js
+assert.match(code, /clearCartBtn\.addEventListener\(/);
+```
+
+Your event listener should listen for the `click` event.
+
+```js
+assert.match(code, /clearCartBtn\.addEventListener\(\s*('|"|`)click\1\s*,/);
+```
+
+Your event listener should take `cart.clearCart.bind(cart)` as the callback.
+
+```js
+assert.match(code, /clearCartBtn\.addEventListener\(\s*('|"|`)click\1\s*,\s*cart\.clearCart\s*.bind\(\s*cart\s*\)\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+ clearCart() {
+ if (!this.items.length) {
+ alert("Your shopping cart is already empty");
+ return;
+ }
+
+ const isCartCleared = confirm(
+ "Are you sure you want to clear all items from your shopping cart?"
+ );
+
+ if (isCartCleared) {
+ this.items = [];
+ this.total = 0;
+ productsContainer.innerHTML = "";
+ totalNumberOfItems.textContent = 0;
+ cartSubTotal.textContent = 0;
+ cartTaxes.textContent = 0;
+ cartTotal.textContent = 0;
+ }
+ }
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ cart.calculateTotal();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+ clearCart() {
+ if (!this.items.length) {
+ alert("Your shopping cart is already empty");
+ return;
+ }
+
+ const isCartCleared = confirm(
+ "Are you sure you want to clear all items from your shopping cart?"
+ );
+
+ if (isCartCleared) {
+ this.items = [];
+ this.total = 0;
+ productsContainer.innerHTML = "";
+ totalNumberOfItems.textContent = 0;
+ cartSubTotal.textContent = 0;
+ cartTaxes.textContent = 0;
+ cartTotal.textContent = 0;
+ }
+ }
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+ cart.calculateTotal();
+ })
+ }
+);
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+
+clearCartBtn.addEventListener("click", cart.clearCart.bind(cart));
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f6721d5110af243ef8f3d9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f6721d5110af243ef8f3d9.md
new file mode 100644
index 00000000000..c33ce088a1c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-data-structures-by-building-a-shopping-cart/63f6721d5110af243ef8f3d9.md
@@ -0,0 +1,352 @@
+---
+id: 63f6721d5110af243ef8f3d9
+title: Step 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+Now call your `.calculateTotal()` method inside your `forEach` loop.
+
+# --hints--
+
+You should call `cart.calculateTotal()` inside your `forEach` loop.
+
+```js
+const afterForEach = code.split('[...addToCartBtns].forEach(')[1];
+assert.match(afterForEach, /cart\.calculateTotal\(\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp Shopping Cart
+
+
+
+
+
+
+ Show Cart
+
+
+
Clear Cart
+
+
Total number of items: 0
+
Subtotal: $0
+
Taxes: $0
+
Total: $0
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --black: #000;
+ --white: #fff;
+ --grey: #3b3b4f;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+}
+
+.title {
+ color: var(--light-grey);
+ text-align: center;
+ margin: 25px 0;
+}
+
+#dessert-card-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.dessert-card {
+ background-color: var(--light-grey);
+ padding: 15px;
+ text-align: center;
+ border-radius: 15px;
+ margin: 20px 10px;
+}
+
+.dessert-price {
+ font-size: 1.2rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 100px;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#cart-btn {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+
+.add-to-cart-btn {
+ margin: 30px auto 10px;
+}
+
+#cart-container {
+ display: none;
+ position: absolute;
+ top: 60px;
+ right: 0;
+ background-color: var(--light-grey);
+ width: 200px;
+ height: 400px;
+ border: 8px double var(--black);
+ border-radius: 15px;
+ text-align: center;
+ font-size: 1.2rem;
+ overflow-y: scroll;
+}
+
+.product {
+ margin: 25px 0;
+}
+
+.product-count {
+ display: inline-block;
+ margin-right: 10px;
+}
+
+.product-category {
+ margin: 10px 0;
+}
+
+@media (min-width: 768px) {
+ #dessert-card-container {
+ flex-direction: row;
+ }
+
+ .dessert-card {
+ flex: 1 0 21%;
+ }
+
+ #cart-container {
+ width: 300px;
+ }
+}
+```
+
+```js
+const cartContainer = document.getElementById("cart-container");
+const productsContainer = document.getElementById("products-container");
+const dessertCards = document.getElementById("dessert-card-container");
+const cartBtn = document.getElementById("cart-btn");
+const clearCartBtn = document.getElementById("clear-cart-btn");
+const totalNumberOfItems = document.getElementById("total-items");
+const cartSubTotal = document.getElementById("subtotal");
+const cartTaxes = document.getElementById("taxes");
+const cartTotal = document.getElementById("total");
+const showHideCartSpan = document.getElementById("show-hide-cart");
+let isCartShowing = false;
+
+const products = [
+ {
+ id: 1,
+ name: "Vanilla Cupcakes (6 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+ {
+ id: 2,
+ name: "French Macaroon",
+ price: 3.99,
+ category: "Macaroon",
+ },
+ {
+ id: 3,
+ name: "Pumpkin Cupcake",
+ price: 3.99,
+ category: "Cupcake",
+ },
+ {
+ id: 4,
+ name: "Chocolate Cupcake",
+ price: 5.99,
+ category: "Cupcake",
+ },
+ {
+ id: 5,
+ name: "Chocolate Pretzels (4 Pack)",
+ price: 10.99,
+ category: "Pretzel",
+ },
+ {
+ id: 6,
+ name: "Strawberry Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 7,
+ name: "Chocolate Macaroons (4 Pack)",
+ price: 9.99,
+ category: "Macaroon",
+ },
+ {
+ id: 8,
+ name: "Strawberry Pretzel",
+ price: 4.99,
+ category: "Pretzel",
+ },
+ {
+ id: 9,
+ name: "Butter Pecan Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 10,
+ name: "Rocky Road Ice Cream",
+ price: 2.99,
+ category: "Ice Cream",
+ },
+ {
+ id: 11,
+ name: "Vanilla Macaroons (5 Pack)",
+ price: 11.99,
+ category: "Macaroon",
+ },
+ {
+ id: 12,
+ name: "Lemon Cupcakes (4 Pack)",
+ price: 12.99,
+ category: "Cupcake",
+ },
+];
+
+products.forEach(
+ ({ name, id, price, category }) => {
+ dessertCards.innerHTML += `
+
+
${name}
+
$${price}
+
Category: ${category}
+
Add to cart
+
+
+ `;
+ }
+);
+
+class ShoppingCart {
+ constructor() {
+ this.items = [];
+ this.total = 0;
+ this.taxRate = 8.25;
+ }
+
+ addItem(id, products) {
+ const product = products.find((item) => item.id === id);
+ const { name, price } = product;
+ this.items.push(product);
+
+ const totalCountPerProduct = {};
+ this.items.forEach((dessert) => {
+ totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
+ })
+
+ const currentProductCount = totalCountPerProduct[product.id];
+ const currentProductCountSpan = document.getElementById(`product-count-for-id${id}`);
+
+ currentProductCount > 1
+ ? currentProductCountSpan.textContent = `${currentProductCount}x`
+ : productsContainer.innerHTML += `
+
+
+ ${name}
+
+
${price}
+
+ `;
+ }
+
+ getCounts() {
+ return this.items.length;
+ }
+
+ calculateTaxes(amount) {
+ return parseFloat(((this.taxRate / 100) * amount).toFixed(2));
+ }
+
+ calculateTotal() {
+ const subTotal = this.items.reduce((total, item) => total + item.price, 0);
+ const tax = this.calculateTaxes(subTotal);
+ this.total = subTotal + tax;
+ cartSubTotal.textContent = `$${subTotal.toFixed(2)}`;
+ cartTaxes.textContent = `$${tax.toFixed(2)}`;
+ cartTotal.textContent = `$${this.total.toFixed(2)}`;
+ return this.total;
+ }
+};
+
+const cart = new ShoppingCart();
+const addToCartBtns = document.getElementsByClassName("add-to-cart-btn");
+
+--fcc-editable-region--
+[...addToCartBtns].forEach(
+ (btn) => {
+ btn.addEventListener("click", (event) => {
+ cart.addItem(Number(event.target.id), products);
+ totalNumberOfItems.textContent = cart.getCounts();
+
+ })
+ }
+);
+--fcc-editable-region--
+
+cartBtn.addEventListener("click", () => {
+ isCartShowing = !isCartShowing;
+ showHideCartSpan.textContent = isCartShowing ? "Hide" : "Show";
+ cartContainer.style.display = isCartShowing ? "block" : "none";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641d9a19bff38d34d5a5edb8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641d9a19bff38d34d5a5edb8.md
new file mode 100644
index 00000000000..99b441c6e33
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641d9a19bff38d34d5a5edb8.md
@@ -0,0 +1,148 @@
+---
+id: 641d9a19bff38d34d5a5edb8
+title: Step 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+All the HTML and CSS for this project has been provided for you. You can take a look at the two files to familiarize yourself with them.
+
+Start by getting the `#author-container` and `#load-more-btn` elements with the `.getElementById()` method. Assign them to the variables `authorContainer` and `loadMoreBtn`, respectively.
+
+The variables will not change, so use `const` to declare them.
+
+# --hints--
+
+You should use `document.getElementById()` to get the `#author-container` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)author\-container\1\)/);
+```
+
+You should assign the `#author-container` element to the variable `authorContainer`. Don't forget to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+authorContainer\s*\=\s*document\.getElementById\(\s*('|"|`)author\-container\1\)/);
+```
+
+You should use `document.getElementById()` to get the `#load-more-btn` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)load\-more\-btn\1\)/);
+```
+
+You should assign the `#load-more-btn` element to the variable `loadMoreBtn`. Don't forget to use `const` to declare the variable.
+
+```js
+assert.match(code, /const\s+loadMoreBtn\s*\=\s*document\.getElementById\(\s*('|"|`)load\-more\-btn\1\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da3c6b6fbd742bff6ee40.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da3c6b6fbd742bff6ee40.md
new file mode 100644
index 00000000000..0e15f84dd7a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da3c6b6fbd742bff6ee40.md
@@ -0,0 +1,143 @@
+---
+id: 641da3c6b6fbd742bff6ee40
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+The Fetch API is a built-in JavaScript interface to make network requests to a server. It has a `fetch()` method you can use to make `GET`, `POST`, `PUT`, or `PATCH` requests. In this project, you'll make a `GET` request to a URL for a JSON file with information about authors on freeCodeCamp News.
+
+Here is how you can make a `GET` request with the `fetch()` method:
+
+```js
+fetch("url-goes-here")
+```
+
+Make a `GET` request to this URL: `https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json`. Don't terminate your code with a semi-colon yet.
+
+# --hints--
+
+You should use the `fetch()` method to make a `GET` request to `https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json`.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)/)
+```
+
+You should not have a semi-colon after your `fetch` call.
+
+```js
+assert.notMatch(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\);/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da42481d90c4314c99e94.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da42481d90c4314c99e94.md
new file mode 100644
index 00000000000..ad5ad0532fe
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da42481d90c4314c99e94.md
@@ -0,0 +1,173 @@
+---
+id: 641da42481d90c4314c99e94
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+The `fetch()` method returns a `Promise`, which is a placeholder object that will either be fulfilled if your request is successful, or rejected if your request is unsuccessful.
+
+If the `Promise` is fulfilled, it resolves to a `Response` object, and you can use the `.then()` method to access the `Response`.
+
+Here's how you can chain `.then()` to the `fetch()` method:
+
+```js
+fetch("sample-url-goes-here")
+ .then((res) => res)
+```
+
+Chain the `.then()` method to your `fetch` call. Inside the `.then()` method, add a callback function with `res` as a parameter, then log the `res` to the console so you can see the `Response` object. Open your console and expand the `Response` object to see what it contains.
+
+Again, don't terminate the code with a semi-colon yet.
+
+# --hints--
+
+You should use the `fetch()` method to make a `GET` request to `https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json`.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)/)
+```
+
+You should chain the `.then()` method to your `fetch()` syntax
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(/)
+```
+
+You should add a `res` parameter to your `.then()` method.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?/)
+```
+
+Your `.then()` method should use arrow function syntax.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*/)
+```
+
+You should log the `res` parameter to the console so you can see the `Response` object.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*console\.log\(res\)\)/)
+```
+
+You should not have a semi-colon after your `.then()`.
+
+```js
+assert.notMatch(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*console\.log\(res\)\);/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+--fcc-editable-region--
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da465273051435d332b15.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da465273051435d332b15.md
new file mode 100644
index 00000000000..7fec2d783a4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da465273051435d332b15.md
@@ -0,0 +1,146 @@
+---
+id: 641da465273051435d332b15
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+The data you get from a `GET` request is not usable at first. To make the data usable, you can use the `.json()` method on the `Response` object to parse it into JSON. If you expand the `Prototype` of the `Response` object in the console, you will see the `.json()` method there.
+
+Remove `console.log(res)` and implicitly return `res.json()` instead.
+
+# --hints--
+
+You should remove the `console.log(res)`.
+
+```js
+assert.notMatch(code, /\.then\(\(?res\)?\s*=>\s*console\.log\(res\)\)/)
+```
+
+You should implicitly return `res.json()` in your `.then()`.
+
+```js
+assert.match(code, /\.then\(\(?res\)?\s*=>\s*res.json\(\)\)/)
+```
+
+You should not have a semi-colon after your `.then()`.
+
+```js
+assert.notMatch(code, /\.then\(\(?res\)?\s*=>\s*res.json\(\)\);/)
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+--fcc-editable-region--
+.then((res) => console.log(res))
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da4b16937be43ba24c63d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da4b16937be43ba24c63d.md
new file mode 100644
index 00000000000..a9459eaf14d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da4b16937be43ba24c63d.md
@@ -0,0 +1,176 @@
+---
+id: 641da4b16937be43ba24c63d
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+In order to start working with the data, you will need to use another `.then()` method.
+
+Chain another `.then()` to the existing `.then()` method. This time, pass in `data` as the parameter for the callback function. For the callback, use a curly brace because you will have more than one expression. Within your callback function, log `data` to the console to see what it looks like.
+
+
+# --hints--
+
+You should use the `fetch()` method to make a `GET` request to `https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json`.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)/)
+```
+
+Your first `.then()` should not have a semi-colon.
+
+```js
+assert.notMatch(code, /\.then\(\(?res\)?\s*=>\s*res.json\(\)\);/)
+```
+
+You should chain another `.then()` to the existing `.then()`.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(/)
+```
+
+You should add a `data` parameter to your second `.then()` method.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?/)
+```
+
+Your second `.then()` method should use arrow function syntax.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*/)
+```
+
+Your second `.then()` method should have curly braces.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*/)
+```
+
+Your second `.then()` method should log `data` to the console.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*?console\.log\(data\);?\s*\}\s*\)/)
+```
+
+Your second `.then()` should not not have semi-colon after it.
+
+```js
+assert.notMatch(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*?console\.log\(data\);?\s*\}\s*\);/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+--fcc-editable-region--
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da51a9810e74411262fcc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da51a9810e74411262fcc.md
new file mode 100644
index 00000000000..0b4247deead
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da51a9810e74411262fcc.md
@@ -0,0 +1,198 @@
+---
+id: 641da51a9810e74411262fcc
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+The `.catch()` method is another asynchronous JavaScript method you can use to handle errors. This is useful in case the `Promise` gets rejected.
+
+Chain `.catch()` to the last `.then()`. Pass in a callback function with `err` as the parameter. Inside the callback, use `console.error()` to log possible errors to the console with the text `There was an error: ${err}`. Since you're using `err` in the text, don't forget to use a template literal string with backticks (``) instead of single or double quotes.
+
+**Note**: Now you can terminate your code with a semicolon. You couldn't do that in the previous steps because you'll signal to JavaScript to stop parsing your code, which will affect the `fetch()` syntax.
+
+# --hints--
+
+You should use the `fetch()` method to make a `GET` request to `https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json`.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)/)
+```
+
+You should chain another `.then()` to the existing `.then()`.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(/)
+```
+
+You should add a `data` parameter to your second `.then()` method.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?/)
+```
+
+Your second `.then()` method should use arrow function syntax.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*/)
+```
+
+Your second `.then()` method should have curly braces.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*/)
+```
+
+Your second `.then()` method should log `data` to the console.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*?console\.log\(data\);?\n?\s*\}\)/)
+```
+
+Your second `.then()` should not have a semicolon.
+
+```js
+assert.notMatch(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*?console\.log\(data\);?\n?\s*\}\);/)
+```
+
+You should chain the `.catch()` method to the second `.then()` you already have.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*?console\.log\(data\);?\n?\s*\}\s*\)\n?\s*\.catch\(/)
+```
+
+You should add an `err` parameter to your `.catch()` method.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*?console\.log\(data\);?\n?\s*\}\s*\)\n?\s*\.catch\(\(?err\)?/)
+```
+
+Your `.catch()` method should have an arrow function syntax.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*?console\.log\(data\);?\n?\s*\}\s*\)\n?\s*\.catch\(\(?err\)?\s*=>\s*\{?/)
+```
+
+Your `.catch()` method should use `console.error()` to log `err` to the console with the text \``There was an error: ${err}``. Don't forget to use backticks.
+
+```js
+assert.match(code, /fetch\(('|"|`)https:\/\/cdn\.freecodecamp\.org\/curriculum\/news\-author\-page\/authors\.json\1\)\s*\.then\(\(?res\)?\s*=>\s*res.json\(\)\)\s*\.then\(\(?data\)?\s*=>\s*\{\s*\n?\s*?console\.log\(data\);?\n?\s*\}\s*\)\n?\s*\.catch\(\(?err\)?\s*=>\s*\{?\n?(\s*)?console\.error\(`There\swas\san\serror:\s?\$\{err\}`\);?\n?(\s*)?\}?\)\s*;?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ console.log(data);
+ })
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5462576784453146ec2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5462576784453146ec2.md
new file mode 100644
index 00000000000..60a5b23e01e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5462576784453146ec2.md
@@ -0,0 +1,172 @@
+---
+id: 641da5462576784453146ec2
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Now that you have the data you want, you can use it to populate the UI. But the fetched data contains an array of 26 authors, and if you add them all to the page at the same time, it could lead to poor performance.
+
+Instead, you should add 8 authors at a time, and have a button to add 8 more until there's no more data to display.
+
+Use `let` to create 2 variables named `startingIndex` and `endingIndex`, and assign them the number values `0` and `8`, respectively. Also, create an `authorDataArr` variable with `let` and set it to an empty array.
+
+# --hints--
+
+You should use `let` to declare a variable named `startingIndex`.
+
+```js
+assert.match(code, /let\s+startingIndex/)
+```
+
+You should set your `startingIndex` variable to `0`.
+
+```js
+assert.match(code, /let\s+startingIndex\s*=\s*0;?/)
+```
+
+You should use `let` to declare a variable named `endingIndex`.
+
+```js
+assert.match(code, /let\s*endingIndex/)
+```
+
+You should set your `endingIndex` variable to `8`.
+
+```js
+assert.match(code, /let\s+endingIndex\s*=\s*8;?/)
+```
+
+You should use `let` to declare a variable named `authorDataArr`.
+
+```js
+assert.match(code, /let\s+authorDataArr/)
+```
+
+You should set your `authorDataArr` variable to an empty array (`[]`).
+
+```js
+assert.match(code, /let\s+authorDataArr\s*=\s*\[\];?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ console.log(data);
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5abaac81844a54adb03.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5abaac81844a54adb03.md
new file mode 100644
index 00000000000..b213299f6d4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5abaac81844a54adb03.md
@@ -0,0 +1,168 @@
+---
+id: 641da5abaac81844a54adb03
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Now you'll create a function to populate the UI with the author data. You will call this function inside the second `.then()` method.
+
+Create an empty arrow function named `displayAuthors` that takes `authors` as a parameter.
+
+# --hints--
+
+You should use `const` to create an empty function named `displayAuthors`.
+
+```js
+assert.match(code, /const\s+displayAuthors\s*=\s*/)
+```
+
+`displayAuthors` should be a function.
+
+```js
+assert.isFunction(displayAuthors)
+```
+
+Your `displayAuthors` function should use an arrow syntax.
+
+```js
+assert.match(code, /const\s+displayAuthors\s*=\s*\(.*\)\s*=>\s*/)
+```
+
+Your `displayAuthors` function should take an `authors` parameter.
+
+```js
+assert.match(code, /const\s+displayAuthors\s*=\s*\(authors/)
+```
+
+Your `displayAuthors` function should be empty.
+
+```js
+assert.match(code, /const\s+displayAuthors\s*=\s*\(authors\)\s*=>\s*\{\n?\s*?\};?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ console.log(data);
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5dd6cd6db44f58b7787.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5dd6cd6db44f58b7787.md
new file mode 100644
index 00000000000..7601728e970
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da5dd6cd6db44f58b7787.md
@@ -0,0 +1,144 @@
+---
+id: 641da5dd6cd6db44f58b7787
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Inside your `displayAuthors` function, chain `.forEach()` to `authors`.
+
+# --hints--
+
+You should chain `.forEach()` to `authors`.
+
+```js
+assert.match(code, /authors\.forEach\(\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ console.log(data);
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+--fcc-editable-region--
+
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da615af82bf454215a992.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da615af82bf454215a992.md
new file mode 100644
index 00000000000..91ab374e795
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da615af82bf454215a992.md
@@ -0,0 +1,164 @@
+---
+id: 641da615af82bf454215a992
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Pass an empty callback function to the `.forEach()` method. For the first parameter of the callback, destructure the `author`, `image`, `url`, and `bio` items.
+
+For the second parameter, pass in `index`. This will represent the position of each author, and will be useful for pagination later.
+
+# --hints--
+
+You should destructure `author`, `image`, `url`, and `bio` as the first parameter of your callback function. Don't forget to put them inside curly braces.
+
+```js
+assert.match(code, /authors\.forEach\(\s*\(\s*\{\s*(?:author\s*,\s*image\s*,\s*url\s*,\s*bio)|(?:image\s*,\s*author\s*,\s*url\s*,\s*bio)|(?:url\s*,\s*author\s*,\s*image\s*,\s*bio)|(?:author\s*,\s*url\s*,\s*image\s*,\s*bio)|(?:image\s*,\s*url\s*,\s*author\s*,\s*bio)|(?:url\s*,\s*image\s*,\s*author\s*,\s*bio)|(?:url\s*,\s*image\s*,\s*bio\s*,\s*author)|(?:image\s*,\s*url\s*,\s*bio\s*,\s*author)|(?:bio\s*,\s*url\s*,\s*image\s*,\s*author)|(?:url\s*,\s*bio\s*,\s*image\s*,\s*author)|(?:image\s*,\s*bio\s*,\s*url\s*,\s*author)|(?:bio\s*,\s*image\s*,\s*url\s*,\s*author)|(?:bio\s*,\s*author\s*,\s*url\s*,\s*image)|(?:author\s*,\s*bio\s*,\s*url\s*,\s*image)|(?:url\s*,\s*bio\s*,\s*author\s*,\s*image)|(?:bio\s*,\s*url\s*,\s*author\s*,\s*image)|(?:author\s*,\s*url\s*,\s*bio\s*,\s*image)|(?:url\s*,\s*author\s*,\s*bio\s*,\s*image)|(?:image\s*,\s*author\s*,\s*bio\s*,\s*url)|(?:author\s*,\s*image\s*,\s*bio\s*,\s*url)|(?:bio\s*,\s*image\s*,\s*author\s*,\s*url)|(?:image\s*,\s*bio\s*,\s*author\s*,\s*url)|(?:author\s*,\s*bio\s*,\s*image\s*,\s*url)|(?:bio\s*,\s*author\s*,\s*image\s*,\s*url)\s*\}/)
+```
+
+You should destructure `index` as the second parameter of your callback function. It has to be outside of the curly braces you put the others in.
+
+```js
+assert.match(code, /authors\.forEach\(\s*\(\s*\{.*\}\s*\,\s*index\s*\)/)
+```
+
+Your callback function should use an arrow syntax.
+
+```js
+assert.match(code, /authors\.forEach\(\s*\(\s*\{.*\}\s*\,\s*index\s*\)\s*=>\s*/)
+```
+
+Your callback function should be empty.
+
+```js
+assert.match(code, /authors\.forEach\(\s*\(\s*\{.*\}\s*\,\s*index\)\s*=>\s*\{\s*\}\s*\);?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ console.log(data);
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ --fcc-editable-region--
+ authors.forEach();
+ --fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da6570acf7545931ce477.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da6570acf7545931ce477.md
new file mode 100644
index 00000000000..17ea1556aa5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da6570acf7545931ce477.md
@@ -0,0 +1,155 @@
+---
+id: 641da6570acf7545931ce477
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Now it's time to start building the HTML for the page with your destructured data. You can do this with a combination of the compound assignment operator (`+=`) and the `innerHTML` property.
+
+Inside your callback function, use the compound assignment operator to append an empty template literal to the `innerHTML` of `authorContainer`.
+
+
+# --hints--
+
+You should access the `innerHTML` of `authorContainer`.
+
+```js
+assert.match(code, /authorContainer\.innerHTML\s*/)
+```
+
+You should use compound assignment to append an empty template literal to the `innerHTML` of `authorContainer`.
+
+```js
+assert.match(code, /authorContainer\.innerHTML\s*\+=\s*`\s*\n?\s*`;?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ console.log(data);
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+--fcc-editable-region--
+
+--fcc-editable-region--
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da6dcb6e4c9463d54c75b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da6dcb6e4c9463d54c75b.md
new file mode 100644
index 00000000000..0764afeb790
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da6dcb6e4c9463d54c75b.md
@@ -0,0 +1,162 @@
+---
+id: 641da6dcb6e4c9463d54c75b
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Inside the template literal, create a `div` element with the `id` set to the `index` from the `.forEach()` array method. Remember to use template interpolation to do this.
+
+Also, add a `class` of `user-card` to the `div`.
+
+# --hints--
+
+You should create a `div` element with the class `user-card`.
+
+```js
+displayAuthors([{author: "Kolade"}]);
+assert.include(document.querySelector('#author-container > div')?.className, 'user-card');
+```
+
+Your `div` element should have the `id` of `index`. Remember to use template interpolation to set the `id`.
+
+```js
+displayAuthors([{author: "Naomi"}]);
+assert.equal(document.querySelector('#author-container > div')?.id, '0');
+```
+
+Your `div` element should be empty.
+
+```js
+assert.equal(document.querySelector('#author-container > div')?.innerText, '');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ console.log(data);
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+--fcc-editable-region--
+ authorContainer.innerHTML += ``;
+--fcc-editable-region--
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da7071d0d45467cd59977.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da7071d0d45467cd59977.md
new file mode 100644
index 00000000000..6d78055c771
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da7071d0d45467cd59977.md
@@ -0,0 +1,168 @@
+---
+id: 641da7071d0d45467cd59977
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Now you need to show some information about the author. First, show the author's name.
+
+Create an `h2` tag with the `class` `author-name`. Then, interpolate `author` inside the `h2` tag. This is the author's name.
+
+
+# --hints--
+
+You should create an `h2` element within your `div` element.
+
+```js
+displayAuthors([{author: "Kolade"}]);
+assert.exists(document.querySelector('#author-container > div > h2'));
+```
+
+Your `h2` element should have a class set to `author-name`
+
+```js
+displayAuthors([{name: "Jane", height: 12}])
+assert.equal(document.querySelector('#author-container > div > h2')?.className, 'author-name');
+```
+
+You should interpolate the `author` in your `h2` tag to show the authors' names
+
+```js
+displayAuthors([{author: "Kolade"}]);
+assert.equal(document.querySelector('#author-container > div > h2')?.innerText, 'Kolade');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ console.log(data);
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+ `;
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da73b09e7f046c758e0ed.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da73b09e7f046c758e0ed.md
new file mode 100644
index 00000000000..aacdc42bf9a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da73b09e7f046c758e0ed.md
@@ -0,0 +1,159 @@
+---
+id: 641da73b09e7f046c758e0ed
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+To see the authors' names on the page, you need to call the `displayAuthors` function inside the second `.then()` method. But before that, you need to assign the author data to the empty `authorDataArr` array.
+
+First, remove your `console.log()` statement. Then, assign `data` to the `authorDataArr` variable.
+
+# --hints--
+
+You should remove the console log showing the `data`.
+
+```js
+assert.notMatch(code, /console\.log\(data\);/)
+```
+
+You should assign `data` to the `authorDataArr` variable
+
+```js
+assert.match(code, /authorDataArr\s*=\s*data;?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ --fcc-editable-region--
+ console.log(data);
+
+ --fcc-editable-region--
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+
${author}
+
+ `;
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da791d0c34a472b8d15b6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da791d0c34a472b8d15b6.md
new file mode 100644
index 00000000000..8ae28f085f4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da791d0c34a472b8d15b6.md
@@ -0,0 +1,171 @@
+---
+id: 641da791d0c34a472b8d15b6
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Now `authorDataArr` is the same as the `data` you logged to the console a while ago. Log `authorDataArr` to the console to confirm this.
+
+Inside your `console.log()` statement, add the text `Author Data Array:` as the first parameter and `authorDataArr` as the second parameter. Use comma to separate the text from `authorDataArr`.
+
+# --hints--
+
+You should assign `data` to the `authorDataArr` variable
+
+```js
+assert.match(code, /authorDataArr\s*=\s*data;?/)
+```
+
+You should have a console log with the text `Author Data Array:`.
+
+```js
+assert.match(code, /console\.log\(("|'|`)Author\s+Data\s+Array:\s*\1/)
+```
+
+You should use comma to separate your `Author Data Array:` text and `authorDataArr`.
+
+```js
+assert.match(code, /console\.log\(("|'|`)Author\s+Data\s+Array:\s*\1\,/)
+```
+
+`authorDataArr` should be the second parameter of your console log statement.
+
+```js
+assert.match(code, /console\.log\(("|'|`)Author\s+Data\s+Array:\s*\1\,\s*authorDataArr\);?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+--fcc-editable-region--
+ authorDataArr = data;
+
+--fcc-editable-region--
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+
${author}
+
+ `;
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da7bfbc7f0f477438ad8a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da7bfbc7f0f477438ad8a.md
new file mode 100644
index 00000000000..afeba760e74
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da7bfbc7f0f477438ad8a.md
@@ -0,0 +1,184 @@
+---
+id: 641da7bfbc7f0f477438ad8a
+title: Step 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Now it's time to call the `displayAuthors` function. But again, you don't want to populate the page with all the authors at once. Instead, you can extract a portion of the authors with the `startingIndex` and `endingIndex` variables. The best method to do this is the `.slice()` array method.
+
+First, remove the console log statement showing `authorDataArr`. Then, call the `displayAuthors` function with the `authorDataArr` array and `.slice()`. Use the `startingIndex` variable for the starting point and the `endingIndex` variable for the ending point.
+
+# --hints--
+
+You should assign `data` to the `authorDataArr` variable
+
+```js
+assert.match(code, /authorDataArr\s*=\s*data;?/)
+```
+
+You should remove the console log statement showing `authorDataArr`
+
+```js
+assert.notMatch(code, /console\.log\(("|'|`)Author\s+Data\s+Array:\s*\1\,\s*authorDataArr\);?/)
+```
+
+You should call your `displayAuthors` function.
+
+```js
+assert.match(code, /displayAuthors\(/)
+```
+
+You should call your `displayAuthors` function and pass in an argument of `authorDataArr.slice()`.
+
+```js
+assert.match(code, /displayAuthors\(authorDataArr.slice\(/)
+```
+
+The first parameter of your `slice()` method should be `startingIndex`.
+
+```js
+assert.match(code, /displayAuthors\(authorDataArr.slice\(startingIndex/)
+```
+
+The second parameter of your `slice()` method should be `endingIndex`.
+
+```js
+assert.match(code, /displayAuthors\(authorDataArr.slice\(startingIndex\,\s*endingIndex\)\);?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ --fcc-editable-region--
+ authorDataArr = data;
+ console.log("Author Data Array:", authorDataArr);
+
+ --fcc-editable-region--
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+
${author}
+
+ `;
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da803d9892447d059804e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da803d9892447d059804e.md
new file mode 100644
index 00000000000..237e51097fe
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da803d9892447d059804e.md
@@ -0,0 +1,170 @@
+---
+id: 641da803d9892447d059804e
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Now create an image tag and give it the `class` `user-img`. Use template interpolation to set the `src` attribute to `image` you destructured earlier. Set the `alt` attribute to `author` followed by the text `avatar`. Make sure there is a space between the `author` variable and the word `avatar`, for example, `Quincy Larson avatar`.
+
+# --hints--
+
+You should create an `img` element.
+
+```js
+assert.exists(document.querySelector('img'));
+```
+
+Your `img` element should have the class `user-img`.
+
+```js
+assert.include(document.querySelector('img')?.className, "user-img");
+```
+
+You should set the `src` attribute of your `img` element to `${image}`.
+
+```js
+assert.equal(document.querySelector('img')?.getAttribute('src'), authorDataArr[0].image);
+```
+
+You should set the `alt` attribute of your `img` element to `${author} avatar`.
+
+```js
+assert.equal(document.querySelector('img')?.getAttribute('alt'), `${authorDataArr[0].author} avatar`);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+
${author}
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+ `;
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da836581c254815f785fe.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da836581c254815f785fe.md
new file mode 100644
index 00000000000..1eef6b31025
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da836581c254815f785fe.md
@@ -0,0 +1,168 @@
+---
+id: 641da836581c254815f785fe
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+The next thing you'll show are biographical details about the author. You can do this with `bio` that you destructured earlier.
+
+Add a paragraph element with the `class` `bio`, then interpolate `bio` inside the paragraph element.
+
+
+# --hints--
+
+You should create a `p` element.
+
+```js
+assert.exists(document.querySelector('p'));
+```
+
+Your `p` element should have the class `bio`
+
+```js
+assert.include(document.querySelector('p')?.className, 'bio');
+```
+
+You should interpolate `bio` in your `p` element.
+
+```js
+assert.equal(document.querySelector('p')?.innerText, authorDataArr[0].bio);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+
${author}
+
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+ `;
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da86294fd9f485d3c2bf0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da86294fd9f485d3c2bf0.md
new file mode 100644
index 00000000000..b5f13f13f69
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da86294fd9f485d3c2bf0.md
@@ -0,0 +1,181 @@
+---
+id: 641da86294fd9f485d3c2bf0
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Next, add a link to the author's page on freeCodeCamp News.
+
+Add an anchor element with the `class` `author-link`, interpolate `url` as the value for the `href` attribute, and set `target` to `_blank`. For the text of the anchor element, interpolate `author` followed by the text `'s author page`. For example, `Quincy Larson's author page`.
+
+# --hints--
+
+You should create an anchor element.
+
+```js
+assert.exists(document.querySelector('a'));
+```
+
+Your anchor element should have the class `author-link`.
+
+```js
+assert.include(document.querySelector('a')?.className, "author-link");
+```
+
+You should interpolate `url` as the value of your anchor's `href` attribute.
+
+```js
+assert.equal(document.querySelector('a')?.getAttribute('href'), authorDataArr[0].url);
+```
+
+You should set the `target` attribute of your anchor element to `_blank`.
+
+```js
+assert.equal(document.querySelector('a')?.getAttribute('target'), '_blank');
+```
+
+You should interpolate `author` followed by the text `'s author page` inside your anchor element.
+
+```js
+assert.equal(document.querySelector('a')?.textContent, `${authorDataArr[0].author}'s author page`);
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const displayAuthors = (authors) => {
+ authors.forEach( ({ author, image, url, bio }, index) =>
+ (authorContainer.innerHTML += `
+
+
${author}
+
+
${bio}
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+
+ `)
+ )
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da895fb7ec648a5bdf19c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da895fb7ec648a5bdf19c.md
new file mode 100644
index 00000000000..2cb8442eb5d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da895fb7ec648a5bdf19c.md
@@ -0,0 +1,182 @@
+---
+id: 641da895fb7ec648a5bdf19c
+title: Step 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Now you have everything you want to include in the UI. The next step is to make the `Load More Authors` button fetch more authors whenever it's clicked. You can do this by adding a `click` event to the button and carefully incrementing the `startingIndex` and `endingIndex` variables.
+
+Create a `fetchMoreAuthors` function with the arrow function syntax. Don't put anything in it yet. Make sure you use curly braces because you'll have more than one expression inside the function.
+
+# --hints--
+
+You should use `const` to create a `fetchMoreAuthors` function.
+
+```js
+assert.match(code, /const fetchMoreAuthors\s*=\s*/)
+```
+
+`fetchMoreAuthors` should be a function.
+
+```js
+assert.isFunction(fetchMoreAuthors)
+```
+
+Your `fetchMoreAuthors` function should not take any parameter.
+
+```js
+assert.match(code, /const fetchMoreAuthors\s*=\s*\(\s*\)\s*/)
+```
+
+Your `fetchMoreAuthors` function should use arrow syntax.
+
+```js
+assert.match(code, /const fetchMoreAuthors\s*=\s*\(\)\s*=>\s*/)
+```
+
+Your `fetchMoreAuthors` function should be empty.
+
+```js
+assert.match(code, /const fetchMoreAuthors\s*=\s*\(\)\s*=>\s*\{\s*\}/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da8db2a036048ebe6999e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da8db2a036048ebe6999e.md
new file mode 100644
index 00000000000..bfcc82f33c1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da8db2a036048ebe6999e.md
@@ -0,0 +1,167 @@
+---
+id: 641da8db2a036048ebe6999e
+title: Step 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Inside the `fetchMoreAuthors` function, set the `startingIndex` and `endingIndex` variables to `+= 8` each.
+
+# --hints--
+
+You should set the `startingIndex` variable to `+=8`.
+
+```js
+assert.match(code, /startingIndex\s*\+=\s*8;?/)
+```
+
+You should set the `endingIndex` variable to `+=8`.
+
+```js
+assert.match(code, /endingIndex\s*\+=\s*8;?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const fetchMoreAuthors = () => {
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+};
+
+
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da97c987a514959ada414.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da97c987a514959ada414.md
new file mode 100644
index 00000000000..456f240c26f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da97c987a514959ada414.md
@@ -0,0 +1,187 @@
+---
+id: 641da97c987a514959ada414
+title: Step 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Now call the `displayAuthors` function with a portion of the author data just like you did before.
+
+If you click the `Load More Authors` button after calling the function, it won't work. That's because you still have to add the `click` event listener to the button. You'll do that next.
+
+# --hints--
+
+You should call your `displayAuthors` function.
+
+```js
+const afterAdd = code.split("endingIndex += 8;")[1];
+assert.match(afterAdd, /displayAuthors\(/)
+```
+
+You should call your `displayAuthors` function and pass in an argument of `authorDataArr.slice()`.
+
+```js
+const afterAdd = code.split("endingIndex += 8;")[1];
+assert.match(afterAdd, /displayAuthors\(authorDataArr\.slice\(/)
+```
+
+The first parameter of your `slice()` method should be `startingIndex`.
+
+```js
+const afterAdd = code.split("endingIndex += 8;")[1];
+assert.match(afterAdd, /displayAuthors\(authorDataArr\.slice\(startingIndex/)
+```
+
+The second parameter of your `slice()` method should be `endingIndex`.
+
+```js
+const afterAdd = code.split("endingIndex += 8;")[1];
+assert.match(afterAdd, /displayAuthors\(authorDataArr\.slice\(startingIndex\,\s*endingIndex\)\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+--fcc-editable-region--
+
+--fcc-editable-region--
+};
+
+
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+```
+
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da9aceb788e49a73ebcc9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da9aceb788e49a73ebcc9.md
new file mode 100644
index 00000000000..2ca307dc026
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da9aceb788e49a73ebcc9.md
@@ -0,0 +1,180 @@
+---
+id: 641da9aceb788e49a73ebcc9
+title: Step 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Remember that in step 1 you selected the `Load More Authors` button and assigned it to `loadMoreBtn`.
+
+Use `addEventListener` to add a `click` event listener to `loadMoreBtn`. Also, pass in a reference to the `fetchMoreAuthors` function to run whenever the button is clicked.
+
+After that, when you click the button you should see 8 more authors.
+
+# --hints--
+
+You should call the `addEventListener()` method on your `loadMoreBtn` variable.
+
+```js
+assert.match(code, /loadMoreBtn\.addEventListener\(/)
+```
+
+Your event listener should listen for a `click` event.
+
+```js
+assert.match(code, /loadMoreBtn\.addEventListener\(('|"|`)click\1/)
+```
+
+Your event listener should take `fetchMoreAuthors` as the function to run.
+
+```js
+assert.match(code, /loadMoreBtn\.addEventListener\(('|"|`)click\1,\s*fetchMoreAuthors\);?/)
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+};
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da9ea9b847a49fe6ee9b6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da9ea9b847a49fe6ee9b6.md
new file mode 100644
index 00000000000..6c610c97896
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641da9ea9b847a49fe6ee9b6.md
@@ -0,0 +1,180 @@
+---
+id: 641da9ea9b847a49fe6ee9b6
+title: Step 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Your fCC Authors Page is now complete. But you could improve on a few things.
+
+First, if you click the `Load More Authors` button a couple of time, you'll see that it won't add more authors to the page. That's because you've reached the end of the authors list. For a better user experience, you should make it clear when there's no more data to display by disabling the button and changing its text. An `if` statement is the perfect tool for this.
+
+Inside the `fetchMoreAuthors` function, write an `if` statement and set the condition to `authorDataArr.length <= endingIndex` – meaning there's no more data to load.
+
+# --hints--
+
+You should have an `if` statement.
+
+```js
+assert.match(code, /if\s*\(/)
+```
+
+Your `if` statement should take in `authorDataArr.length <= endingIndex` as its condition.
+
+```js
+assert.match(code, /if\s*\(authorDataArr\.length\s*<=\s*endingIndex\)\s*/)
+```
+
+Your `if` statement should be empty.
+
+```js
+assert.match(code, /if\s*\(authorDataArr\.length\s*<=\s*endingIndex\)\s*\{\s*\}/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+};
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+
+loadMoreBtn.addEventListener('click', fetchMoreAuthors);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daa5ea050f24a7cade6e6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daa5ea050f24a7cade6e6.md
new file mode 100644
index 00000000000..6aaa29790bc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daa5ea050f24a7cade6e6.md
@@ -0,0 +1,172 @@
+---
+id: 641daa5ea050f24a7cade6e6
+title: Step 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+If this condition is met, disable the button by setting its `disabled` property to `true`. Also, set the `textContent` of the button to `No more data to load`.
+
+# --hints--
+
+You should set the `disabled` property of `loadMoreBtn` to `true`.
+
+```js
+assert.match(code, /loadMoreBtn\.disabled\s*=\s*true;?/)
+```
+
+You should set the `textContent` of `loadMoreBtn` to `No more data to load`.
+
+```js
+assert.match(code, /loadMoreBtn\.textContent\s*=\s*('|"|`)No\s+more\s+data\s+to\s+load\1;?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ if (authorDataArr.length <= endingIndex) {
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+ }
+};
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+
+loadMoreBtn.addEventListener('click', fetchMoreAuthors);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daa8c2c3e364ac3650b37.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daa8c2c3e364ac3650b37.md
new file mode 100644
index 00000000000..21ca08cbc44
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daa8c2c3e364ac3650b37.md
@@ -0,0 +1,176 @@
+---
+id: 641daa8c2c3e364ac3650b37
+title: Step 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Next, there's not a lot of separation between each author's name and image, and the rest of the details on the card. A divider will give the author cards a clear visual hierarchy.
+
+Add a `div` element above the author's bio and give it the `class` `purple-divider`.
+
+# --hints--
+
+You should create a `div` element before your `p` element.
+
+```js
+assert.equal(document.querySelector('p')?.previousElementSibling?.tagName, 'DIV');
+```
+
+Your `div` element should have the `class` set to `purple-divider`.
+
+```js
+assert.include(document.querySelector('p')?.previousElementSibling?.className, 'purple-divider');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ if (authorDataArr.length <= endingIndex) {
+ loadMoreBtn.disabled = true;
+ loadMoreBtn.textContent = 'No more data to load';
+ }
+};
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+
+loadMoreBtn.addEventListener('click', fetchMoreAuthors);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daabed8d0584b1150c953.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daabed8d0584b1150c953.md
new file mode 100644
index 00000000000..bc2fa142948
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daabed8d0584b1150c953.md
@@ -0,0 +1,195 @@
+---
+id: 641daabed8d0584b1150c953
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Some of the author bios are much longer than others. To give the cards a uniform look, you can extract the first 50 characters of each one and replace the rest with an ellipsis (...). Otherwise, you can show the entire bio.
+
+Within the paragraph element, replace `bio` with a ternary operator. For the condition, check if the length of `bio` is greater than 50. If it is, use the `.slice()` method to extract the first 50 characters of `bio` and add an ellipsis at the end. Otherwise, show the full `bio`.
+
+# --hints--
+
+You should create a `p` element.
+
+```js
+assert.match(code, //);
+```
+
+You should check if the length of the `bio` text is greater than `50`.
+
+```js
+assert.match(code, /
\$\{\s*bio\.length\s*>\s*50/)
+```
+
+If the `bio` text is greater than `50` characters, you should extract the first 50 characters with `slice()` and replace the rest with `...`. Don't forget that indexes are zero-based.
+
+```js
+assert.match(code, /
\$\{\s*bio\.length\s*>\s*50\s*\?\s*bio\.slice\(\s*0\,\s*49\s*\)\s*\+\s*("|')\.\.\.\2\s*\:/)
+```
+
+If the `bio` text is less than 50 characters, use the `bio` text directly.
+
+```js
+assert.match(code, /
\$\{\s*bio\.length\s*>\s*50\s*\?\s*bio\.slice\(\s*0\,\s*49\s*\)\s*\+\s*("|')\.\.\.\2\s*\:\s*bio\s*\}<\/p>/)
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ console.error(`There was an error: ${err}`);
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ if (authorDataArr.length <= endingIndex) {
+ loadMoreBtn.disabled = true;
+ loadMoreBtn.textContent = 'No more data to load';
+ }
+};
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+
+loadMoreBtn.addEventListener('click', fetchMoreAuthors);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daae5e18eae4b562633e4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daae5e18eae4b562633e4.md
new file mode 100644
index 00000000000..f288cc359bc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641daae5e18eae4b562633e4.md
@@ -0,0 +1,191 @@
+---
+id: 641daae5e18eae4b562633e4
+title: Step 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Finally, what if there's an error and the author data fail to load? Then we need to show an error in the UI. That's exactly what the `.catch()` method is for – handling errors.
+
+Inside the `.catch()`, remove the `console.error()` and set the `innerHTML` of the `authorContainer` to a `p` element with the `class` `error-msg` and text `There was an error loading the authors`.
+
+# --hints--
+
+You should remove your `console.error` and its text.
+
+```js
+assert.notMatch(code, /console\.error\(`There\s+was\s+an\s+error:\s+\$\{err\}`\);/)
+```
+
+You should access the `innerHTML` of `authorContainer` and set it to a `p` element. Don't forget to surround the `p` element with a template literal.
+
+
+```js
+assert.match(code, /authorContainer\.innerHTML\s*=\s*(`|"|').*<\/p>\1/)
+```
+
+Your `p` element should have the class `error-msg`.
+
+```js
+assert.match(code, /(`|"|')/)
+```
+
+Your `p` element should have the text `There was an error loading the authors`.
+
+```js
+assert.match(code, /(`|"|')
There\s+was\s+an\s+error\s+loading\s+the\s+authors<\/p>\1;?/)
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ --fcc-editable-region--
+ console.error(`There was an error: ${err}`);
+
+ --fcc-editable-region--
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ if (authorDataArr.length <= endingIndex) {
+ loadMoreBtn.disabled = true;
+ loadMoreBtn.textContent = 'No more data to load';
+ }
+};
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+
+loadMoreBtn.addEventListener('click', fetchMoreAuthors);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641dab13c1b6f14b9828e6b1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641dab13c1b6f14b9828e6b1.md
new file mode 100644
index 00000000000..80288b931fb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-fetch-and-promises-by-building-an-fcc-authors-page/641dab13c1b6f14b9828e6b1.md
@@ -0,0 +1,332 @@
+---
+id: 641dab13c1b6f14b9828e6b1
+title: Step 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+One more thing. If you keep clicking the `Load More Authors` button until there's no more data to load and the text changes to `No more data to load`, the cursor value is still `pointer`. Why not change the cursor value to `not-allowed` instead?
+
+Access the `style` property of the `Load More Authors` button and set `cursor` to `not-allowed`.
+
+With that, your author page is complete!
+
+# --hints--
+
+You should access the `style` property of `loadMoreBtn` with a dot notation.
+
+```js
+assert.match(code, /loadMoreBtn.style/)
+```
+
+You should access `cursor` from the `style` property with dot notation.
+
+```js
+assert.match(code, /loadMoreBtn.style.cursor/)
+```
+
+You should set the value of the `cursor` property to `not-allowed`.
+
+```js
+assert.match(code, /loadMoreBtn.style.cursor\s*=\s*('|"|`)not\-allowed\1;?/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ authorContainer.innerHTML = 'There was an error loading the authors
';
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ if (authorDataArr.length <= endingIndex) {
+ loadMoreBtn.disabled = true;
+ --fcc-editable-region--
+
+ --fcc-editable-region--
+ loadMoreBtn.textContent = 'No more data to load';
+ }
+};
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+
+loadMoreBtn.addEventListener('click', fetchMoreAuthors);
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ freeCodeCamp News Author Page
+
+
+
+ Load More Authors
+
+
+
+
+
+```
+
+```css
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --main-bg-color: #1b1b32;
+ --light-grey: #f5f6f7;
+ --dark-purple: #5a01a7;
+ --golden-yellow: #feac32;
+}
+
+body {
+ background-color: var(--main-bg-color);
+ text-align: center;
+}
+
+.title {
+ color: var(--light-grey);
+ margin: 20px 0;
+}
+
+#author-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+.user-card {
+ border-radius: 15px;
+ width: 300px;
+ height: 350px;
+ background-color: var(--light-grey);
+ margin: 20px;
+}
+
+.user-img {
+ width: 150px;
+ height: 150px;
+ object-fit: cover;
+}
+
+.purple-divider {
+ background-color: var(--dark-purple);
+ width: 100%;
+ height: 15px;
+}
+
+.author-name {
+ margin: 10px;
+}
+
+.bio {
+ margin: 20px;
+}
+
+.error-msg {
+ color: var(--light-grey);
+}
+
+.btn {
+ cursor: pointer;
+ width: 200px;
+ margin: 10px;
+ color: var(--main-bg-color);
+ font-size: 14px;
+ background-color: var(--golden-yellow);
+ background-image: linear-gradient(#fecc4c, #ffac33);
+ border-color: var(--golden-yellow);
+ border-width: 3px;
+}
+```
+
+```js
+const authorContainer = document.getElementById('author-container');
+const loadMoreBtn = document.getElementById('load-more-btn');
+
+let startingIndex = 0;
+let endingIndex = 8;
+let authorDataArr = [];
+
+fetch('https://cdn.freecodecamp.org/curriculum/news-author-page/authors.json')
+ .then((res) => res.json())
+ .then((data) => {
+ authorDataArr = data;
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ })
+ .catch((err) => {
+ authorContainer.innerHTML = 'There was an error loading the authors
';
+ });
+
+const fetchMoreAuthors = () => {
+ startingIndex += 8;
+ endingIndex += 8;
+
+ displayAuthors(authorDataArr.slice(startingIndex, endingIndex));
+ if (authorDataArr.length <= endingIndex) {
+ loadMoreBtn.disabled = true;
+ loadMoreBtn.style.cursor = "not-allowed"
+ loadMoreBtn.textContent = 'No more data to load';
+ }
+};
+
+const displayAuthors = (authors) => {
+ authors.forEach(({ author, image, url, bio }, index) => {
+ authorContainer.innerHTML += `
+
+ `;
+ });
+};
+
+loadMoreBtn.addEventListener('click', fetchMoreAuthors);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/5ddb965c65d27e1512d44d9a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/5ddb965c65d27e1512d44d9a.md
new file mode 100644
index 00000000000..c3def32154d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/5ddb965c65d27e1512d44d9a.md
@@ -0,0 +1,122 @@
+---
+id: 5ddb965c65d27e1512d44d9a
+title: Step 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+You have been provided with boilerplate CSS and HTML. However, you need to build your calorie counter form.
+
+Feel free to explore the HTML and CSS, then add a `form` element and give it an `id` set to `calorie-counter`.
+
+# --hints--
+
+You should have a `form` element.
+
+```js
+assert.exists(document.querySelector('form'));
+```
+
+Your `form` element should have an `id` attribute set to `calorie-counter`.
+
+```js
+assert.equal(document.querySelector('form')?.id, 'calorie-counter');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b606f09a14cc1781aea1fb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b606f09a14cc1781aea1fb.md
new file mode 100644
index 00000000000..e938bc8c2e3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b606f09a14cc1781aea1fb.md
@@ -0,0 +1,146 @@
+---
+id: 63b606f09a14cc1781aea1fb
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Create a `label` element, give it a `for` attribute set to `budget` and the text `Budget`, then create an `input` element with the `id` set to `budget`.
+
+# --hints--
+
+You should create a `label` element in your `form`.
+
+```js
+assert.exists(document.querySelector('form label'));
+```
+
+Your `label` element should have a `for` attribute set to `budget`.
+
+```js
+assert.equal(document.querySelector('form label')?.getAttribute('for'), 'budget');
+```
+
+Your `label` element should have the text `Budget`.
+
+```js
+assert.equal(document.querySelector('form label')?.innerText, 'Budget');
+```
+
+You should create an `input` element within your `form`.
+
+```js
+assert.exists(document.querySelector('form input'));
+```
+
+Your `input` element should come after your `label` element.
+
+```js
+assert.equal(document.querySelector('form input')?.previousElementSibling?.tagName, "LABEL");
+```
+
+Your `input` element should have an `id` set to `budget`.
+
+```js
+assert.equal(document.querySelector('form input')?.id, "budget");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6075a62883218d282504c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6075a62883218d282504c.md
new file mode 100644
index 00000000000..fcabad47a30
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6075a62883218d282504c.md
@@ -0,0 +1,131 @@
+---
+id: 63b6075a62883218d282504c
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Your `input` element needs some additional attributes. Give it a `type` set to `number` to only allow numeric inputs, a `min` attribute set to `0` to only allow positive numbers, and a `placeholder` set to `Daily calorie budget`.
+
+Finally, mark the `input` element as `required`.
+
+# --hints--
+
+Your `input` element should have a `type` attribute set to `number`.
+
+```js
+assert.equal(document.querySelector('form input').type, 'number');
+```
+
+Your `input` element should have a `min` attribute set to `0`.
+
+```js
+assert.equal(document.querySelector('form input').min, '0');
+```
+
+Your `input` element should have a `placeholder` attribute set to `Daily calorie budget`.
+
+```js
+assert.equal(document.querySelector('form input').placeholder, 'Daily calorie budget');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+--fcc-editable-region--
+
+ Budget
+
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b607af6fcdb119aae9b16a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b607af6fcdb119aae9b16a.md
new file mode 100644
index 00000000000..5079bde79a8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b607af6fcdb119aae9b16a.md
@@ -0,0 +1,168 @@
+---
+id: 63b607af6fcdb119aae9b16a
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Create a `fieldset` element with the `id` set to `breakfast`.
+
+Within that element, create a `legend` with the text `Breakfast`, and an empty `div` with the `class` set to `input-container`.
+
+# --hints--
+
+You should create a `fieldset` element in your `form`.
+
+```js
+assert.exists(document.querySelector('form fieldset'));
+```
+
+Your `fieldset` element should come after your `input` element.
+
+```js
+assert.equal(document.querySelector('form fieldset')?.previousElementSibling?.tagName, "INPUT");
+```
+
+Your `fieldset` element should have an `id` set to `breakfast`.
+
+```js
+assert.equal(document.querySelector('form fieldset')?.id, "breakfast");
+```
+
+You should create a `legend` element within your `fieldset`.
+
+```js
+assert.exists(document.querySelector('form fieldset legend'));
+```
+
+Your `legend` element should have the text `Breakfast`.
+
+```js
+assert.equal(document.querySelector('form fieldset legend')?.innerText, "Breakfast");
+```
+
+You should create a `div` element within your `fieldset`.
+
+```js
+assert.exists(document.querySelector('form fieldset div'));
+```
+
+Your `div` element should come after your `legend` element.
+
+```js
+assert.equal(document.querySelector('form fieldset div')?.previousElementSibling?.tagName, "LEGEND");
+```
+
+Your `div` element should have a `class` set to `input-container`.
+
+```js
+assert.equal(document.querySelector('form fieldset div')?.className, "input-container");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60821c855d01b1eda3c0b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60821c855d01b1eda3c0b.md
new file mode 100644
index 00000000000..7de68f5215c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60821c855d01b1eda3c0b.md
@@ -0,0 +1,164 @@
+---
+id: 63b60821c855d01b1eda3c0b
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Now create a `fieldset` with an `id` set to `lunch`, and a corresponding `legend` and `div` element.
+
+# --hints--
+
+You should create a second `fieldset` element in your `form`.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[1]);
+```
+
+Your second `fieldset` element should come after your first `fieldset` element.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[1]?.previousElementSibling?.tagName, "FIELDSET");
+```
+
+Your second `fieldset` element should have an `id` set to `lunch`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[1]?.id, "lunch");
+```
+
+Your second `fieldset` element should contain a `legend` element.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[1]?.querySelector('legend'));
+```
+
+Your new `legend` element should have the text `Lunch`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[1]?.querySelector('legend')?.innerText, "Lunch");
+```
+
+Your second `fieldset` element should contain a `div` element.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[1]?.querySelector('div'));
+```
+
+Your new `div` element should have a `class` set to `input-container`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[1]?.querySelector('div')?.className, "input-container");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6088bb56e2d1cac364043.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6088bb56e2d1cac364043.md
new file mode 100644
index 00000000000..f7c617f998e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6088bb56e2d1cac364043.md
@@ -0,0 +1,168 @@
+---
+id: 63b6088bb56e2d1cac364043
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Continuing the pattern, create a `fieldset` for `dinner` with the same nested elements.
+
+# --hints--
+
+You should create a third `fieldset` element in your `form`.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[2]);
+```
+
+Your third `fieldset` element should come after your second `fieldset` element.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[2]?.previousElementSibling?.tagName, "FIELDSET");
+```
+
+Your third `fieldset` element should have an `id` set to `dinner`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[2]?.id, "dinner");
+```
+
+Your third `fieldset` element should contain a `legend` element.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[2]?.querySelector('legend'));
+```
+
+Your new `legend` element should have the text `Dinner`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[2]?.querySelector('legend')?.innerText, "Dinner");
+```
+
+Your third `fieldset` element should contain a `div` element.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[2]?.querySelector('div'));
+```
+
+Your new `div` element should have a `class` set to `input-container`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[2]?.querySelector('div')?.className, "input-container");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b608ebf40c871d960fc004.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b608ebf40c871d960fc004.md
new file mode 100644
index 00000000000..911126b33e4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b608ebf40c871d960fc004.md
@@ -0,0 +1,214 @@
+---
+id: 63b608ebf40c871d960fc004
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+You need two more of these `fieldset` code blocks – one for `snacks` and one for `exercise`.
+
+# --hints--
+
+You should create a fourth `fieldset` element in your `form`.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[3]);
+```
+
+Your fourth `fieldset` element should come after your third `fieldset` element.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[3]?.previousElementSibling?.tagName, "FIELDSET");
+```
+
+Your fourth `fieldset` element should have an `id` set to `snacks`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[3]?.id, "snacks");
+```
+
+Your fourth `fieldset` element should contain a `legend` element.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[3]?.querySelector('legend'));
+```
+
+Your fourth `legend` element should have the text `Snacks`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[3]?.querySelector('legend')?.innerText, "Snacks");
+```
+
+Your fourth `fieldset` element should contain a `div` element.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[3]?.querySelector('div'));
+```
+
+Your fifth `div` element should have a `class` set to `input-container`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[3]?.querySelector('div')?.className, "input-container");
+```
+
+You should create a fifth `fieldset` element in your `form`.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[4]);
+```
+
+Your fifth `fieldset` element should come after your fourth `fieldset` element.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[4]?.previousElementSibling?.tagName, "FIELDSET");
+```
+
+Your fifth `fieldset` element should have an `id` set to `exercise`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[4]?.id, "exercise");
+```
+
+Your fifth `fieldset` element should contain a `legend` element.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[4]?.querySelector('legend'));
+```
+
+Your fifth `legend` element should have the text `Exercise`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[4]?.querySelector('legend')?.innerText, "Exercise");
+```
+
+Your fifth `fieldset` element should contain a `div` element.
+
+```js
+assert.exists(document.querySelectorAll('form fieldset')[4]?.querySelector('div'));
+```
+
+Your fifth `div` element should have a `class` set to `input-container`.
+
+```js
+assert.equal(document.querySelectorAll('form fieldset')[4]?.querySelector('div')?.className, "input-container");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60a140bf5a321d50a7315.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60a140bf5a321d50a7315.md
new file mode 100644
index 00000000000..068bea72dfc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60a140bf5a321d50a7315.md
@@ -0,0 +1,163 @@
+---
+id: 63b60a140bf5a321d50a7315
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Create a `div` and give it a `class` set to `controls`. Nest a `span` element within that `div`.
+
+# --hints--
+
+You should create a new `div` element in your `form`.
+
+```js
+assert.exists(document.querySelector('form > div'));
+```
+
+Your `div` element should come after your `fieldset` elements.
+
+```js
+assert.equal(document.querySelector('form > div')?.previousElementSibling?.tagName, "FIELDSET");
+assert.notExists(document.querySelector('form > div')?.nextElementSibling);
+```
+
+Your `div` element should have a `class` attribute set to `controls`.
+
+```js
+assert.equal(document.querySelector('form > div')?.className, "controls");
+```
+
+You should nest a `span` element within your `div`.
+
+```js
+assert.exists(document.querySelector('form > div > span'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60aaaa65f8922bfce6b7e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60aaaa65f8922bfce6b7e.md
new file mode 100644
index 00000000000..c9723d26fcb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60aaaa65f8922bfce6b7e.md
@@ -0,0 +1,210 @@
+---
+id: 63b60aaaa65f8922bfce6b7e
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+In your `span` element, create a `label` element for an `entry-dropdown` and give it the text `Add food or exercise:`. Then create a `select` element with the `id` set to `entry-dropdown` and a `name` set to `options`. Below that, add a `button` element with the `id` set to `add-entry` and the text `Add Entry`.
+
+Give your `button` element a `type` attribute set to `button` to prevent automatic form submission.
+
+# --hints--
+
+You should add a `label` element to your `span` element.
+
+```js
+assert.exists(document.querySelector('.controls > span > label'));
+```
+
+Your new `label` element should have a `for` attribute set to `entry-dropdown`.
+
+```js
+assert.equal(document.querySelector('.controls > span > label')?.getAttribute('for'), 'entry-dropdown');
+```
+
+Your new `label` element should have the text `Add food or exercise:`.
+
+```js
+assert.equal(document.querySelector('.controls > span > label')?.innerText, 'Add food or exercise:');
+```
+
+You should add a `select` element to your `span` element.
+
+```js
+assert.exists(document.querySelector('.controls > span > select'));
+```
+
+Your `select` element should come after your `label` element.
+
+```js
+assert(document.querySelector('.controls > span > select')?.previousElementSibling?.tagName === 'LABEL');
+```
+
+Your new `select` element should have an `id` attribute set to `entry-dropdown`.
+
+```js
+assert.equal(document.querySelector('.controls > span > select')?.getAttribute('id'), 'entry-dropdown');
+```
+
+Your new `select` element should have a `name` attribute set to `options`.
+
+```js
+assert.equal(document.querySelector('.controls > span > select')?.getAttribute('name'), 'options');
+```
+
+You should add a `button` element to your `span` element.
+
+```js
+assert.exists(document.querySelector('.controls > span > button'));
+```
+
+Your `button` element should come after your `select` element.
+
+```js
+assert(document.querySelector('.controls > span > button')?.previousElementSibling?.tagName === 'SELECT');
+```
+
+Your new `button` element should have an `id` attribute set to `add-entry`.
+
+```js
+assert.equal(document.querySelector('.controls > span > button')?.getAttribute('id'), 'add-entry');
+```
+
+Your new `button` element should have the text `Add Entry`.
+
+```js
+assert.equal(document.querySelector('.controls > span > button')?.innerText, 'Add Entry');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+--fcc-editable-region--
+
+
+
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60af1a0b9f7238a9dd294.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60af1a0b9f7238a9dd294.md
new file mode 100644
index 00000000000..27f69a473d9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60af1a0b9f7238a9dd294.md
@@ -0,0 +1,220 @@
+---
+id: 63b60af1a0b9f7238a9dd294
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Your select menu needs options for each of the food and exercise `fieldset` elements you created in the previous steps. Use the `option` element to create a new option for each `fieldset`. The `value` attribute of each option should be the `id` of the `fieldset`, and the text of each option should be the text of the `legend`.
+
+Set the `Breakfast` option as the `selected` option.
+
+# --hints--
+
+You should create five `option` elements within your `select` element.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.length, 5);
+```
+
+Your first `option` should have the text `Breakfast`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[0]?.textContent, 'Breakfast');
+```
+
+Your first `option` should have the `value` attribute set to `breakfast`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[0]?.value, 'breakfast');
+```
+
+Your second `option` should have the text `Lunch`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[1]?.textContent, 'Lunch');
+```
+
+Your second `option` should have the `value` attribute set to `lunch`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[1]?.value, 'lunch');
+```
+
+Your third `option` should have the text `Dinner`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[2]?.textContent, 'Dinner');
+```
+
+Your third `option` should have the `value` attribute set to `dinner`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[2]?.value, 'dinner');
+```
+
+Your fourth `option` should have the text `Snacks`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[3]?.textContent, 'Snacks');
+```
+
+Your fourth `option` should have the `value` attribute set to `snacks`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[3]?.value, 'snacks');
+```
+
+Your fifth `option` should have the text `Exercise`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[4]?.textContent, 'Exercise');
+```
+
+Your fifth `option` should have the `value` attribute set to `exercise`.
+
+```js
+assert.equal(document.querySelectorAll('.controls select option')?.[4]?.value, 'exercise');
+```
+
+Your first `option` should be selected by default.
+
+```js
+assert.isTrue(document.querySelectorAll('.controls select option')?.[0]?.getAttributeNames()?.includes('selected'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+--fcc-editable-region--
+
+
+ Add food or exercise:
+
+
+
+ Add Entry
+
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60c09c5039f25a3b2dda9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60c09c5039f25a3b2dda9.md
new file mode 100644
index 00000000000..4e28d650816
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60c09c5039f25a3b2dda9.md
@@ -0,0 +1,207 @@
+---
+id: 63b60c09c5039f25a3b2dda9
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Create another `div` element. Within it, nest a `button` to `submit` the form, with an `id` set to `calculate-calories`. This button should have the text `Calculate Remaining Calories`.
+
+Then add a `button` with the `id` set to `clear` to clear the form (don't forget to give it a `type` attribute that prevents it from submitting the form). This button needs the text `Clear`.
+
+# --hints--
+
+You should create a second `div` element.
+
+```js
+assert.equal(document.querySelectorAll('form > div')?.length, 2);
+```
+
+Your new `div` element should have a `button` element.
+
+```js
+assert.exists(document.querySelectorAll('form > div')?.[1]?.querySelector('button'));
+```
+
+Your `button` element should have a `type` attribute set to `submit`.
+
+```js
+assert.equal(document.querySelectorAll('form > div')?.[1]?.querySelector('button')?.getAttribute('type'), 'submit');
+```
+
+Your `button` element should have an `id` attribute set to `calculate-calories`.
+
+```js
+assert.equal(document.querySelectorAll('form > div')?.[1]?.querySelector('button')?.getAttribute('id'), 'calculate-calories');
+```
+
+Your `button` element should have the text `Calculate Remaining Calories`.
+
+```js
+assert.equal(document.querySelectorAll('form > div')?.[1]?.querySelector('button')?.innerText, 'Calculate Remaining Calories');
+```
+
+Your `div` element should have a second `button` element.
+
+```js
+assert.exists(document.querySelectorAll('form > div')?.[1]?.querySelectorAll('button')?.[1]);
+```
+
+Your second `button` element should have a `type` attribute set to `button`.
+
+```js
+assert.equal(document.querySelectorAll('form > div')?.[1]?.querySelectorAll('button')?.[1]?.getAttribute('type'), 'button');
+```
+
+Your second `button` element should have an `id` attribute set to `clear`.
+
+```js
+assert.equal(document.querySelectorAll('form > div')?.[1]?.querySelectorAll('button')?.[1]?.getAttribute('id'), 'clear');
+```
+
+Your second `button` element should have the text `Clear`.
+
+```js
+assert.equal(document.querySelectorAll('form > div')?.[1]?.querySelectorAll('button')?.[1]?.innerText, 'Clear');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60ca38c897f2721b27959.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60ca38c897f2721b27959.md
new file mode 100644
index 00000000000..aaf24c8d8cb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60ca38c897f2721b27959.md
@@ -0,0 +1,182 @@
+---
+id: 63b60ca38c897f2721b27959
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Your form needs somewhere to display the results. Add an empty `div` element and give it an `id` of `output` and the `class` values of `output` and `hide`.
+
+# --hints--
+
+You should add a `div` element after your `form`.
+
+```js
+assert.exists(document.querySelector('.container > div'));
+```
+
+Your new `div` element should have an `id` set to `output`.
+
+```js
+assert.equal(document.querySelector('.container > div')?.id, 'output');
+```
+
+Your new `div` element should have the `class` values of `output` and `hide`.
+
+```js
+assert.include(document.querySelector('.container > div')?.className.split(/\s+/), 'output');
+assert.include(document.querySelector('.container > div')?.className.split(/\s+/), 'hide');
+```
+
+Your new `div` should be empty.
+
+```js
+assert.equal(document.querySelector('.container > div')?.innerHTML, '');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60cfaca25bb27edd40f62.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60cfaca25bb27edd40f62.md
new file mode 100644
index 00000000000..17934b0039d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60cfaca25bb27edd40f62.md
@@ -0,0 +1,170 @@
+---
+id: 63b60cfaca25bb27edd40f62
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Finally, you need to link your JavaScript file to your HTML. Create a `script` element to do so.
+
+# --hints--
+
+You should have a `script` element.
+
+```js
+assert.isAtLeast(document.querySelectorAll('script')?.length, 1);
+```
+
+Your `script` element should have the `src` set to `./script.js`.
+
+```js
+assert.match(code, /script\s*?src\s*?=\s*?('|")(\.\/)?script\.js\1/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60d3c5048302906962231.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60d3c5048302906962231.md
new file mode 100644
index 00000000000..de3870b44ad
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b60d3c5048302906962231.md
@@ -0,0 +1,176 @@
+---
+id: 63b60d3c5048302906962231
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+It is time to start writing the script that makes your form work. Begin by getting the `form` element (using the `id`) and storing it in a variable called `calorieCounter`.
+
+# --hints--
+
+You should create a variable called `calorieCounter`.
+
+```js
+assert.isDefined(calorieCounter);
+```
+
+You should use `document.getElementById()` to get the `#calorie-counter` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|")calorie-counter\1\s*\)/g);
+```
+
+You should store the `#calorie-counter` element in a variable called `calorieCounter`.
+
+```js
+assert.equal(calorieCounter, document.getElementById('calorie-counter'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b613f367584d2a5d041b7d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b613f367584d2a5d041b7d.md
new file mode 100644
index 00000000000..44e1c274573
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b613f367584d2a5d041b7d.md
@@ -0,0 +1,195 @@
+---
+id: 63b613f367584d2a5d041b7d
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Get your `#budget` element and assign it to `budgetNumberInput`, and your `#entry-dropdown` element and assign it to `entryDropdown`.
+
+# --hints--
+
+You should declare a variable called `budgetNumberInput`.
+
+```js
+assert.isDefined(budgetNumberInput);
+```
+
+You should use `document.getElementById()` to get the `#budget` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|")budget\1\s*\)/g);
+```
+
+You should store the `#budget` element in a variable called `budgetNumberInput`.
+
+```js
+assert.equal(budgetNumberInput, document.getElementById('budget'));
+```
+
+You should declare a variable called `entryDropdown`.
+
+```js
+assert.isDefined(entryDropdown);
+```
+
+You should use `document.getElementById()` to get the `#entry-dropdown` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|")entry-dropdown\1\s*\)/g);
+```
+
+You should store the `#entry-dropdown` element in a variable called `entryDropdown`.
+
+```js
+assert.equal(entryDropdown, document.getElementById('entry-dropdown'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+--fcc-editable-region--
+const calorieCounter = document.getElementById('calorie-counter');
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b61490e633a22b4593e62f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b61490e633a22b4593e62f.md
new file mode 100644
index 00000000000..6cbbeb5ab4a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b61490e633a22b4593e62f.md
@@ -0,0 +1,215 @@
+---
+id: 63b61490e633a22b4593e62f
+title: Step 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Following the same pattern, assign your `#add-entry` element to `addEntryButton`, your `#clear` element to `clearButton`, and your `#output` element to `output`.
+
+# --hints--
+
+You should declare a variable called `addEntryButton`.
+
+```js
+assert.isDefined(addEntryButton);
+```
+
+You should use `document.getElementById()` to get the `#add-entry` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|")add-entry\1\s*\)/g);
+```
+
+You should assign the `#add-entry` element to `addEntryButton`.
+
+```js
+assert.equal(addEntryButton, document.getElementById('add-entry'));
+```
+
+You should declare a variable called `clearButton`.
+
+```js
+assert.isDefined(clearButton);
+```
+
+You should use `document.getElementById()` to get the `#clear` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|")clear\1\s*\)/g);
+```
+
+You should assign the `#clear` element to `clearButton`.
+
+```js
+assert.equal(clearButton, document.getElementById('clear'));
+```
+
+You should declare a variable called `output`.
+
+```js
+assert.isDefined(output);
+```
+
+You should use `document.getElementById()` to get the `#output` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|")output\1\s*\)/g);
+```
+
+You should assign the `#output` element to `output`.
+
+```js
+assert.equal(output, document.getElementById("output"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+--fcc-editable-region--
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b614e6a1f7fe2cef6312dc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b614e6a1f7fe2cef6312dc.md
new file mode 100644
index 00000000000..99c1985862c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b614e6a1f7fe2cef6312dc.md
@@ -0,0 +1,182 @@
+---
+id: 63b614e6a1f7fe2cef6312dc
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Declare an `isError` variable and set it to `false`, but use `let` so you can reassign it later.
+
+# --hints--
+
+You should declare an `isError` variable.
+
+```js
+assert.isDefined(isError);
+```
+
+Your `isError` variable should be set to `false`.
+
+```js
+assert.isFalse(isError);
+```
+
+You should use `let` to declare your `isError` variable.
+
+```js
+assert.match(code, /let\s+isError\s*=\s*false/g);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+--fcc-editable-region--
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6152e6aff882db819fc1e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6152e6aff882db819fc1e.md
new file mode 100644
index 00000000000..436b65b80d6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b6152e6aff882db819fc1e.md
@@ -0,0 +1,192 @@
+---
+id: 63b6152e6aff882db819fc1e
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+Even though you set an `input` element to be a number, JavaScript receives a string value. You need to write a function to clean the string value and ensure you have a number.
+
+Start by declaring a `cleanInputString` function that takes a `str` argument.
+
+# --hints--
+
+You should declare a `cleanInputString` variable.
+
+```js
+assert.isDefined(cleanInputString);
+```
+
+Your `cleanInputString` variable should be a function.
+
+```js
+assert.isFunction(cleanInputString);
+```
+
+Your `cleanInputString` function should take a `str` argument.
+
+```js
+assert.match(cleanInputString?.toString(), /\(str\)/);
+```
+
+`cleanInputString` should be an empty function.
+
+```js
+assert.match(cleanInputString?.toString(), /\{\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b61584def8fa2ebcc259e0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b61584def8fa2ebcc259e0.md
new file mode 100644
index 00000000000..b7de4018e24
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63b61584def8fa2ebcc259e0.md
@@ -0,0 +1,182 @@
+---
+id: 63b61584def8fa2ebcc259e0
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+You need to split your `str` into individual characters. Remember that strings have a `.split()` method, and if you pass an empty string it will split on every character.
+
+Declare a `strArray` variable and assign it that split value.
+
+# --hints--
+
+Your `cleanInputString` function should declare a `strArray` variable.
+
+```js
+assert.match(cleanInputString.toString(), /strArray\s*=/);
+```
+
+Your `strArray` variable should be assigned the value of `str.split('')`.
+
+```js
+assert.match(cleanInputString.toString(), /strArray\s*=\s*str\.split\(\s*('|")\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf43be3f969d24d4ed233c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf43be3f969d24d4ed233c.md
new file mode 100644
index 00000000000..a0eaf81fd4e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf43be3f969d24d4ed233c.md
@@ -0,0 +1,181 @@
+---
+id: 63bf43be3f969d24d4ed233c
+title: Step 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Declare a `cleanStrArray` variable and assign it an empty array. You will use this to store your valid number characters.
+
+# --hints--
+
+Your `cleanInputString` should declare a variable called `cleanStrArray`.
+
+```js
+assert.match(cleanInputString.toString(), /cleanStrArray\s*/g);
+```
+
+Your `cleanStrArray` variable should be assigned an empty array.
+
+```js
+assert.match(cleanInputString.toString(), /cleanStrArray\s*=\s*\[\s*\]/g);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const strArray = str.split('');
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf446945d34d25e6db6e4f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf446945d34d25e6db6e4f.md
new file mode 100644
index 00000000000..db275c224c1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf446945d34d25e6db6e4f.md
@@ -0,0 +1,195 @@
+---
+id: 63bf446945d34d25e6db6e4f
+title: Step 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Use a `for` loop to iterate through each character in your `strArray` array.
+
+# --hints--
+
+Your `cleanInputString` function should have a `for` loop.
+
+```js
+assert.match(cleanInputString.toString(), /for\s*\(/g);
+```
+
+Your `for` loop should initialize a variable called `i` to `0`.
+
+```js
+assert.match(cleanInputString.toString(), /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;/g);
+```
+
+Your `for` loop should have a condition that checks if `i` is less than the length of `strArray`.
+
+```js
+assert.match(cleanInputString.toString(), /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;\s*i\s*<\s*strArray\.length\s*;/g);
+```
+
+Your `for` loop should increment `i` by `1` each time it runs. Use the increment operator for this.
+
+```js
+assert.match(cleanInputString.toString(), /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;\s*i\s*<\s*strArray\.length\s*;\s*i\s*\+\+\s*\)/g);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const strArray = str.split('');
+ const cleanStrArray = [];
+
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf45ce0dc8d4270760c6d0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf45ce0dc8d4270760c6d0.md
new file mode 100644
index 00000000000..a432c6687d5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf45ce0dc8d4270760c6d0.md
@@ -0,0 +1,200 @@
+---
+id: 63bf45ce0dc8d4270760c6d0
+title: Step 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Within your loop, you need to check if the character in `strArray` at index `i` is not `+`, `-`, or a space. If it is not, `push` it to the `cleanStrArray`.
+
+To check your character, see if the array `["+", "-", " "]` includes the character – you can use the `.includes()` method on the array to do this.
+
+# --hints--
+
+Your `for` loop should have an `if` statement.
+
+```js
+assert.match(cleanInputString.toString(), /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;\s*i\s*<\s*strArray\.length\s*;\s*i\s*\+\+\s*\)\s*\{\s*if\s*\(/);
+```
+
+Your `for` loop should use `!["+", "-", " "].includes()`.
+
+```js
+// the loop protection injects code so we have to look at the raw code directly
+assert.match(code, /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;\s*i\s*<\s*strArray\.length\s*;\s*i\s*\+\+\s*\)\s*\{\s*if\s*\(!\[("|')\+\2\s*,\s*("|')-\3\s*,\s*("|')\s\4\s*\]\.includes\(/);
+```
+
+Your `for` loop should see if `strArray[i]` is found in `["+", "-", " "]`.
+
+```js
+assert.match(code, /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;\s*i\s*<\s*strArray\.length\s*;\s*i\s*\+\+\s*\)\s*\{\s*if\s*\(!\[("|')\+\2\s*,\s*("|')-\3\s*,\s*("|')\s\4\s*\]\.includes\(\s*strArray\[i\]\s*\)\)\s*\{/);
+```
+
+Your `for` loop should `push` `strArray[i]` to `cleanStrArray`.
+
+```js
+assert.match(code, /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;\s*i\s*<\s*strArray\.length\s*;\s*i\s*\+\+\s*\)\s*\{\s*if\s*\(!\[("|')\+\2\s*,\s*("|')-\3\s*,\s*("|')\s\4\s*\]\.includes\(\s*strArray\[i\]\s*\)\)\s*\{\s*cleanStrArray\.push\(\s*strArray\[i\]\s*\)\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const strArray = str.split('');
+ const cleanStrArray = [];
+
+ for (let i = 0; i < strArray.length; i++) {
+
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf461011fca327d3b60fa8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf461011fca327d3b60fa8.md
new file mode 100644
index 00000000000..f74ff636c5b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf461011fca327d3b60fa8.md
@@ -0,0 +1,213 @@
+---
+id: 63bf461011fca327d3b60fa8
+title: Step 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+While looping through the string works, creating a new array is inefficient for memory and runtime performance. Instead, you can use Regular Expressions (referred to as "regex") to match specific characters.
+
+Regex in JavaScript is indicated by a pattern wrapped in forward slashes – for example:
+
+```js
+const regex = /hello/;
+```
+
+Remove your existing code within the `cleanInputString` function. Declare a `regex` variable and assign it the value from the example above.
+
+# --hints--
+
+You should remove the `cleanStrArray` variable.
+
+```js
+assert.notMatch(cleanInputString.toString(), /cleanStrArray/);
+```
+
+You should remove the `strArray` variable.
+
+```js
+assert.notMatch(cleanInputString.toString(), /strArray/);
+```
+
+You should not have a `for` loop.
+
+```js
+assert.notMatch(cleanInputString.toString(), /for/);
+```
+
+You should declare a `regex` variable.
+
+```js
+assert.match(cleanInputString.toString(), /regex\s*=/);
+```
+
+Your `regex` variable should be set to the regular expression `/hello/`.
+
+```js
+assert.match(cleanInputString.toString(), /regex\s*=\s*\/hello\//);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const strArray = str.split('');
+ const cleanStrArray = [];
+
+ for (let i = 0; i < strArray.length; i++) {
+ if (!["+", "-", " "].includes(strArray[i])) {
+ cleanStrArray.push(strArray[i])
+ }
+ }
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf47fd40599f29827f484d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf47fd40599f29827f484d.md
new file mode 100644
index 00000000000..0f781eb61cf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf47fd40599f29827f484d.md
@@ -0,0 +1,176 @@
+---
+id: 63bf47fd40599f29827f484d
+title: Step 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+The pattern you currently have will match the exact text `hello`, which is not what you want to match. You want to look for `+`, `-`, or spaces. Replace the pattern in your `regex` variable with `\+-` to look for plus and minus characters.
+
+Note that you need to use the `\` to escape the `+`, because a `+` has a special meaning in regular expressions.
+
+# --hints--
+
+Your `regex` variable should be set to the regular expression `/\+-/`.
+
+```js
+assert.match(cleanInputString.toString(), /regex\s*=\s*\/\\\+-\//);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const regex = /hello/;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf492b6dfb292a79f0e675.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf492b6dfb292a79f0e675.md
new file mode 100644
index 00000000000..25d6d2447fb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf492b6dfb292a79f0e675.md
@@ -0,0 +1,174 @@
+---
+id: 63bf492b6dfb292a79f0e675
+title: Step 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+In regex, shorthand character classes allow you to match specific characters without having to write those characters in your pattern. Shorthand character classes are preceded with a backslash (`\`). The character class `\s` will match any whitespace character. Add this to your regex pattern.
+
+# --hints--
+
+Your `regex` variable should be set to the regular expression `/\+-\s/`.
+
+```js
+assert.match(cleanInputString.toString(), /regex\s*=\s*\/\\\+-\\s\//)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const regex = /\+-/;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf4bfe9de3852be51c8f86.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf4bfe9de3852be51c8f86.md
new file mode 100644
index 00000000000..3b18f0aac60
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf4bfe9de3852be51c8f86.md
@@ -0,0 +1,188 @@
+---
+id: 63bf4bfe9de3852be51c8f86
+title: Step 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+Your current pattern won't work just yet. `/+-\s/` looks for `+`, `-`, and a space *in order*. This would match `+- hello` but would not match `+hello`.
+
+To tell the pattern to match each of these characters individually, you need to turn them into a character class. This is done by wrapping the characters you want to match in brackets. For example, this pattern will match the characters `h`, `e`, `l`, or `o`:
+
+```js
+const regex = /[helo]/;
+```
+
+Turn your `+-\s` pattern into a character class. Note that you no longer need to escape the `+` character, because you are using a character class.
+
+# --hints--
+
+Your `regex` variable should be set to the regular expression `[+-\s]`.
+
+```js
+assert.match(cleanInputString.toString(), /regex\s*=\s*\/\[\\?\+-\\s\]\//)
+```
+
+You should not escape the `+` character in your regular expression.
+
+```js
+assert.match(cleanInputString.toString(), /regex\s*=\s*\/\[\+-\\s\]\//);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const regex = /\+-\s/;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf4d351e06432ce9bf3627.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf4d351e06432ce9bf3627.md
new file mode 100644
index 00000000000..30baf30ed58
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf4d351e06432ce9bf3627.md
@@ -0,0 +1,180 @@
+---
+id: 63bf4d351e06432ce9bf3627
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+Regex can also take specific flags to alter the pattern matching behavior. Flags are added after the closing `/`. The `g` flag, which stands for "global", will tell the pattern to continue looking after it has found a match. Here is an example:
+
+```js
+const helloRegex = /hello/g;
+```
+
+Add the `g` flag to your regex pattern.
+
+# --hints--
+
+You should add the `g` flag to your `regex` value.
+
+```js
+assert.match(cleanInputString.toString(), /regex\s*=\s*\/\[\+-\\s\]\/g/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const regex = /[+-\s]/;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf511b85b6082e54dc1573.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf511b85b6082e54dc1573.md
new file mode 100644
index 00000000000..4b35b49f7b9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf511b85b6082e54dc1573.md
@@ -0,0 +1,199 @@
+---
+id: 63bf511b85b6082e54dc1573
+title: Step 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Strings have a `.replace()` method which allows you to replace characters in the string with another string. `.replace` takes two arguments. The first is the character sequence to replace – this can either be a string or a regex pattern. The second is the string to replace that sequence with. For example, this would replace all instances of `l` with `1`:
+
+```js
+"hello".replace(/l/g, "1");
+```
+
+Use your `regex` to replace all instances of `+`, `-`, and a space in `str` with an empty string. Return this value.
+
+# --hints--
+
+Your `cleanInputString` should call the `replace` method of `str`.
+
+```js
+assert.match(cleanInputString.toString(), /str\.replace\(/);
+```
+
+You should pass `regex` as the first argument to `replace`.
+
+```js
+assert.match(cleanInputString.toString(), /str\.replace\(\s*regex\s*/);
+```
+
+You should pass `""` as the second argument to `replace`.
+
+```js
+assert.match(cleanInputString.toString(), /str\.replace\(\s*regex\s*,\s*("|')\1\s*\)/);
+```
+
+Your `cleanInputString` function should directly return the result of your `replace` method.
+
+```js
+assert.match(cleanInputString.toString(), /return\s*str\.replace\(\s*regex\s*,\s*("|')\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+--fcc-editable-region--
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5230bccd1c2f5c13e1ce.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5230bccd1c2f5c13e1ce.md
new file mode 100644
index 00000000000..b6eef00a30b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5230bccd1c2f5c13e1ce.md
@@ -0,0 +1,191 @@
+---
+id: 63bf5230bccd1c2f5c13e1ce
+title: Step 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+In HTML, number inputs allow for exponential notation (such as `1e10`). You need to filter those out.
+
+Start by creating a function called `isInvalidInput` – it should take a single `str` parameter.
+
+# --hints--
+
+You should declare an `isInvalidInput` variable.
+
+```js
+assert.isDefined(isInvalidInput)
+```
+
+`isInvalidInput` should be a function.
+
+```js
+assert.isFunction(isInvalidInput)
+```
+
+`isInvalidInput` should take a single `str` parameter.
+
+```js
+assert.match(isInvalidInput?.toString(), /\(\s*str\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf598a4c807930a13a1a27.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf598a4c807930a13a1a27.md
new file mode 100644
index 00000000000..778a809571e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf598a4c807930a13a1a27.md
@@ -0,0 +1,185 @@
+---
+id: 63bf598a4c807930a13a1a27
+title: Step 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Declare a `regex` variable, and assign it a regex that matches the character `e`.
+
+# --hints--
+
+Your `isInvalidInput` function should have a `regex` variable.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=/);
+```
+
+Your `regex` variable should be set to `/e/`.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=\s*\/e\//);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+--fcc-editable-region--
+function isInvalidInput(str) {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5a518d54f63181ab639a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5a518d54f63181ab639a.md
new file mode 100644
index 00000000000..2bf1aa0f9a3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5a518d54f63181ab639a.md
@@ -0,0 +1,179 @@
+---
+id: 63bf5a518d54f63181ab639a
+title: Step 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+The `e` in a number input can also be an uppercase `E`. Regex has a flag for this, however – the `i` flag, which stands for "insensitive". This flag makes your pattern case-insensitive. Add the `i` flag to your regex pattern.
+
+# --hints--
+
+Your `regex` value should have the `i` flag.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=\s*\/e\/i/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+--fcc-editable-region--
+function isInvalidInput(str) {
+ const regex = /e/;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5a92fd148d3264d5322b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5a92fd148d3264d5322b.md
new file mode 100644
index 00000000000..19873a84492
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5a92fd148d3264d5322b.md
@@ -0,0 +1,187 @@
+---
+id: 63bf5a92fd148d3264d5322b
+title: Step 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Number inputs only allow the `e` to occur between two digits. To match any number, you can use the character class `[0-9]`. This will match any digit between `0` and `9`.
+
+Add this character class before and after `e` in your pattern.
+
+# --hints--
+
+You should add the `[0-9]` character class before `e` in your regular expression.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=\s*\/\[0-9\]e/);
+```
+
+You should add the `[0-9]` character class after `e` in your regular expression.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=\s*\/\[0-9\]e\[0-9\]\//);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+--fcc-editable-region--
+function isInvalidInput(str) {
+ const regex = /e/i;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5adfe2981b332eb007b6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5adfe2981b332eb007b6.md
new file mode 100644
index 00000000000..75477ddd763
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5adfe2981b332eb007b6.md
@@ -0,0 +1,185 @@
+---
+id: 63bf5adfe2981b332eb007b6
+title: Step 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+The `+` modifier in a regex allows you to match a pattern that occurs one or more times. To match your digit pattern one or more times, add a plus after each of the digit character classes. For example: `[0-9]+`.
+
+# --hints--
+
+You should add the `+` modifier to the character class before `e` in your regular expression.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=\s*\/\[0-9\]\+e/);
+```
+
+You should add the `+` modifier to the character class after `e` in your regular expression.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=\s*\/\[0-9\]\+e\[0-9\]\+\//);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+--fcc-editable-region--
+function isInvalidInput(str) {
+ const regex = /[0-9]e[0-9]/i;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5bcfebff0734593fad19.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5bcfebff0734593fad19.md
new file mode 100644
index 00000000000..95686b3c3a0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5bcfebff0734593fad19.md
@@ -0,0 +1,185 @@
+---
+id: 63bf5bcfebff0734593fad19
+title: Step 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+There is a shorthand character class to match any digit: `\d`. Replace your `[0-9]` character classes with this shorthand.
+
+# --hints--
+
+You should replace the `[0-9]` character class before `e` with `\d` in your regular expression.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=\s*\/\\d\+e/);
+```
+
+You should replace the `[0-9]` character class after `e` with `\d` in your regular expression.
+
+```js
+assert.match(isInvalidInput.toString(), /regex\s*=\s*\/\\d\+e\\d\+\//);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+--fcc-editable-region--
+function isInvalidInput(str) {
+ const regex = /[0-9]+e[0-9]+/i;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5c438f523a359769106c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5c438f523a359769106c.md
new file mode 100644
index 00000000000..f6f61282ce9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5c438f523a359769106c.md
@@ -0,0 +1,194 @@
+---
+id: 63bf5c438f523a359769106c
+title: Step 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+Strings have a `.match()` method, which takes a regex argument. `.match()` will return an array of match results – containing either the first match, or all matches if the global flag is used.
+
+Return the result of calling the `.match()` method on `str` and passing your `regex` variable as the argument. You'll use this match result later on.
+
+# --hints--
+
+Your `isInvalidInput` function should call the `.match()` method on `str`.
+
+```js
+assert.match(isInvalidInput.toString(), /str\.match\(/);
+```
+
+You should pass `regex` as the argument to the `.match()` method.
+
+```js
+assert.match(isInvalidInput.toString(), /str\.match\(\s*regex\s*\)/);
+```
+
+Your `isInvalidInput` function should directly return the result of the `.match()` call.
+
+```js
+assert.match(isInvalidInput.toString(), /return\s+str\.match\(\s*regex\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+--fcc-editable-region--
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5cf03b50bf36cfbe94ea.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5cf03b50bf36cfbe94ea.md
new file mode 100644
index 00000000000..228f3503303
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63bf5cf03b50bf36cfbe94ea.md
@@ -0,0 +1,194 @@
+---
+id: 63bf5cf03b50bf36cfbe94ea
+title: Step 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+Your next step is to allow users to add entries to the calorie counter. Declare an empty function `addEntry`. This function should not take any parameters.
+
+# --hints--
+
+You should declare an `addEntry` variable.
+
+```js
+assert.isDefined(addEntry);
+```
+
+Your `addEntry` variable should be a function.
+
+```js
+assert.isFunction(addEntry);
+```
+
+Your `addEntry` function should not take any parameters.
+
+```js
+assert.match(addEntry?.toString(), /\(\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1dfbd56c71e278800010c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1dfbd56c71e278800010c.md
new file mode 100644
index 00000000000..1bc417c8bbb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1dfbd56c71e278800010c.md
@@ -0,0 +1,198 @@
+---
+id: 63c1dfbd56c71e278800010c
+title: Step 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+You'll need to know which category the entry goes in. Thankfully, you added a dropdown for the user to select a category.
+
+Remember that you queried that dropdown earlier in your JavaScript and assigned it to the `entryDropdown` button. Use concatenation to add `#` to the beginning of the `value` property of `entryDropdown`, and assign that result to a `targetId` variable.
+
+# --hints--
+
+Your `addEntry` function should have a `targetId` variable.
+
+```js
+assert.match(addEntry.toString(), /targetId\s*=/);
+```
+
+Your `targetId` variable should start with the string `#`.
+
+```js
+assert.match(addEntry.toString(), /targetId\s*=\s*('|")#\1/);
+```
+
+You should use concatenation to add `entryDropdown.value` after your `#` string.
+
+```js
+assert.match(addEntry.toString(), /targetId\s*=\s*('|")#\1\s*\+\s*entryDropdown\.value/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e0af28078f2dfad9eb3e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e0af28078f2dfad9eb3e.md
new file mode 100644
index 00000000000..413b5f76d84
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e0af28078f2dfad9eb3e.md
@@ -0,0 +1,203 @@
+---
+id: 63c1e0af28078f2dfad9eb3e
+title: Step 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Now you need to target the `.input-container` element within the element that has your `targetId`. Declare a new `targetInputContainer` variable, and assign it the value of `document.querySelector()`. Use concatenation to separate `targetId` and `'.input-container'` with a space, and pass that string to `querySelector()`.
+
+# --hints--
+
+Your `addEntry` function should have a `targetInputContainer` variable.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\s*=/);
+```
+
+Your `targetInputContainer` variable should be set to `document.querySelector()`.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\s*=\s*document\.querySelector\(/);
+```
+
+You should pass `targetId` to your `querySelector()` method.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\s*=\s*document\.querySelector\(\s*targetId\s*/);
+```
+
+You should concatenate `' .input-container'` to `targetId`. Remember to include the space at the beginning of `.input-container`.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\s*=\s*document\.querySelector\(\s*targetId\s*\s*\+\s*('|")\s\.input-container\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetId = '#' + entryDropdown.value;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e1965a898d302e0af4e3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e1965a898d302e0af4e3.md
new file mode 100644
index 00000000000..06e5ac50cec
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e1965a898d302e0af4e3.md
@@ -0,0 +1,203 @@
+---
+id: 63c1e1965a898d302e0af4e3
+title: Step 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+JavaScript has a feature called template literals , which allow you to interpolate variables directly within a string. Template literals are denoted with backticks ` `` `, as opposed to single or double quotes. Variables can be passed in to a template literal by surrounding the variable with `${}` – the value of the variable will be inserted into the string.
+
+For example:
+
+```js
+const name = "Naomi";
+const templateLiteral = `Hello, my name is ${name}~!`;
+console.log(templateLiteral);
+```
+
+The console will show the string "Hello, my name is Naomi~!".
+
+Replace your concatenated string in the `querySelector` with a template literal – be sure to keep the space between your `targetId` variable and `.input-container`.
+
+# --hints--
+
+You should use a template literal in your `querySelector` method.
+
+```js
+assert.match(code, /const\s+targetInputContainer\s*=\s*document\.querySelector\(`.*`\)/);
+```
+
+Your template literal should have the value `{targetId} .input-container`.
+
+```js
+assert.match(code, /const\s+targetInputContainer\s*=\s*document\.querySelector\(`\$\{targetId\}\s\.input-container`\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetId = '#' + entryDropdown.value;
+ const targetInputContainer = document.querySelector(targetId + ' .input-container');
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e5b4b3c8a031def3bd65.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e5b4b3c8a031def3bd65.md
new file mode 100644
index 00000000000..6aeab26c100
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e5b4b3c8a031def3bd65.md
@@ -0,0 +1,197 @@
+---
+id: 63c1e5b4b3c8a031def3bd65
+title: Step 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+Thanks to template literals, you actually don't need the `targetId` variable at all. Remove that variable, and update your template literal to replace `targetId` with `entryDropdown.value` – remember to add `#` before that, in the string.
+
+# --hints--
+
+You should remove the `targetId` variable.
+
+```js
+assert.notMatch(addEntry.toString(), /targetId\s*=/);
+```
+
+You should replace the `targetId` reference in your template literal with `entryDropdown.value`.
+
+```js
+assert.match(code, /const\s+targetInputContainer\s*=\s*document\.querySelector\(`#?\$\{entryDropdown\.value\}\s\.input-container`\s*\)/);
+```
+
+You should add `#` at the beginning of your template literal.
+
+```js
+assert.match(code, /const\s+targetInputContainer\s*=\s*document\.querySelector\(`#\$\{entryDropdown\.value\}\s\.input-container`\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetId = '#' + entryDropdown.value;
+ const targetInputContainer = document.querySelector(`${targetId} .input-container`);
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e704ee12703347625900.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e704ee12703347625900.md
new file mode 100644
index 00000000000..b658496aeee
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c1e704ee12703347625900.md
@@ -0,0 +1,197 @@
+---
+id: 63c1e704ee12703347625900
+title: Step 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+You will want to number the entries a user adds. Declare an `entryNumber` variable and give it the value of `targetInputContainer.querySelectorAll()`. You do not need to pass an argument to the query selector yet.
+
+# --hints--
+
+You should have an `entryNumber` variable.
+
+```js
+assert.match(addEntry.toString(), /entryNumber\s*=/);
+```
+
+Your `entryNumber` variable should have the value of `targetInputContainer.querySelectorAll()`.
+
+```js
+assert.match(addEntry.toString(), /entryNumber\s*=\s*targetInputContainer\.querySelectorAll\(/);
+```
+
+You should not pass an argument to `querySelectorAll()`.
+
+```js
+assert.match(addEntry.toString(), /entryNumber\s*=\s*targetInputContainer\.querySelectorAll\(\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2164c0df38a382062c4af.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2164c0df38a382062c4af.md
new file mode 100644
index 00000000000..15622f17e14
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2164c0df38a382062c4af.md
@@ -0,0 +1,201 @@
+---
+id: 63c2164c0df38a382062c4af
+title: Step 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+Each entry will have a text input for the entry's name, and a number input for the calories. To get a count of the number of entries, you can query by text inputs. Note that you cannot query by number inputs, as you have an extra number input for the user's calorie budget.
+
+Pass the string `input[type="text"]` to the `querySelectorAll()` method. Remember that you will need to use single quotes for your string, so that you can use double quotes within.
+
+This will return a `NodeList` of all the text inputs in the form. You can then access the `length` property of the `NodeList` to get the number of entries. Do this on the same line.
+
+# --hints--
+
+You should pass the string `input[type="text"]` to the `querySelectorAll()` method.
+
+```js
+assert.match(addEntry.toString(), /entryNumber\s*=\s*targetInputContainer\.querySelectorAll\(\s*'input\[type="text"]'\)/)
+```
+
+You should access the `length` property of your `querySelectorAll()`.
+
+```js
+assert.match(addEntry.toString(), /\.querySelectorAll\(\s*'input\[type="text"]'\)\.length/)
+```
+
+Your `entryNumber` variable should be the `length` of the `querySelectorAll`.
+
+```js
+assert.match(addEntry.toString(), /entryNumber\s*=\s*targetInputContainer\.querySelectorAll\(\s*'input\[type="text"]'\)\.length/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll();
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c216da562fbb3957b9cb2c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c216da562fbb3957b9cb2c.md
new file mode 100644
index 00000000000..a7c1e1d3e7b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c216da562fbb3957b9cb2c.md
@@ -0,0 +1,192 @@
+---
+id: 63c216da562fbb3957b9cb2c
+title: Step 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Now you need to build your dynamic HTML string to add to the webpage. Declare a new `HTMLString` variable, and assign it an empty template literal string.
+
+# --hints--
+
+Your `addEntry` function should have an `HTMLString` variable.
+
+```js
+assert.match(addEntry.toString(), /HTMLString\s*=/)
+```
+
+Your `HTMLString` should be an empty template literal.
+
+```js
+assert.match(code, /HTMLString\s*=\s*``/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2171c1e5b6e3aa51768d0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2171c1e5b6e3aa51768d0.md
new file mode 100644
index 00000000000..e8ced7f3436
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2171c1e5b6e3aa51768d0.md
@@ -0,0 +1,198 @@
+---
+id: 63c2171c1e5b6e3aa51768d0
+title: Step 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Start your `HTMLString` with a new line, then create a `label` element. Give that element the text `Entry # Name`, using your template literal syntax to replace `#` with the value of `entryNumber`.
+
+# --hints--
+
+Your `HTMLString` variable should start with a new line.
+
+```js
+assert.match(code, /HTMLString\s*=\s*`\n/);
+```
+
+You should add a `label` element on the new line.
+
+```js
+assert.match(code, /HTMLString\s*=\s*`\n\s*.*<\/label>/);
+```
+
+Your `label` element should have the text `Entry ${entryNumber} Name`.
+
+```js
+assert.match(code, /HTMLString\s*=\s*`\n\s*Entry\s\$\{entryNumber\}\sName<\/label>/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+ const HTMLString = ``;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21774193de43bbc6a769f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21774193de43bbc6a769f.md
new file mode 100644
index 00000000000..f78a3d0252c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21774193de43bbc6a769f.md
@@ -0,0 +1,193 @@
+---
+id: 63c21774193de43bbc6a769f
+title: Step 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Give your `label` element a `for` attribute with the value `X-#-name`, where `X` is the `value` of the `entryDropdown` element and `#` is the value of `entryNumber`. Remember that HTML attributes should be wrapped in double quotes.
+
+# --hints--
+
+Your `label` element should have a `for` attribute set to `${entryDropdown.value}-${entryNumber}-name`.
+
+```js
+assert.match(code, /HTMLString\s*=\s*`\n\s*/)
+```
+
+Your `label` element should have the same text as before.
+
+```js
+assert.match(code, /HTMLString\s*=\s*`\n\s*Entry\s\$\{entryNumber\}\sName<\/label>/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+ const HTMLString = `
+ Entry ${entryNumber} Name `;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c217ccd939053ce4fa16d6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c217ccd939053ce4fa16d6.md
new file mode 100644
index 00000000000..42ee9b19109
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c217ccd939053ce4fa16d6.md
@@ -0,0 +1,217 @@
+---
+id: 63c217ccd939053ce4fa16d6
+title: Step 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+After your `label` element, and on a new line in your template string, create an `input` element. Give it a `type` attribute set to `text`, a `placeholder` attribute set to `Name`, and an `id` attribute that matches the `for` attribute of your `label` element.
+
+# --hints--
+
+You should not modify your `label` element.
+
+```js
+assert.match(code, /HTMLString\s*=\s*`\n\s*Entry\s\$\{entryNumber\}\sName<\/label>/);
+```
+
+You should add an `input` element on a new line.
+
+```js
+assert.match(code, /HTMLString\s*=\s*`\n\s*Entry\s\$\{entryNumber\}\sName<\/label>\n\s* /)[0];
+assert.include(inputAttributes, 'type="text"');
+```
+
+Your `input` element should have a `placeholder` attribute set to `Name`.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+const inputAttributes = HTMLstring.match(/ /)[0];
+assert.include(inputAttributes, 'placeholder="Name"');
+```
+
+Your `input` element should have an `id` attribute set to `${entryDropdown.value}-${entryNumber}-name`.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+const inputAttributes = HTMLstring.match(/ /)[0];
+assert.include(inputAttributes, 'id="${entryDropdown.value}-${entryNumber}-name"');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+ const HTMLString = `
+ Entry ${entryNumber} Name `;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21839f56eaf3ef4e027c4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21839f56eaf3ef4e027c4.md
new file mode 100644
index 00000000000..cfeec0927c4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21839f56eaf3ef4e027c4.md
@@ -0,0 +1,228 @@
+---
+id: 63c21839f56eaf3ef4e027c4
+title: Step 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Create another `label` element (on a new line) at the end of your `HTMLString`. This `label` should have the text `Entry # Calories`, using your template literal syntax to replace `#` with the value of `entryNumber`, and the `for` attribute set to `X-#-calories`, where `X` is the `value` of `entryDropdown` and `#` is the value of `entryNumber`.
+
+# --hints--
+
+You should have two `label` elements in your `HTMLString`.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+assert.equal(HTMLstring.match(/.*<\/label>/g)[1];
+assert.match(label, //)
+```
+
+Your new `label` element should have the text `Entry ${entryNumber} Calories`.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+const label = HTMLstring.match(/.*<\/label>/g)[1];
+assert.match(label, /Entry\s\$\{entryNumber\}\sCalories<\/label>/);
+```
+
+You should not modify your existing elements.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+assert.match(HTMLstring, /`\n\s*Entry\s\$\{entryNumber\}\sName<\/label>\n\s* \n\s*Entry\s\$\{entryNumber\}\sCalories<\/label>/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+ `;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2187f55eb0f400269568f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2187f55eb0f400269568f.md
new file mode 100644
index 00000000000..f0fa5f37c19
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2187f55eb0f400269568f.md
@@ -0,0 +1,238 @@
+---
+id: 63c2187f55eb0f400269568f
+title: Step 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+Finally, on a new line after your second `label`, create another `input` element. Give this one a `type` attribute set to `number`, a `min` attribute set to `0` (to ensure negative calories cannot be added), a `placeholder` attribute set to `Calories`, and an `id` attribute that matches the `for` attribute of your second `label` element.
+
+# --hints--
+
+You should have two `input` elements in your `HTMLString`.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+assert.equal(HTMLstring.match(/ ]*>/g)[1];
+assert.include(inputAttributes, 'type="number"');
+```
+
+Your `input` element should have a `placeholder` attribute set to `Calories`.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+const inputAttributes = HTMLstring.match(/ ]*>/g)[1];
+assert.include(inputAttributes, 'placeholder="Calories"');
+```
+
+Your `input` element should have an `id` attribute set to `${entryDropdown.value}-${entryNumber}-name`.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+const inputAttributes = HTMLstring.match(/ ]*>/g)[1];
+assert.include(inputAttributes, 'id="${entryDropdown.value}-${entryNumber}-calories"');
+```
+
+Your `input` element should have a `min` attribute set to `0`.
+
+```js
+const HTMLstring = code.split("HTMLString =")[1];
+const inputAttributes = HTMLstring.match(/ ]*>/g)[1];
+assert.include(inputAttributes, 'min="0"');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories `;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c218c028c56a411b2a379a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c218c028c56a411b2a379a.md
new file mode 100644
index 00000000000..36835a69413
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c218c028c56a411b2a379a.md
@@ -0,0 +1,208 @@
+---
+id: 63c218c028c56a411b2a379a
+title: Step 49
+challengeType: 0
+dashedName: step-49
+---
+
+# --description--
+
+Finally, add your new `HTMLString` to the `targetInputContainer` by using the `innerHTML` property. Remember to use the `+=` operator to add to the existing HTML instead of replacing it.
+
+# --hints--
+
+Your `addEntry` function should access the `innerHTML` property of `targetInputContainer`.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\.innerHTML/);
+```
+
+You should use the `+=` operator on `targetInputContainer.innerHTML`.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\.innerHTML\s*\+=/);
+```
+
+You should add your `HTMLString` to the `innerHTML` of the `targetInputContainer` element.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\.innerHTML\s*\+=\s*HTMLString/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2194dce265f429300c8b1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2194dce265f429300c8b1.md
new file mode 100644
index 00000000000..ebb6b922e2b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c2194dce265f429300c8b1.md
@@ -0,0 +1,200 @@
+---
+id: 63c2194dce265f429300c8b1
+title: Step 51
+challengeType: 0
+dashedName: step-51
+---
+
+# --description--
+
+Try adding a couple of entries to the `Breakfast` category, and you may notice some bugs! The first thing we need to fix is the entry counts – the first entry should have a count of `1`, not `0`.
+
+This bug occurs because you are querying for `input[type="text"]` elements *before* adding the new entry to the page. To fix this, update your `entryNumber` variable to be the value of the `length` of the query plus `1`. Add this on your declaration line, not in your template strings.
+
+# --hints--
+
+You should add `1` to the `.length` of your `querySelectorAll()` method.
+
+```js
+assert.match(addEntry.toString(), /entryNumber\s*=\s*targetInputContainer\.querySelectorAll\(\s*'input\[type="text"]'\)\.length\s*\+\s*1/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.innerHTML += HTMLString;
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21c17fa8fd6447ff0389d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21c17fa8fd6447ff0389d.md
new file mode 100644
index 00000000000..2d0ccd9e339
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21c17fa8fd6447ff0389d.md
@@ -0,0 +1,212 @@
+---
+id: 63c21c17fa8fd6447ff0389d
+title: Step 52
+challengeType: 0
+dashedName: step-52
+---
+
+# --description--
+
+Your other bug occurs if you add a `Breakfast` entry, fill it in, then add a second `Breakfast` entry. You'll see that the values you added disappeared.
+
+This is because you are updating `innerHTML` directly, which does not preserve your input content. Change your `innerHTML` assignment to use the `insertAdjacentHTML()` method of `targetInputContainer` instead. Do not pass any arguments yet.
+
+# --hints--
+
+You should not access the `innerHTML` property of `targetInputContainer`.
+
+```js
+assert.notMatch(addEntry.toString(), /targetInputContainer\.innerHTML/);
+```
+
+You should call the `insertAdjacentHTML()` method of `targetInputContainer`.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\.insertAdjacentHTML\(/);
+```
+
+You should not pass any arguments to `insertAdjacentHTML()`.
+
+```js
+assert.match(addEntry.toString(), /targetInputContainer\.insertAdjacentHTML\(\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.innerHTML += HTMLString;
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21cd2c34541469f5700a9.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21cd2c34541469f5700a9.md
new file mode 100644
index 00000000000..78b1d7d6116
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21cd2c34541469f5700a9.md
@@ -0,0 +1,208 @@
+---
+id: 63c21cd2c34541469f5700a9
+title: Step 53
+challengeType: 0
+dashedName: step-53
+---
+
+# --description--
+
+The `insertAdjacentHtml` method takes two arguments. The first argument is a string that specifies the position of the inserted element. The second argument is a string containing the HTML to be inserted.
+
+For the first argument, pass the string `beforeend` to insert the new element as the last child of `targetInputContainer`.
+
+For the second argument, pass your `HTMLString` variable.
+
+# --hints--
+
+You should pass the string `beforeend` as the first argument to `insertAdjacentHTML`.
+
+```js
+assert.match(addEntry.toString(), /insertAdjacentHTML\(\s*('|")beforeend\1/);
+```
+
+You should pass your `HTMLString` variable as the second argument to `insertAdjacentHTML`.
+
+```js
+assert.match(addEntry.toString(), /insertAdjacentHTML\(\s*('|")beforeend\1\s*,\s*HTMLString\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+--fcc-editable-region--
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML();
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21d4f48267a47c2946788.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21d4f48267a47c2946788.md
new file mode 100644
index 00000000000..501371edf5e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21d4f48267a47c2946788.md
@@ -0,0 +1,216 @@
+---
+id: 63c21d4f48267a47c2946788
+title: Step 54
+challengeType: 0
+dashedName: step-54
+---
+
+# --description--
+
+Great! Now you can add entries without losing your previous inputs.
+
+Your next step is to write a function that will get the calorie counts from the user's entries.
+
+Declare a `getCaloriesFromInputs` function, and give it a parameter called `list`.
+
+# --hints--
+
+You should declare a `getCaloriesFromInputs` variable.
+
+```js
+assert.isDefined(getCaloriesFromInputs);
+```
+
+Your `getCaloriesFromInputs` variable should be a function.
+
+```js
+assert.isFunction(getCaloriesFromInputs);
+```
+
+Your `getCaloriesFromInputs` function should take a parameter called `list`.
+
+```js
+assert.match(getCaloriesFromInputs?.toString(), /\(\s*list\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21dea919c8e4adb0df8e8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21dea919c8e4adb0df8e8.md
new file mode 100644
index 00000000000..b4f31e92cea
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c21dea919c8e4adb0df8e8.md
@@ -0,0 +1,212 @@
+---
+id: 63c21dea919c8e4adb0df8e8
+title: Step 50
+challengeType: 0
+dashedName: step-50
+---
+
+# --description--
+
+In the Role Playing Game project, you learned how to set a button's behavior by editing its `onclick` property. You can also edit an element's behavior by adding an event listener.
+
+Call the `.addEventListener()` method of the `addEntryButton`. This takes two arguments. The first is the event to listen to – you should pass the string `click`. The second is the callback function, or the function that runs when the event is triggered. Pass the `addEntry` function as the second argument. Note that you should not *call* `addEntry`, but pass the variable (or function reference ) directly.
+
+# --hints--
+
+You should call the `.addEventListener()` method of the `addEntryButton`.
+
+```js
+assert.match(code, /addEntryButton\.addEventListener\(/);
+```
+
+You should pass `click` as the first argument to the `.addEventListener()` method.
+
+```js
+assert.match(code, /addEntryButton\.addEventListener\(\s*('|")click\1\s*/);
+```
+
+You should pass `addEntry` as the second argument to the `.addEventListener()` method.
+
+```js
+assert.match(code, /addEntryButton\.addEventListener\(\s*('|")click\1\s*,\s*addEntry\s*/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.innerHTML += HTMLString;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8ab51214c8c1f1b9a49f7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8ab51214c8c1f1b9a49f7.md
new file mode 100644
index 00000000000..8d47f896df1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8ab51214c8c1f1b9a49f7.md
@@ -0,0 +1,216 @@
+---
+id: 63c8ab51214c8c1f1b9a49f7
+title: Step 55
+challengeType: 0
+dashedName: step-55
+---
+
+# --description--
+
+In your new function, declare a `calories` variable and assign it the value `0`. Use `let` to declare it, since you will be reassigning it later.
+
+# --hints--
+
+You should declare a `calories` variable.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /calories\s*=/);
+```
+
+Your `calories` variable should be assigned the value `0`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /calories\s*=\s*0/);
+```
+
+You should declare your `calories` variable with `let`.
+
+```js
+// babel transforms the code, so we gotta do a hack here
+const getCaloriesFromInputsString = code.split('function getCaloriesFromInputs')[1];
+assert.match(getCaloriesFromInputsString, /let\s+calories\s*=\s*0/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8ad0cd8f1e5201c4ef2e4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8ad0cd8f1e5201c4ef2e4.md
new file mode 100644
index 00000000000..4da040ed199
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8ad0cd8f1e5201c4ef2e4.md
@@ -0,0 +1,224 @@
+---
+id: 63c8ad0cd8f1e5201c4ef2e4
+title: Step 56
+challengeType: 0
+dashedName: step-56
+---
+
+# --description--
+
+The `list` parameter is going to be the result of a query selector, which will return a `NodeList`. A `NodeList` is an array-like which contains the elements that match the query selector.
+
+You'll need to loop through these elements, so start by creating a `for` loop. Your iterator `i` should start at `0`, continue while it is less than the length of the list, and increment by `1` each iteration.
+
+# --hints--
+
+Your `getCaloriesFromInputs` function should have a `for` loop.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /for\s*\(/g);
+```
+
+Your `for` loop should initialize a variable called `i` to `0`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;/g);
+```
+
+Your `for` loop should have a condition that checks if `i` is less than the length of `list`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;\s*i\s*<\s*list\.length\s*;/g);
+```
+
+Your `for` loop should increment `i` by `1` each time it runs. Use the increment operator for this.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /for\s*\(\s*(let|var)\s+i\s*=\s*0\s*;\s*i\s*<\s*list\.length\s*;\s*i\s*\+\+\s*\)/g);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8b0187cceff21c8389543.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8b0187cceff21c8389543.md
new file mode 100644
index 00000000000..645fcaa4d24
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8b0187cceff21c8389543.md
@@ -0,0 +1,234 @@
+---
+id: 63c8b0187cceff21c8389543
+title: Step 57
+challengeType: 0
+dashedName: step-57
+---
+
+# --description--
+
+The `NodeList` values you will pass to `list` will consist of `input` elements. So you will want to look at the `value` attribute of each element.
+
+Assign the `value` of the element in `list` at index `i` to a variable called `currVal`.
+
+# --hints--
+
+You should have a `currVal` variable.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /currVal\s*=/);
+```
+
+You should access the element in `list` at index `i` using bracket notation.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /list\[i\]/);
+```
+
+You should access the `value` attribute of the element in `list` at index `i`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /list\[i\]\.value/);
+```
+
+You should assign the `value` of the element in `list` at index `i` to a variable called `currVal`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /currVal\s*=\s*list\[i\]\.value/);
+```
+
+Your `currVal` assignment should be in your `for` loop.
+
+```js
+// another hack, because the loop protection injects stuff
+const getCaloriesString = code.split("function getCaloriesFromInputs")[1];
+assert.match(getCaloriesString, /for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*list\.length\s*;\s*i\s*\+\+\s*\)\s*\{\s*const|let\s*currVal\s*=\s*list\[i\]\.value/g);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+
+ }
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8be904ffff922f3c6f8d0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8be904ffff922f3c6f8d0.md
new file mode 100644
index 00000000000..ae8ef40dd20
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8be904ffff922f3c6f8d0.md
@@ -0,0 +1,221 @@
+---
+id: 63c8be904ffff922f3c6f8d0
+title: Step 58
+challengeType: 0
+dashedName: step-58
+---
+
+# --description--
+
+Remember that you wrote a function earlier to clean the user's input? You'll need to use that function here.
+
+Update your `currVal` declaration to be the result of calling `cleanInputString` with `list[i].value`.
+
+# --hints--
+
+Your `getCaloriesFromInputs` function should call your `cleanInputString` function.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /cleanInputString\(/);
+```
+
+You should pass `list[i].value` as the parameter for `cleanInputString`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /cleanInputString\(\s*list\[i\]\.value\)/);
+```
+
+You should assign the result of your `cleanInputString` call to your `currVal` variable.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /currVal\s*=\s*cleanInputString\(\s*list\[i\]\.value\)/);
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = list[i].value;
+ }
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8c00bfb671b23f9de4159.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8c00bfb671b23f9de4159.md
new file mode 100644
index 00000000000..a994632ff24
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8c00bfb671b23f9de4159.md
@@ -0,0 +1,219 @@
+---
+id: 63c8c00bfb671b23f9de4159
+title: Step 59
+challengeType: 0
+dashedName: step-59
+---
+
+# --description--
+
+You also need to confirm the input is valid. Declare an `invalidInputMatch` variable, and assign it the result of calling your `isInvalidInput` function with `currVal` as the argument.
+
+# --hints--
+
+You should declare an `invalidInputMatch` variable.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /invalidInputMatch\s*=/);
+```
+
+You should assign the result of calling `isInvalidInput` to your `invalidInputMatch` variable.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /invalidInputMatch\s*=\s*isInvalidInput\(/);
+```
+
+You should pass `currVal` as the parameter to `isInvalidInput`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /invalidInputMatch\s*=\s*isInvalidInput\(\s*currVal\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+
+ }
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8c15fd337ad24b9b68049.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8c15fd337ad24b9b68049.md
new file mode 100644
index 00000000000..57c63d650b8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c8c15fd337ad24b9b68049.md
@@ -0,0 +1,233 @@
+---
+id: 63c8c15fd337ad24b9b68049
+title: Step 60
+challengeType: 0
+dashedName: step-60
+---
+
+# --description--
+
+Remember that your `isInvalidInput` function returns `String.match`, which is an array of matches or `null` if no matches are found.
+
+In JavaScript, values can either be truthy or falsy . A value is truthy if it evaluates to `true` when converted to a Boolean. A value is falsy if it evaluates to `false` when converted to a Boolean. `null` is an example of a falsy value.
+
+You need to check if `invalidInputMatch` is truthy – you can do this by passing the variable directly to your `if` condition (without a comparison operator). Here's an example of checking the truthiness of `helloWorld`.
+
+```js
+if (helloWorld) {
+
+}
+```
+
+Add an `if` statement that checks if `invalidInputMatch` is truthy.
+
+# --hints--
+
+You should add an `if` statement to your `getCaloriesFromInputs` function.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /if\s*\(/);
+```
+
+You should check the truthiness of `invalidInputMatch` in your `if` condition.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /if\s*\(\s*invalidInputMatch\s*\)/);
+```
+
+Your `if` statement should be inside your `for` loop.
+
+```js
+assert.isBelow(getCaloriesFromInputs.toString().indexOf("for"), getCaloriesFromInputs.toString().indexOf("if"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+
+ }
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bc53735149084390e5d0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bc53735149084390e5d0.md
new file mode 100644
index 00000000000..c5beb8876e8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bc53735149084390e5d0.md
@@ -0,0 +1,226 @@
+---
+id: 63c9bc53735149084390e5d0
+title: Step 61
+challengeType: 0
+dashedName: step-61
+---
+
+# --description--
+
+Browsers have a built in `alert()` function, which you can use to display a pop-up message to the user. The message to display is passed as the argument to the `alert()` function.
+
+Using a template literal, in your `if` block, call the `alert()` function to tell the user `Invalid Input:`, followed by the first value in the `invalidInputMatch` array.
+
+# --hints--
+
+You should call the `alert()` function in your `if` block.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /if\s*\(\s*invalidInputMatch\s*\)\s*\{\s*alert\(/);
+```
+
+You should use a template literal to pass the `Invalid Input:` message to the `alert()` function.
+
+```js
+// because it transforms template literals...
+assert.match(code.split("function getCaloriesFromInputs")[1], /alert\(`Invalid Input: /);
+```
+
+You should use template literal syntax to display the first value in the `invalidInputMatch` array after the `Invalid Input:` text.
+
+```js
+assert.match(code.split("function getCaloriesFromInputs")[1], /alert\(`Invalid Input: \${invalidInputMatch\[0\]}`\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+
+ }
+ }
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bcc26219e7090da0f549.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bcc26219e7090da0f549.md
new file mode 100644
index 00000000000..8857c49a4af
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bcc26219e7090da0f549.md
@@ -0,0 +1,218 @@
+---
+id: 63c9bcc26219e7090da0f549
+title: Step 62
+challengeType: 0
+dashedName: step-62
+---
+
+# --description--
+
+Still within your `if` block, set `isError` to `true` and return `null`.
+
+# --hints--
+
+After your `alert`, you should set `isError` to `true`.
+
+```js
+assert.match(code.split("function getCaloriesFromInputs")[1], /alert\(`Invalid Input: \${invalidInputMatch\[0\]}`\s*\);\s*isError\s*=\s*true/);
+```
+
+After you modify `isError`, you should `return` the value `null`.
+
+```js
+assert.match(code.split("function getCaloriesFromInputs")[1], /alert\(`Invalid Input: \${invalidInputMatch\[0\]}`\s*\);\s*isError\s*=\s*true;?\s*return\s+null;?\s*\}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+
+ }
+ }
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bce376ca4f09c15a3768.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bce376ca4f09c15a3768.md
new file mode 100644
index 00000000000..9e327dd56a4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bce376ca4f09c15a3768.md
@@ -0,0 +1,234 @@
+---
+id: 63c9bce376ca4f09c15a3768
+title: Step 63
+challengeType: 0
+dashedName: step-63
+---
+
+# --description--
+
+Remember that `return` ends the execution of a function. After your `if` block, you need to handle the logic for when the input is valid. Because your `if` statement returns a value, you do not need an `else` statement.
+
+Use the addition assignment operator to add `currVal` to your `calories` total. You'll need to use the `Number` constructor to convert `currVal` to a number.
+
+# --hints--
+
+You should not add an `else` statement.
+
+```js
+assert.notMatch(getCaloriesFromInputs.toString(), /else/);
+```
+
+After your `if` statement, you should use the addition assignment operator on `calories`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /if.*}\s*calories\s*\+=/s);
+```
+
+You should pass `currVal` to the `Number()` constructor.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /Number\(\s*currVal\s*\)/);
+```
+
+You should add the value of `Number(currVal)` to `calories`.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /calories\s*\+=\s*Number\(\s*currVal\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+
+ }
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bdd916e0c10af01ed8d7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bdd916e0c10af01ed8d7.md
new file mode 100644
index 00000000000..ba37342ef6c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bdd916e0c10af01ed8d7.md
@@ -0,0 +1,221 @@
+---
+id: 63c9bdd916e0c10af01ed8d7
+title: Step 64
+challengeType: 0
+dashedName: step-64
+---
+
+# --description--
+
+After your `for` loop has completed, return the `calories` value.
+
+# --hints--
+
+You should `return` the `calories` value.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /return\s+calories/);
+```
+
+Your new `return` statement should come after your `for` loop.
+
+```js
+assert.match(getCaloriesFromInputs.toString(), /calories\s*\+=\sNumber\(currVal\);\n\s*}\n\s*return\s+calories/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9be334f4a050c0b94bc93.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9be334f4a050c0b94bc93.md
new file mode 100644
index 00000000000..2a4f6d26012
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9be334f4a050c0b94bc93.md
@@ -0,0 +1,229 @@
+---
+id: 63c9be334f4a050c0b94bc93
+title: Step 65
+challengeType: 0
+dashedName: step-65
+---
+
+# --description--
+
+Now it's time to start putting it all together. Declare an empty `calculateCalories` function, which takes a parameter named `e`. This function will be another event listener, so the first argument passed will be the browser event – `e` is a common name for this parameter.
+
+# --hints--
+
+You should declare a `calculateCalories` variable.
+
+```js
+assert.isDefined(calculateCalories);
+```
+
+Your `calculateCalories` variable should be a function.
+
+```js
+assert.isFunction(calculateCalories);
+```
+
+Your `calculateCalories` function should take an `e` argument.
+
+```js
+assert.match(calculateCalories?.toString(), /\(e\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bef7fec05c0d38853828.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bef7fec05c0d38853828.md
new file mode 100644
index 00000000000..13d558d532c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bef7fec05c0d38853828.md
@@ -0,0 +1,227 @@
+---
+id: 63c9bef7fec05c0d38853828
+title: Step 66
+challengeType: 0
+dashedName: step-66
+---
+
+# --description--
+
+You will be attaching this function to the `submit` event of the form. The `submit` event is triggered when the form is submitted. The default action of the `submit` event is to reload the page. You need to prevent this default action using the `preventDefault()` method of your `e` parameter.
+
+Add a line to your `calculateCalories` function that calls the `preventDefault()` method on the `e` parameter. Then, reset your global error flag to `false`.
+
+# --hints--
+
+Your `calculateCalories` function should call `e.preventDefault()`.
+
+```js
+assert.match(calculateCalories.toString(), /e\.preventDefault\(\)/);
+```
+
+Your `calculateCalories` function should reset the global error flag to `false`.
+
+```js
+assert.match(calculateCalories.toString(), /isError\s*=\s*false/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bf80558d780e848b2987.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bf80558d780e848b2987.md
new file mode 100644
index 00000000000..4e4da977f9e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9bf80558d780e848b2987.md
@@ -0,0 +1,236 @@
+---
+id: 63c9bf80558d780e848b2987
+title: Step 67
+challengeType: 0
+dashedName: step-67
+---
+
+# --description--
+
+Your function needs to get the values from the entries the user has added.
+
+Declare a `breakfastNumberInputs` variable, and give it the value of calling `document.querySelectorAll()` with the selector `#breakfast input[type=number]`. This will return any `number` inputs that are in the `#breakfast` element.
+
+# --hints--
+
+You should declare a `breakfastNumberInputs` variable.
+
+```js
+assert.match(calculateCalories.toString(), /breakfastNumberInputs\s*=/);
+```
+
+You should call `document.querySelectorAll()` with `#breakfast input[type=number]`.
+
+```js
+assert.match(calculateCalories.toString(), /document\.querySelectorAll\(('|")#breakfast input\[type=number\]\1\)/);
+```
+
+You should assign the result of your `odocument.querySelectorAll()` call to `breakfastNumberInputs`.
+
+```js
+assert.match(calculateCalories.toString(), /breakfastNumberInputs\s*=\s*document\.querySelectorAll\(('|")#breakfast input\[type=number\]\1\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c09a7daa4f0ff92c4023.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c09a7daa4f0ff92c4023.md
new file mode 100644
index 00000000000..84fd6422b00
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c09a7daa4f0ff92c4023.md
@@ -0,0 +1,235 @@
+---
+id: 63c9c09a7daa4f0ff92c4023
+title: Step 68
+challengeType: 0
+dashedName: step-68
+---
+
+# --description--
+
+Using that same syntax, query your `number` inputs in the `#lunch` element and assign them to `lunchNumberInputs`.
+
+# --hints--
+
+You should declare a `lunchNumberInputs` variable.
+
+```js
+assert.match(calculateCalories.toString(), /lunchNumberInputs\s*=/);
+```
+
+You should call `document.querySelectorAll()` with `#lunch input[type=number]`.
+
+```js
+assert.match(calculateCalories.toString(), /document\.querySelectorAll\(('|")#lunch input\[type=number\]\1\)/);
+```
+
+You should assign the result of your `document.querySelectorAll()` call to `lunchNumberInputs`.
+
+```js
+assert.match(calculateCalories.toString(), /lunchNumberInputs\s*=\s*document\.querySelectorAll\(('|")#lunch input\[type=number\]\1\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c0d0857f0a10a57af936.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c0d0857f0a10a57af936.md
new file mode 100644
index 00000000000..8868dc1350c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c0d0857f0a10a57af936.md
@@ -0,0 +1,272 @@
+---
+id: 63c9c0d0857f0a10a57af936
+title: Step 69
+challengeType: 0
+dashedName: step-69
+---
+
+# --description--
+
+Following the same pattern, query for your `number` inputs in the `#dinner`, `#snacks`, and `#exercise` elements. Assign them to variables following the naming scheme of the previous two.
+
+# --hints--
+
+You should declare a `dinnerNumberInputs` variable.
+
+```js
+assert.match(calculateCalories.toString(), /dinnerNumberInputs\s*=/);
+```
+
+You should call `document.querySelectorAll()` with `#dinner input[type=number]`.
+
+```js
+assert.match(calculateCalories.toString(), /document\.querySelectorAll\(('|")#dinner input\[type=number\]\1\)/);
+```
+
+You should assign the result of your `document.querySelectorAll()` call to `dinnerNumberInputs`.
+
+```js
+assert.match(calculateCalories.toString(), /dinnerNumberInputs\s*=\s*document\.querySelectorAll\(('|")#dinner input\[type=number\]\1\)/);
+```
+
+You should declare a `snacksNumberInputs` variable.
+
+```js
+assert.match(calculateCalories.toString(), /snacksNumberInputs\s*=/);
+```
+
+You should call `document.querySelectorAll()` with `#snacks input[type=number]`.
+
+```js
+assert.match(calculateCalories.toString(), /document\.querySelectorAll\(('|")#snacks input\[type=number\]\1\)/);
+```
+
+You should assign the result of your `document.querySelectorAll()` call to `snacksNumberInputs`.
+
+```js
+assert.match(calculateCalories.toString(), /snacksNumberInputs\s*=\s*document\.querySelectorAll\(('|")#snacks input\[type=number\]\1\)/);
+```
+
+You should declare a `exerciseNumberInputs` variable.
+
+```js
+assert.match(calculateCalories.toString(), /exerciseNumberInputs\s*=/);
+```
+
+You should call `document.querySelectorAll()` with `#exercise input[type=number]`.
+
+```js
+assert.match(calculateCalories.toString(), /document\.querySelectorAll\(('|")#exercise input\[type=number\]\1\)/);
+```
+
+You should assign the result of your `document.querySelectorAll()` call to `exerciseNumberInputs`.
+
+```js
+assert.match(calculateCalories.toString(), /exerciseNumberInputs\s*=\s*document\.querySelectorAll\(('|")#exercise input\[type=number\]\1\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c11a0a090311dff55564.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c11a0a090311dff55564.md
new file mode 100644
index 00000000000..dd2be81cbc5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c11a0a090311dff55564.md
@@ -0,0 +1,242 @@
+---
+id: 63c9c11a0a090311dff55564
+title: Step 70
+challengeType: 0
+dashedName: step-70
+---
+
+# --description--
+
+Now that you have your lists of elements, you can pass them to your `getCaloriesFromInputs` function to extract the calorie total.
+
+Declare a `breakfastCalories` variable, and assign it the result of calling `getCaloriesFromInputs` with `breakfastNumberInputs` as the argument.
+
+# --hints--
+
+Your `calculateCalories` function should have a `breakfastCalories` variable.
+
+```js
+assert.match(calculateCalories.toString(), /breakfastCalories\s*=/);
+```
+
+You should call `getCaloriesFromInputs` with `breakfastNumberInputs` as the argument.
+
+```js
+assert.match(calculateCalories.toString(), /getCaloriesFromInputs\s*\(\s*breakfastNumberInputs\s*\)/);
+```
+
+You should assign the result of `getCaloriesFromInputs` to `breakfastCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /breakfastCalories\s*=\s*getCaloriesFromInputs\s*\(\s*breakfastNumberInputs\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c16dd75dd212dc12363c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c16dd75dd212dc12363c.md
new file mode 100644
index 00000000000..779bb1a2aed
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c16dd75dd212dc12363c.md
@@ -0,0 +1,241 @@
+---
+id: 63c9c16dd75dd212dc12363c
+title: Step 71
+challengeType: 0
+dashedName: step-71
+---
+
+# --description--
+
+Now declare a `lunchCalories` variable, and give it the value of calling `getCaloriesFromInputs` with your `lunchNumberInputs`.
+
+# --hints--
+
+Your `calculateCalories` function should have a `lunchCalories` variable.
+
+```js
+assert.match(calculateCalories.toString(), /lunchCalories\s*=/);
+```
+
+You should call `getCaloriesFromInputs` with `lunchNumberInputs` as the argument.
+
+```js
+assert.match(calculateCalories.toString(), /getCaloriesFromInputs\s*\(\s*lunchNumberInputs\s*\)/);
+```
+
+You should assign the result of `getCaloriesFromInputs` to `lunchCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /lunchCalories\s*=\s*getCaloriesFromInputs\s*\(\s*lunchNumberInputs\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c1ef134f3513e751c975.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c1ef134f3513e751c975.md
new file mode 100644
index 00000000000..4bd18bc353f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9c1ef134f3513e751c975.md
@@ -0,0 +1,278 @@
+---
+id: 63c9c1ef134f3513e751c975
+title: Step 72
+challengeType: 0
+dashedName: step-72
+---
+
+# --description--
+
+Following this same pattern, declare variables for the `number` inputs in the `#dinner`, `#snacks`, and `#exercise` elements. Assign them the appropriate `getCaloriesFromInputs` calls.
+
+# --hints--
+
+Your `calculateCalories` function should have a `dinnerCalories` variable.
+
+```js
+assert.match(calculateCalories.toString(), /dinnerCalories\s*=/);
+```
+
+You should call `getCaloriesFromInputs` with `dinnerNumberInputs` as the argument.
+
+```js
+assert.match(calculateCalories.toString(), /getCaloriesFromInputs\s*\(\s*dinnerNumberInputs\s*\)/);
+```
+
+You should assign the result of `getCaloriesFromInputs` to `dinnerCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /dinnerCalories\s*=\s*getCaloriesFromInputs\s*\(\s*dinnerNumberInputs\s*\)/);
+```
+
+Your `calculateCalories` function should have a `snacksCalories` variable.
+
+```js
+assert.match(calculateCalories.toString(), /snacksCalories\s*=/);
+```
+
+You should call `getCaloriesFromInputs` with `snacksNumberInputs` as the argument.
+
+```js
+assert.match(calculateCalories.toString(), /getCaloriesFromInputs\s*\(\s*snacksNumberInputs\s*\)/);
+```
+
+You should assign the result of `getCaloriesFromInputs` to `snacksCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /snacksCalories\s*=\s*getCaloriesFromInputs\s*\(\s*snacksNumberInputs\s*\)/);
+```
+
+Your `calculateCalories` function should have a `exerciseCalories` variable.
+
+```js
+assert.match(calculateCalories.toString(), /exerciseCalories\s*=/);
+```
+
+You should call `getCaloriesFromInputs` with `exerciseNumberInputs` as the argument.
+
+```js
+assert.match(calculateCalories.toString(), /getCaloriesFromInputs\s*\(\s*exerciseNumberInputs\s*\)/);
+```
+
+You should assign the result of `getCaloriesFromInputs` to `exerciseCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /exerciseCalories\s*=\s*getCaloriesFromInputs\s*\(\s*exerciseNumberInputs\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e3a83bb3e61a80eea564.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e3a83bb3e61a80eea564.md
new file mode 100644
index 00000000000..3df7e192a70
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e3a83bb3e61a80eea564.md
@@ -0,0 +1,249 @@
+---
+id: 63c9e3a83bb3e61a80eea564
+title: Step 73
+challengeType: 0
+dashedName: step-73
+---
+
+# --description--
+
+You also need to get the value of your `#budget` input. You already queried this at the top of your code, and set it to the `budgetNumberInput` variable. However, you used `getElementById`, which returns an `Element`, not a `NodeList`.
+
+A `NodeList` is an array-like, which means you can iterate through it and it shares some common methods with an array. For your `getCaloriesFromInputs` function, an array will work for the argument just as well as a `NodeList` does.
+
+Declare a `budgetCalories` variable and set it to the result of calling `getCaloriesFromInputs` – pass an array containing your `budgetNumberInput` as the argument.
+
+# --hints--
+
+Your `calculateCalories` function should have a `budgetCalories` variable.
+
+```js
+assert.match(calculateCalories.toString(), /budgetCalories\s*=/);
+```
+
+You should call `getCaloriesFromInputs` with `[budgetNumberInput]` as the argument.
+
+```js
+assert.match(calculateCalories.toString(), /getCaloriesFromInputs\s*\(\s*\[\s*budgetNumberInput\s*\]\s*\)/);
+```
+
+You should assign the result of `getCaloriesFromInputs` to `budgetCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /budgetCalories\s*=\s*getCaloriesFromInputs\s*\(\s*\[\s*budgetNumberInput\s*\]\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e45519caf31b987fbb5f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e45519caf31b987fbb5f.md
new file mode 100644
index 00000000000..c49004bbebb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e45519caf31b987fbb5f.md
@@ -0,0 +1,247 @@
+---
+id: 63c9e45519caf31b987fbb5f
+title: Step 74
+challengeType: 0
+dashedName: step-74
+---
+
+# --description--
+
+Your `getCaloriesFromInputs` function will set the global error flag to `true` if an invalid input is detected. Add an `if` statement to your `calculateCalories` function that checks the truthiness of your global error flag, and if it is truthy then use `return` to end the function execution.
+
+# --hints--
+
+Your `calculateCalories` function should have an `if` statement.
+
+```js
+assert.match(calculateCalories.toString(), /if\s*\(/);
+```
+
+Your `if` statement should check the truthiness of the `isError` variable.
+
+```js
+assert.match(calculateCalories.toString(), /if\s*\(\s*isError\s*\)/);
+```
+
+Your `if` statement should use `return` to end the function execution.
+
+```js
+assert.match(calculateCalories.toString(), /if\s*\(\s*isError\s*\)\s*\{?\s*return;?\s*\}?\s*/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e4d2ff41811dd640504f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e4d2ff41811dd640504f.md
new file mode 100644
index 00000000000..4f917ca49a0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e4d2ff41811dd640504f.md
@@ -0,0 +1,257 @@
+---
+id: 63c9e4d2ff41811dd640504f
+title: Step 75
+challengeType: 0
+dashedName: step-75
+---
+
+# --description--
+
+It is time to start preparing your calculations. Start by declaring a `consumedCalories` variable, and assign it the sum of `breakfastCalories`, `lunchCalories`, `dinnerCalories`, and `snacksCalories` (note that order matters for the tests). Be sure to do this after your `if` statement.
+
+# --hints--
+
+Your function should have a `consumedCalories` variable.
+
+```js
+assert.match(calculateCalories.toString(), /consumedCalories\s*=/);
+```
+
+Your `consumedCalories` variable should come after your `if` statement.
+
+```js
+assert.isAbove(calculateCalories.toString().indexOf('consumedCalories'), calculateCalories.toString().indexOf('if'));
+```
+
+You should calculate the sum of `breakfastCalories`, `lunchCalories`, `dinnerCalories`, and `snacksCalories`, in order.
+
+```js
+assert.match(calculateCalories.toString(), /breakfastCalories\s*\+\s*lunchCalories\s*\+\s*dinnerCalories\s*\+\s*snacksCalories/);
+```
+
+You should assign the sum of `breakfastCalories`, `lunchCalories`, `dinnerCalories`, and `snacksCalories` to `consumedCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /consumedCalories\s*=\s*breakfastCalories\s*\+\s*lunchCalories\s*\+\s*dinnerCalories\s*\+\s*snacksCalories/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e51b3a007a1eba1cd0f6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e51b3a007a1eba1cd0f6.md
new file mode 100644
index 00000000000..81b19870fd2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e51b3a007a1eba1cd0f6.md
@@ -0,0 +1,252 @@
+---
+id: 63c9e51b3a007a1eba1cd0f6
+title: Step 76
+challengeType: 0
+dashedName: step-76
+---
+
+# --description--
+
+Now declare a `remainingCalories` variable, and give it the value of subtracting `consumedCalories` from `budgetCalories` and adding `exerciseCalories`.
+
+# --hints--
+
+Your `calculateCalories` function should have a `remainingCalories` variable.
+
+```js
+assert.match(calculateCalories.toString(), /remainingCalories\s*=/);
+```
+
+You should find the value of `budgetCalories - consumedCalories + exerciseCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /budgetCalories\s*-\s*consumedCalories\s*\+\s*exerciseCalories/);
+```
+
+You should assign the value of `budgetCalories - consumedCalories + exerciseCalories` to `remainingCalories`.
+
+```js
+assert.match(calculateCalories.toString(), /remainingCalories\s*=\s*budgetCalories\s*-\s*consumedCalories\s*\+\s*exerciseCalories/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e55b4b06c11fff555c64.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e55b4b06c11fff555c64.md
new file mode 100644
index 00000000000..bc911d3b831
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e55b4b06c11fff555c64.md
@@ -0,0 +1,267 @@
+---
+id: 63c9e55b4b06c11fff555c64
+title: Step 77
+challengeType: 0
+dashedName: step-77
+---
+
+# --description--
+
+You need to know if the user's calories are a surplus or a deficit. Declare a `surplusOrDeficit` variable.
+
+Use a ternary operator to set `surplusOrDeficit` to the string `Surplus` or `Deficit` depending on whether `remainingCalories` is greater than or equal to `0`. If it is greater than or equal to `0`, then `surplusOrDeficit` should be `Surplus`. Otherwise, it should be `Deficit`.
+
+# --hints--
+
+Your `calculateCalories` function should have a `surplusOrDeficit` variable.
+
+```js
+assert.match(calculateCalories.toString(), /surplusOrDeficit\s*=/g);
+```
+
+You should have a ternary operator that checks if `remainingCalories` is greater than or equal to `0`.
+
+```js
+assert.match(calculateCalories.toString(), /remainingCalories\s*>=\s*0\s*\?/g);
+```
+
+Your ternary operator return the string `Surplus` if `remainingCalories` is greater than or equal to `0`.
+
+```js
+assert.match(calculateCalories.toString(), /remainingCalories\s*>=\s*0\s*\?\s*('|")Surplus\1\s*:/g);
+```
+
+Your ternary operator return the string `Deficit` if `remainingCalories` is not greater than or equal to `0`.
+
+```js
+assert.match(calculateCalories.toString(), /remainingCalories\s*>=\s*0\s*\?\s*('|")Surplus\1\s*:\s*('|")Deficit\2/g);
+```
+
+You should assign the result of your ternary operator to `surplusOrDeficit`.
+
+```js
+assert.match(calculateCalories.toString(), /surplusOrDeficit\s*=\s*remainingCalories\s*>=\s*0\s*\?\s*('|")Surplus\1\s*:\s*('|")Deficit\2/g);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e5eea8261d22856ead1c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e5eea8261d22856ead1c.md
new file mode 100644
index 00000000000..01ebba201d2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e5eea8261d22856ead1c.md
@@ -0,0 +1,250 @@
+---
+id: 63c9e5eea8261d22856ead1c
+title: Step 78
+challengeType: 0
+dashedName: step-78
+---
+
+# --description--
+
+You need to construct the HTML string that will be displayed in the `output` element. Start by assigning an empty template literal to the `innerHTML` property of the `output` element.
+
+# --hints--
+
+You should access the `innerHTML` property of the `output` element.
+
+```js
+assert.match(calculateCalories.toString(), /output\s*\.\s*innerHTML/);
+```
+
+You should assign an empty template literal to the `innerHTML` property of the `output` element.
+
+```js
+// again, template literals don't play well with the parser so we have to look at the raw code.
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/;?\s*\}/)[0];
+assert.equal(htmlString, '``');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e63bb1e32d23b6adbe44.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e63bb1e32d23b6adbe44.md
new file mode 100644
index 00000000000..5711b833a42
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e63bb1e32d23b6adbe44.md
@@ -0,0 +1,266 @@
+---
+id: 63c9e63bb1e32d23b6adbe44
+title: Step 79
+challengeType: 0
+dashedName: step-79
+---
+
+# --description--
+
+Your `output.innerHTML` string will need a `span` element. Create that, and give it a `class` attribute set to the `surplusOrDeficit` variable, but lowercased.
+
+Strings have a `.toLowerCase()` method that can help you with this. Do not give your `span` any text yet.
+
+# --hints--
+
+You should create a `span` element in your template literal.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.match(htmlString, //);
+```
+
+Your `span` should not have any text.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.match(htmlString, /<\/span>/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = ``;
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e6b7c0303524af2d0bc2.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e6b7c0303524af2d0bc2.md
new file mode 100644
index 00000000000..ee4568c97d6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e6b7c0303524af2d0bc2.md
@@ -0,0 +1,245 @@
+---
+id: 63c9e6b7c0303524af2d0bc2
+title: Step 80
+challengeType: 0
+dashedName: step-80
+---
+
+# --description--
+
+Give your span the text `remainingCalories Calorie surplusOrDeficit`, using interpolation to replace `remainingCalories` and `surplusOrDeficit` with the appropriate variables.
+
+# --hints--
+
+Your `span` should have the text `${remainingCalories} Calorie ${surplusOrDeficit}`.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.match(htmlString, /\$\{remainingCalories\} Calorie \$\{surplusOrDeficit\}<\/span>/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+
+ `;
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e769df38c92635c158ba.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e769df38c92635c158ba.md
new file mode 100644
index 00000000000..cec54f93795
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e769df38c92635c158ba.md
@@ -0,0 +1,254 @@
+---
+id: 63c9e769df38c92635c158ba
+title: Step 81
+challengeType: 0
+dashedName: step-81
+---
+
+# --description--
+
+When the user has a calorie deficit, the `remainingCalories` value will be negative. You don't want to display a negative number in the result string.
+
+`Math.abs()` is a built-in JavaScript method that will return the absolute value of a number. In your `span` text, wrap your `remainingCalories` reference in `Math.abs()` to ensure that the value is positive.
+
+# --hints--
+
+You should wrap the `remainingCalories` variable in `Math.abs()`.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.match(htmlString, /Math\.abs\(\s*remainingCalories\s*\)/);
+```
+
+Your `span` should have the text `${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}`.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.match(htmlString, /\$\{Math\.abs\(remainingCalories\)\} Calorie \$\{surplusOrDeficit\}<\/span>/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${remainingCalories} Calorie ${surplusOrDeficit}
+ `;
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e7d5b21eee2776ecc226.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e7d5b21eee2776ecc226.md
new file mode 100644
index 00000000000..d341d5e62bf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e7d5b21eee2776ecc226.md
@@ -0,0 +1,262 @@
+---
+id: 63c9e7d5b21eee2776ecc226
+title: Step 82
+challengeType: 0
+dashedName: step-82
+---
+
+# --description--
+
+After your `span` element, add an `hr` element to create a horizontal line.
+
+To keep your code clean and readable, you should add this on a new line in the template literal.
+
+# --hints--
+
+You should add an `hr` element to your `output.innerHTML` string.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.match(htmlString, / /);
+```
+
+Your `hr` element should come after your `span` element.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.isAbove(htmlString.indexOf(' /);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ `;
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e84c9fe8ca28c4101189.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e84c9fe8ca28c4101189.md
new file mode 100644
index 00000000000..ba1da012290
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e84c9fe8ca28c4101189.md
@@ -0,0 +1,270 @@
+---
+id: 63c9e84c9fe8ca28c4101189
+title: Step 83
+challengeType: 0
+dashedName: step-83
+---
+
+# --description--
+
+Now create a `p` element with the text `budgetCalories Calories Budgeted`, using interpolation to replace `budgetCalories` with the appropriate variable.
+
+This should come after your `hr` element.
+
+# --hints--
+
+You should create a `p` element.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.match(htmlString, //);
+```
+
+Your `p` element should come after your `hr` element.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.isAbove(htmlString.indexOf('
\$\{budgetCalories\}\s*Calories\s*Budgeted<\/p>/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+
+ `;
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e8fe3a6f022a05a04675.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e8fe3a6f022a05a04675.md
new file mode 100644
index 00000000000..6b28d6282ad
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e8fe3a6f022a05a04675.md
@@ -0,0 +1,269 @@
+---
+id: 63c9e8fe3a6f022a05a04675
+title: Step 84
+challengeType: 0
+dashedName: step-84
+---
+
+# --description--
+
+Using the same interpolation syntax, add a second `p` element with the text `consumedCalories Calories Consumed` and a third with the text `exerciseCalories Calories Burned`. Remember to replace your `consumedCalories` and `exerciseCalories` variables with the appropriate values.
+
+# --hints--
+
+You should add a second `p` element to your template literal.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.isAtLeast(htmlString.match(//g).length, 2);
+```
+
+Your second `p` element should be on a new line.
+
+```js
+const htmlString = code.split(/output\s*\.\s*innerHTML\s*=\s*/)[1].split(/`/)[1];
+assert.match(htmlString, /\n\s*
\$\{budgetCalories\}\s*Calories\s*Budgeted<\/p>\n\s*
\$\{consumedCalories\}\s*Calories\s*Consumed<\/p>/));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+
+ `;
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e94e9df7d72aed1c24bd.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e94e9df7d72aed1c24bd.md
new file mode 100644
index 00000000000..f57827b6348
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9e94e9df7d72aed1c24bd.md
@@ -0,0 +1,264 @@
+---
+id: 63c9e94e9df7d72aed1c24bd
+title: Step 85
+challengeType: 0
+dashedName: step-85
+---
+
+# --description--
+
+Finally, you need to make the `#output` element visible so the user can see your text. Your `output` variable is an Element, which has a `classList` property. This property has a `.remove()` method, which accepts a string representing the class to remove from the element.
+
+Use the `.remove()` method of the `output` variable's `classList` property to remove the `hide` class. Don't forget to place the word `hide` inside quotes.
+
+# --hints--
+
+You should access the `classList` property of the `output` element.
+
+```js
+assert.match(calculateCalories.toString(), /output\.classList/);
+```
+
+You should call the `.remove()` method of the `classList` property.
+
+```js
+assert.match(calculateCalories.toString(), /output\.classList\.remove\(/);
+```
+
+You should pass `hide` as the argument to the `.remove()` method.
+
+```js
+assert.match(calculateCalories.toString(), /output\.classList\.remove\(\s*('|")hide\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+--fcc-editable-region--
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+
+}
+--fcc-editable-region--
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ea23dbadbf2c2764e3f5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ea23dbadbf2c2764e3f5.md
new file mode 100644
index 00000000000..18e5f04d27a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ea23dbadbf2c2764e3f5.md
@@ -0,0 +1,265 @@
+---
+id: 63c9ea23dbadbf2c2764e3f5
+title: Step 86
+challengeType: 0
+dashedName: step-86
+---
+
+# --description--
+
+If you click on your `Calculate Remaining Calories` button, you'll see that nothing happens. You still need to mount the event listener.
+
+Add an event listener to your `calorieCounter` element. The event type should be `submit`, and the callback function should be `calculateCalories`.
+
+# --hints--
+
+You should use the `.addEventListener()` method of your `calorieCounter` element.
+
+```js
+assert.match(code, /calorieCounter\.addEventListener\(/);
+```
+
+You should pass `submit` as the first argument to `.addEventListener()`.
+
+```js
+assert.match(code, /calorieCounter\.addEventListener\(\s*('|")submit\1\s*/);
+```
+
+You should pass `calculateCalories` as the second argument to `.addEventListener()`.
+
+```js
+assert.match(code, /calorieCounter\.addEventListener\(\s*('|")submit\1\s*,\s*calculateCalories\s*/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+addEntryButton.addEventListener("click", addEntry);
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ea9b16430f2d54522464.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ea9b16430f2d54522464.md
new file mode 100644
index 00000000000..6c09fd6f149
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ea9b16430f2d54522464.md
@@ -0,0 +1,265 @@
+---
+id: 63c9ea9b16430f2d54522464
+title: Step 87
+challengeType: 0
+dashedName: step-87
+---
+
+# --description--
+
+Your final feature to add is the ability for a user to clear the form. Start by declaring an empty function called `clearForm` – it should not take any arguments.
+
+# --hints--
+
+You should declare a `clearForm` variable.
+
+```js
+assert.isDefined(clearForm);
+```
+
+Your `clearForm` variable should be a function.
+
+```js
+assert.isFunction(clearForm);
+```
+
+Your `clearForm` function should not take any arguments.
+
+```js
+assert.match(clearForm?.toString(), /\(\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+calorieCounter.addEventListener("submit", calculateCalories);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9eb09bcfaa72e3da820a1.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9eb09bcfaa72e3da820a1.md
new file mode 100644
index 00000000000..7810095dcce
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9eb09bcfaa72e3da820a1.md
@@ -0,0 +1,267 @@
+---
+id: 63c9eb09bcfaa72e3da820a1
+title: Step 88
+challengeType: 0
+dashedName: step-88
+---
+
+# --description--
+
+You need to get all of the input containers. Declare an `inputContainers` variable, and assign it to the value of querying the document for all elements with the class `input-container`.
+
+# --hints--
+
+You should declare an `inputContainers` variable in your `clearForm` function.
+
+```js
+assert.match(clearForm.toString(), /inputContainers\s*=/);
+```
+
+You should use the `querySelectorAll` method to get all of the elements with the class `input-container`.
+
+```js
+assert.match(clearForm.toString(), /document\.querySelectorAll\(\s*('|")\.input-container\1\s*\)/);
+```
+
+You should assign the value of the `querySelectorAll` method to the `inputContainers` variable.
+
+```js
+assert.match(clearForm.toString(), /inputContainers\s*=\s*document\.querySelectorAll\(\s*('|")\.input-container\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+--fcc-editable-region--
+function clearForm() {
+
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+calorieCounter.addEventListener("submit", calculateCalories);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9eb4a5d68f12f32d9b440.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9eb4a5d68f12f32d9b440.md
new file mode 100644
index 00000000000..73d20bba696
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9eb4a5d68f12f32d9b440.md
@@ -0,0 +1,263 @@
+---
+id: 63c9eb4a5d68f12f32d9b440
+title: Step 89
+challengeType: 0
+dashedName: step-89
+---
+
+# --description--
+
+Remember that `document.querySelectorAll` returns a `NodeList`, which is array-like but is not an array. However, the `Array` object has a `.from()` method that accepts an array-like and returns an array. This is helpful when you want access to more robust array methods, which you will learn about in a future project.
+
+Wrap your `inputContainers` query selector in `Array.from()`. Do this on the same line as your declaration.
+
+# --hints--
+
+You should wrap your `querySelectorAll` in `Array.from()`.
+
+```js
+assert.match(clearForm, /Array\.from\(\s*document\.querySelectorAll\(\s*('|")\.input-container*\1\s*\)\s*\)/);
+```
+
+You should assign the result of `Array.from()` to your `inputContainers` variable.
+
+```js
+assert.match(clearForm, /inputContainers\s*=\s*Array\.from\(\s*document\.querySelectorAll\(\s*('|")\.input-container*\1\s*\)\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+--fcc-editable-region--
+function clearForm() {
+ const inputContainers = document.querySelectorAll('.input-container');
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+calorieCounter.addEventListener("submit", calculateCalories);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ebb7b12bca3025b0a935.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ebb7b12bca3025b0a935.md
new file mode 100644
index 00000000000..f6655dc9175
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ebb7b12bca3025b0a935.md
@@ -0,0 +1,276 @@
+---
+id: 63c9ebb7b12bca3025b0a935
+title: Step 90
+challengeType: 0
+dashedName: step-90
+---
+
+# --description--
+
+It is time for another loop. Use a `for` loop to iterate through the `inputContainers` array.
+
+Inside the loop, set the `innerHTML` property of the element at the current index to an empty string. This will clear all of the contents of that input container.
+
+# --hints--
+
+Your `clearForm` function should have a `for` loop.
+
+```js
+// loop protect injects stuff, so let's look at the raw code again
+const clearForm = code.split("function clearForm()")[1];
+assert.match(clearForm, /for\s*\(/);
+```
+
+Your `for` loop should iterate through the `inputContainers` array. Remember to use `i` as your iterator.
+
+```js
+const clearForm = code.split("function clearForm()")[1];
+assert.match(clearForm, /for\s*\(\s*let\s+i\s*=\s*0\s*;\s*i\s*<\s*inputContainers\.length\s*;\s*i\s*\+\+\s*\)/);
+```
+
+Your `for` loop should set the `innerHTML` property of `inputContainers[i]` to an empty string.
+
+```js
+const clearForm = code.split("function clearForm()")[1];
+const forLoop = clearForm.split("for")[1];
+assert.match(forLoop, /inputContainers\[\s*i\s*\]\s*\.innerHTML\s*=\s*(`|'|")\1\s*/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+--fcc-editable-region--
+function clearForm() {
+ const inputContainers = Array.from(document.querySelectorAll('.input-container'));
+
+
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+calorieCounter.addEventListener("submit", calculateCalories);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ec044acedf312c4974ff.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ec044acedf312c4974ff.md
new file mode 100644
index 00000000000..5ef4abce954
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9ec044acedf312c4974ff.md
@@ -0,0 +1,275 @@
+---
+id: 63c9ec044acedf312c4974ff
+title: Step 91
+challengeType: 0
+dashedName: step-91
+---
+
+# --description--
+
+After your loop completes, you need to clear the `budgetNumberInput`. Set the `value` property of `budgetNumberInput` to an empty string.
+
+# --hints--
+
+Your `clearForm` function should access the `value` property of the `budgetNumberInput` element.
+
+```js
+assert.match(clearForm.toString(), /budgetNumberInput\.value/);
+```
+
+Your `clearForm` function should set the `value` property of the `budgetNumberInput` element to an empty string.
+
+```js
+assert.match(clearForm.toString(), /budgetNumberInput\.value\s*=\s*('|"|`)\1/);
+```
+
+You should modify the `budgetNumberInput` after your `for` loop.
+
+```js
+const clearForm = code.split("function clearForm()")[1];
+const afterLoop = clearForm.split("}")[1];
+assert.match(afterLoop, /budgetNumberInput\.value/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+--fcc-editable-region--
+function clearForm() {
+ const inputContainers = Array.from(document.querySelectorAll('.input-container'));
+
+ for (let i = 0; i < inputContainers.length; i++) {
+ inputContainers[i].innerHTML = '';
+ }
+
+
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+calorieCounter.addEventListener("submit", calculateCalories);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f24afbc9cf324dcaa9a4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f24afbc9cf324dcaa9a4.md
new file mode 100644
index 00000000000..3dab9bed7e5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f24afbc9cf324dcaa9a4.md
@@ -0,0 +1,276 @@
+---
+id: 63c9f24afbc9cf324dcaa9a4
+title: Step 92
+challengeType: 0
+dashedName: step-92
+---
+
+# --description--
+
+You also need to clear the `output` element's text. You can do this by setting the `innerText` property to an empty string.
+
+The difference between `innerText` and `innerHTML` is that `innerText` will not render HTML elements, but will display the tags and content as raw text.
+
+# --hints--
+
+Your `clearForm` function should access the `innerText` property of the `output` element.
+
+```js
+assert.match(clearForm.toString(), /output\.innerText/);
+```
+
+Your `clearForm` function should set the `innerText` property of the `output` element to an empty string.
+
+```js
+assert.match(clearForm.toString(), /output\.innerText\s*=\s*('|"|`)\1/);
+```
+
+You should modify `output` after modifying `budgetNumberInput`.
+
+```js
+assert.isAbove(clearForm.toString().indexOf('output'), clearForm.toString().indexOf('budgetNumberInput'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+--fcc-editable-region--
+function clearForm() {
+ const inputContainers = Array.from(document.querySelectorAll('.input-container'));
+
+ for (let i = 0; i < inputContainers.length; i++) {
+ inputContainers[i].innerHTML = '';
+ }
+
+ budgetNumberInput.value = '';
+
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+calorieCounter.addEventListener("submit", calculateCalories);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f28bda3e3f336e21b6b4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f28bda3e3f336e21b6b4.md
new file mode 100644
index 00000000000..b2e9d536a15
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f28bda3e3f336e21b6b4.md
@@ -0,0 +1,277 @@
+---
+id: 63c9f28bda3e3f336e21b6b4
+title: Step 93
+challengeType: 0
+dashedName: step-93
+---
+
+# --description--
+
+To finish off this function, you need to restore the `hide` class to the `output` element. The `classList` property has an `.add()` method which is the opposite of the `.remove()` method. It accepts a string representing the class to add to the element.
+
+Add the `hide` class to your `output`.
+
+# --hints--
+
+You should access the `classList` property of the `output` element.
+
+```js
+assert.match(clearForm.toString(), /output\.classList/);
+```
+
+You should call the `.add()` method on the `classList` property of the `output` element.
+
+```js
+assert.match(clearForm.toString(), /output\.classList\.add/);
+```
+
+You should pass `hide` as the argument to the `.add()` method.
+
+```js
+assert.match(clearForm.toString(), /output\.classList\.add\(\s*('|")hide\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+--fcc-editable-region--
+function clearForm() {
+ const inputContainers = Array.from(document.querySelectorAll('.input-container'));
+
+ for (let i = 0; i < inputContainers.length; i++) {
+ inputContainers[i].innerHTML = '';
+ }
+
+ budgetNumberInput.value = '';
+ output.innerText = '';
+
+}
+--fcc-editable-region--
+
+addEntryButton.addEventListener("click", addEntry);
+calorieCounter.addEventListener("submit", calculateCalories);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f2bff625af342023512c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f2bff625af342023512c.md
new file mode 100644
index 00000000000..d29b3f2ac72
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-form-validation-by-building-a-calorie-counter/63c9f2bff625af342023512c.md
@@ -0,0 +1,520 @@
+---
+id: 63c9f2bff625af342023512c
+title: Step 94
+challengeType: 0
+dashedName: step-94
+---
+
+# --description--
+
+To complete this project, add an event listener to the `clearButton` button. When the button is clicked, it should call the `clearForm` function.
+
+Congratulations! Your project is complete.
+
+# --hints--
+
+You should add an event listener to the `clearButton` button.
+
+```js
+assert.match(code, /clearButton\s*\.addEventListener\s*\(/);
+```
+
+You should pass `click` as the first argument to `.addEventListener()`.
+
+```js
+assert.match(code, /clearButton\s*\.addEventListener\s*\(\s*('|"|`)click\1\s*/);
+```
+
+You should pass `clearForm` as the second argument to `.addEventListener()`.
+
+```js
+assert.match(code, /clearButton\s*\.addEventListener\s*\(\s*('|"|`)click\1\s*,\s*clearForm\s*/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+function clearForm() {
+ const inputContainers = Array.from(document.querySelectorAll('.input-container'));
+
+ for (let i = 0; i < inputContainers.length; i++) {
+ inputContainers[i].innerHTML = '';
+ }
+
+ budgetNumberInput.value = '';
+ output.innerText = '';
+ output.classList.add('hide');
+}
+
+addEntryButton.addEventListener("click", addEntry);
+calorieCounter.addEventListener("submit", calculateCalories);
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
+ Calorie Counter
+
+
+
+ Calorie Counter
+
+
+ Budget
+
+
+ Breakfast
+
+
+
+ Lunch
+
+
+
+ Dinner
+
+
+
+ Snacks
+
+
+
+ Exercise
+
+
+
+
+ Add food or exercise:
+
+ Breakfast
+ Lunch
+ Dinner
+ Snacks
+ Exercise
+
+ Add Entry
+
+
+
+
+ Calculate Remaining Calories
+
+ Clear
+
+
+
+
+
+
+
+
+```
+
+```css
+body {
+ font-family: "Lato", Arial;
+}
+
+h1 {
+ text-align: center;
+}
+
+.container {
+ width: 90%;
+ max-width: 680px;
+}
+
+h1,
+.container,
+.output {
+ margin: 20px auto;
+}
+
+label,
+legend {
+ font-weight: bold;
+}
+
+.input-container {
+ display: flex;
+ flex-direction: column;
+}
+
+button:hover {
+ cursor: pointer;
+}
+
+fieldset,
+label,
+button,
+input,
+select {
+ margin-bottom: 10px;
+}
+
+.output {
+ border: 2px solid black;
+ padding: 10px;
+ text-align: center;
+}
+
+.hide {
+ display: none;
+}
+
+.output span {
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+.surplus {
+ color: #006627;
+}
+
+.deficit {
+ color: #B30000;
+}
+```
+
+```js
+const calorieCounter = document.getElementById('calorie-counter');
+const budgetNumberInput = document.getElementById('budget');
+const entryDropdown = document.getElementById('entry-dropdown');
+const addEntryButton = document.getElementById('add-entry');
+const clearButton = document.getElementById('clear');
+const output = document.getElementById('output');
+let isError = false;
+
+function cleanInputString(str) {
+ const regex = /[+-\s]/g;
+ return str.replace(regex, '');
+}
+
+function isInvalidInput(str) {
+ const regex = /\d+e\d+/i;
+ return str.match(regex);
+}
+
+function addEntry() {
+ const targetInputContainer = document.querySelector(`#${entryDropdown.value} .input-container`);
+ const entryNumber = targetInputContainer.querySelectorAll('input[type="text"]').length + 1;
+ const HTMLString = `
+ Entry ${entryNumber} Name
+
+ Entry ${entryNumber} Calories
+ `;
+ targetInputContainer.insertAdjacentHTML('beforeend', HTMLString);
+}
+
+function calculateCalories(e) {
+ e.preventDefault();
+ isError = false;
+
+ const breakfastNumberInputs = document.querySelectorAll('#breakfast input[type=number]');
+ const lunchNumberInputs = document.querySelectorAll('#lunch input[type=number]');
+ const dinnerNumberInputs = document.querySelectorAll('#dinner input[type=number]');
+ const snacksNumberInputs = document.querySelectorAll('#snacks input[type=number]');
+ const exerciseNumberInputs = document.querySelectorAll('#exercise input[type=number]');
+
+ const breakfastCalories = getCaloriesFromInputs(breakfastNumberInputs);
+ const lunchCalories = getCaloriesFromInputs(lunchNumberInputs);
+ const dinnerCalories = getCaloriesFromInputs(dinnerNumberInputs);
+ const snacksCalories = getCaloriesFromInputs(snacksNumberInputs);
+ const exerciseCalories = getCaloriesFromInputs(exerciseNumberInputs);
+ const budgetCalories = getCaloriesFromInputs([budgetNumberInput]);
+
+ if (isError) {
+ return;
+ }
+
+ const consumedCalories = breakfastCalories + lunchCalories + dinnerCalories + snacksCalories;
+ const remainingCalories = budgetCalories - consumedCalories + exerciseCalories;
+ const surplusOrDeficit = remainingCalories >= 0 ? 'Surplus' : 'Deficit';
+ output.innerHTML = `
+ ${Math.abs(remainingCalories)} Calorie ${surplusOrDeficit}
+
+ ${budgetCalories} Calories Budgeted
+ ${consumedCalories} Calories Consumed
+ ${exerciseCalories} Calories Burned
+ `;
+
+ output.classList.remove('hide');
+}
+
+function getCaloriesFromInputs(list) {
+ let calories = 0;
+
+ for (let i = 0; i < list.length; i++) {
+ const currVal = cleanInputString(list[i].value);
+ const invalidInputMatch = isInvalidInput(currVal);
+
+ if (invalidInputMatch) {
+ alert(`Invalid Input: ${invalidInputMatch[0]}`);
+ isError = true;
+ return null;
+ }
+ calories += Number(currVal);
+ }
+ return calories;
+}
+
+function clearForm() {
+ const inputContainers = Array.from(document.querySelectorAll('.input-container'));
+
+ for (let i = 0; i < inputContainers.length; i++) {
+ inputContainers[i].innerHTML = '';
+ }
+
+ budgetNumberInput.value = '';
+ output.innerText = '';
+ output.classList.add('hide');
+}
+
+addEntryButton.addEventListener('click', addEntry);
+calorieCounter.addEventListener('submit', calculateCalories);
+clearButton.addEventListener('click', clearForm);
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63c620161fc2b49ac340ffc4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63c620161fc2b49ac340ffc4.md
new file mode 100644
index 00000000000..46b4f675589
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63c620161fc2b49ac340ffc4.md
@@ -0,0 +1,278 @@
+---
+id: 63c620161fc2b49ac340ffc4
+title: Step 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+In this project, you will build a set of football team cards and learn about nested objects, object destructuring, default parameters, event listeners, and switch statements. All of the HTML and CSS for this project has been provided for you.
+
+Start by accessing the `id` called `team` from the HTML document and storing it in a `const` variable called `teamName`.
+
+Remember, you can use the `getElementById` method for this.
+
+# --hints--
+
+You should use the `document.getElementById()` method to get the `#team` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)team\1\s*\)/);
+```
+
+You should use `const` to declare the variable called `teamName` and assign it the `#team` element.
+
+```js
+assert.match(code, /const\s+teamName\s*=\s*document\.getElementById\(\s*('|"|`)team\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf7e324c1831f8d936b3ae.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf7e324c1831f8d936b3ae.md
new file mode 100644
index 00000000000..513b3c3ed99
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf7e324c1831f8d936b3ae.md
@@ -0,0 +1,287 @@
+---
+id: 63cf7e324c1831f8d936b3ae
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Next, access the `id` called `sport` from the HTML document and store it in a `const` variable called `typeOfSport`. Below that variable, assign the `id` of `year` to a `const` variable called `worldCupYear`.
+
+# --hints--
+
+You should use the `document.getElementById()` method to get the `#sport` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)sport\1\s*\)/);
+```
+
+You should use `const` to declare the variable called `typeOfSport` and assign it the `#sport` element.
+
+```js
+assert.match(code, /const\s+typeOfSport\s*=\s*document\.getElementById\(\s*('|"|`)sport\1\s*\)/);
+```
+
+You should use the `document.getElementById()` method to get the `#year` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)year\1\s*\)/);
+```
+
+You should use `const` to declare the variable called `worldCupYear` and assign it the `#year` element.
+
+```js
+assert.match(code, /const\s+worldCupYear\s*=\s*document\.getElementById\(\s*('|"|`)year\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf7f97e7f99af9348f5068.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf7f97e7f99af9348f5068.md
new file mode 100644
index 00000000000..080e5e186a1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf7f97e7f99af9348f5068.md
@@ -0,0 +1,289 @@
+---
+id: 63cf7f97e7f99af9348f5068
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Next, access the `id` called `head-coach` from the HTML document and store it in a `const` variable called `headCoach`. Below that variable, assign the `id` of `player-cards` to a `const` variable called `playerCards`.
+
+# --hints--
+
+You should use the `document.getElementById()` method to get the `#head-coach` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)head-coach\1\s*\)/);
+```
+
+You should use `const` to declare the variable called `headCoach` and assign it the `#head-coach` element.
+
+```js
+assert.match(code, /const\s+headCoach\s*=\s*document\.getElementById\(\s*('|"|`)head-coach\1\s*\)/);
+```
+
+You should use the `document.getElementById()` method to get the `#player-cards` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)player-cards\1\s*\)/);
+```
+
+You should use `const` to declare the variable called `playerCards` and assign it the `#player-cards` element.
+
+```js
+assert.match(code, /const\s+playerCards\s*=\s*document\.getElementById\(\s*('|"|`)player-cards\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf812bb8ecd4f9cf749b8f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf812bb8ecd4f9cf749b8f.md
new file mode 100644
index 00000000000..6afeaf034bf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf812bb8ecd4f9cf749b8f.md
@@ -0,0 +1,279 @@
+---
+id: 63cf812bb8ecd4f9cf749b8f
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Create one more `const` variable called `playersDropdownList` and assign it the `id` of `players` using the `getElementById` method.
+
+# --hints--
+
+You should use the `document.getElementById()` method to get the `#players` element.
+
+```js
+assert.match(code, /document\.getElementById\(\s*('|"|`)players\1\s*\)/);
+```
+
+You should use `const` to declare the variable called `playersDropdownList` and assign it the `#players` element.
+
+```js
+assert.match(code, /const\s+playersDropdownList\s*=\s*document\.getElementById\(\s*('|"|`)players\1\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf83fdbb51d9fa54654ae6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf83fdbb51d9fa54654ae6.md
new file mode 100644
index 00000000000..e306a5ea676
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf83fdbb51d9fa54654ae6.md
@@ -0,0 +1,276 @@
+---
+id: 63cf83fdbb51d9fa54654ae6
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Now it is time to build out the data structure that will hold all of the information for your football team.
+
+Below the variables you just created, create a new `const` variable called `myFavoriteFootballTeam` and assign it an empty object.
+
+# --hints--
+
+You should use `const` to declare the variable called `myFavoriteFootballTeam` and assign it an empty object.
+
+```js
+assert.match(code, /const\s+myFavoriteFootballTeam\s*=\s*{\s*}\s*/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf8ec006a776ff5f6e3c68.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf8ec006a776ff5f6e3c68.md
new file mode 100644
index 00000000000..815176b6cff
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf8ec006a776ff5f6e3c68.md
@@ -0,0 +1,283 @@
+---
+id: 63cf8ec006a776ff5f6e3c68
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Inside the `myFavoriteFootballTeam` object, add a new property with a key named `team` and a string value of `Argentina`.
+
+
+# --hints--
+
+Your `myFavoriteFootballTeam` object should have a `team` property.
+
+```js
+assert.property(myFavoriteFootballTeam, 'team');
+```
+
+Your `team` property should be set to `Argentina`.
+
+```js
+assert.equal(myFavoriteFootballTeam.team, 'Argentina');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+--fcc-editable-region--
+const myFavoriteFootballTeam = {
+
+};
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf90d4696d8f00851873a4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf90d4696d8f00851873a4.md
new file mode 100644
index 00000000000..7d7fc38601f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf90d4696d8f00851873a4.md
@@ -0,0 +1,283 @@
+---
+id: 63cf90d4696d8f00851873a4
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Below the `team` property, add a new property with a key named `sport` and a string value of `Football`.
+
+# --hints--
+
+Your `myFavoriteFootballTeam` object should have a `sport` property.
+
+```js
+assert.property(myFavoriteFootballTeam, 'sport');
+```
+
+Your `sport` property should be set to `Football`.
+
+```js
+assert.equal(myFavoriteFootballTeam.sport, 'Football');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+--fcc-editable-region--
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+
+};
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf91b0ff6e9300ead140cc.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf91b0ff6e9300ead140cc.md
new file mode 100644
index 00000000000..3714c62cac6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf91b0ff6e9300ead140cc.md
@@ -0,0 +1,290 @@
+---
+id: 63cf91b0ff6e9300ead140cc
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Below the `sport` property, add a new property with a key named `year` and a number value of `1986`.
+
+# --hints--
+
+Your `myFavoriteFootballTeam` object should have a `year` property.
+
+```js
+assert.property(myFavoriteFootballTeam, 'year');
+```
+
+Your `year` property should be a number.
+
+```js
+assert.isNumber(myFavoriteFootballTeam.year);
+```
+
+Your `year` property should be set to `1986`.
+
+```js
+assert.equal(myFavoriteFootballTeam.year, 1986);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+--fcc-editable-region--
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+
+};
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf920228531a0145abd0b3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf920228531a0145abd0b3.md
new file mode 100644
index 00000000000..e2ea93816b4
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf920228531a0145abd0b3.md
@@ -0,0 +1,291 @@
+---
+id: 63cf920228531a0145abd0b3
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Below the `year` property, add a new property with a key named `isWorldCupWinner` and a boolean value set to `true`.
+
+# --hints--
+
+Your `myFavoriteFootballTeam` object should have an `isWorldCupWinner` property.
+
+```js
+assert.property(myFavoriteFootballTeam, 'isWorldCupWinner');
+```
+
+Your `isWorldCupWinner` property should be a boolean.
+
+```js
+assert.isBoolean(myFavoriteFootballTeam.isWorldCupWinner);
+```
+
+Your `isWorldCupWinner` property should be set to `true`.
+
+```js
+assert.equal(myFavoriteFootballTeam.isWorldCupWinner, true);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+--fcc-editable-region--
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+
+};
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf93472de77d01bf8474bf.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf93472de77d01bf8474bf.md
new file mode 100644
index 00000000000..7935b15618b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63cf93472de77d01bf8474bf.md
@@ -0,0 +1,316 @@
+---
+id: 63cf93472de77d01bf8474bf
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Below the `isWorldCupWinner` property, add a new key called `headCoach` with a value of an empty object. Inside that object, add a property with a key of `coachName` and a string value of `Carlos Bilardo`. Below that property, add another key called `matches` with a number value of 7.
+
+# --hints--
+
+Your `myFavoriteFootballTeam` object should have a `headCoach` property.
+
+```js
+assert.property(myFavoriteFootballTeam, 'headCoach');
+```
+
+Your `headCoach` value should be an object.
+
+```js
+assert.isObject(myFavoriteFootballTeam.headCoach)
+```
+
+Your `headCoach` object should have a `coachName` property.
+
+```js
+assert.property(myFavoriteFootballTeam.headCoach, 'coachName');
+```
+
+Your `coachName` property should be set to `Carlos Bilardo`.
+
+```js
+assert.equal(myFavoriteFootballTeam.headCoach.coachName, 'Carlos Bilardo');
+```
+
+Your `headCoach` object should have a `matches` property.
+
+```js
+assert.property(myFavoriteFootballTeam.headCoach, 'matches');
+```
+
+Your `matches` property should be a number.
+
+```js
+assert.isNumber(myFavoriteFootballTeam.headCoach.matches);
+```
+
+Your `matches` property should be set to `7`.
+
+```js
+assert.equal(myFavoriteFootballTeam.headCoach.matches, 7);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+--fcc-editable-region--
+
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d120a05ee93f38353b84c0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d120a05ee93f38353b84c0.md
new file mode 100644
index 00000000000..1acacae44eb
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d120a05ee93f38353b84c0.md
@@ -0,0 +1,296 @@
+---
+id: 63d120a05ee93f38353b84c0
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Below the `headCoach` property, create a new property with a key named `players` with the value of an empty array.
+
+# --hints--
+
+Your `myFavoriteFootballTeam` object should have a `players` property.
+
+```js
+assert.property(myFavoriteFootballTeam, 'players');
+```
+
+Your `players` value should be an array.
+
+```js
+assert.isArray(myFavoriteFootballTeam.players)
+```
+
+Your `players` array should be empty.
+
+```js
+assert.deepEqual(myFavoriteFootballTeam.players, [])
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+--fcc-editable-region--
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+
+--fcc-editable-region--
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d1214a0ac7a9389793269b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d1214a0ac7a9389793269b.md
new file mode 100644
index 00000000000..c5569d06c04
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d1214a0ac7a9389793269b.md
@@ -0,0 +1,369 @@
+---
+id: 63d1214a0ac7a9389793269b
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Inside that `players` array, create a new object with the following properties:
+
+
+```md
+
+name: "Sergio Almirón"
+position: "forward"
+number: 1
+isCaptain: false
+nickname: null
+
+```
+
+# --hints--
+
+Your `myFavoriteFootballTeam.players` array should have the value of an object.
+
+```js
+assert.isObject(myFavoriteFootballTeam.players[0])
+```
+
+Your new object should have a `name` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[0], 'name');
+```
+
+Your `name` property should be set to `Sergio Almirón`.
+
+```js
+assert.equal(myFavoriteFootballTeam.players[0]?.name, 'Sergio Almirón');
+```
+
+Your new object should have a `position` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[0], 'position');
+```
+
+Your `position` property should be set to `forward`.
+
+```js
+assert.equal(myFavoriteFootballTeam.players[0]?.position, 'forward');
+```
+
+Your new object should have a `number` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[0], 'number');
+```
+
+Your `number` property should be a number.
+
+```js
+assert.isNumber(myFavoriteFootballTeam.players[0]?.number);
+```
+
+Your `number` property should be set to `1`.
+
+```js
+assert.equal(myFavoriteFootballTeam.players[0]?.number, 1);
+```
+
+Your new object should have a `isCaptain` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[0], 'isCaptain');
+```
+
+Your `isCaptain` property should be a boolean.
+
+```js
+assert.isBoolean(myFavoriteFootballTeam.players[0]?.isCaptain);
+```
+
+Your `isCaptain` property should be set to `false`.
+
+```js
+assert.equal(myFavoriteFootballTeam.players[0]?.isCaptain, false);
+```
+
+Your new object should have a `nickname` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[0], 'nickname');
+```
+
+Your `nickname` property should be set to `null`.
+
+```js
+assert.isNull(myFavoriteFootballTeam.players[0]?.nickname);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+--fcc-editable-region--
+
+--fcc-editable-region--
+ ]
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d128eaedcc773d2ded2128.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d128eaedcc773d2ded2128.md
new file mode 100644
index 00000000000..7bb2e78b95d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d128eaedcc773d2ded2128.md
@@ -0,0 +1,380 @@
+---
+id: 63d128eaedcc773d2ded2128
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Below that object, create a new object with the following properties:
+
+```md
+name: "Sergio Batista"
+position: "midfielder"
+number: 2
+isCaptain: false
+nickname: null
+```
+
+# --hints--
+
+Your `myFavoriteFootballTeam.players` array should have two values.
+
+```js
+// Have to assert at least, because we pre-populate data in the next step.
+assert.isAtLeast(myFavoriteFootballTeam.players.length, 2);
+```
+
+Your `myFavoriteFootballTeam.players` array should have an object as the second value.
+
+```js
+assert.isObject(myFavoriteFootballTeam.players[1])
+```
+
+Your new object should have a `name` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[1], 'name');
+```
+
+Your `name` property should be set to `Sergio Batista`.
+
+```js
+assert.equal(myFavoriteFootballTeam.players[1]?.name, 'Sergio Batista');
+```
+
+Your new object should have a `position` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[1], 'position');
+```
+
+Your `position` property should be set to `midfielder`.
+
+```js
+assert.equal(myFavoriteFootballTeam.players[1]?.position, 'midfielder');
+```
+
+Your new object should have a `number` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[1], 'number');
+```
+
+Your `number` property should be a number.
+
+```js
+assert.isNumber(myFavoriteFootballTeam.players[1]?.number);
+```
+
+Your `number` property should be set to `2`.
+
+```js
+assert.equal(myFavoriteFootballTeam.players[1]?.number, 2);
+```
+
+Your new object should have a `isCaptain` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[1], 'isCaptain');
+```
+
+Your `isCaptain` property should be a boolean.
+
+```js
+assert.isBoolean(myFavoriteFootballTeam.players[1]?.isCaptain);
+```
+
+Your `isCaptain` property should be set to `false`.
+
+```js
+assert.equal(myFavoriteFootballTeam.players[1]?.isCaptain, false);
+```
+
+Your new object should have a `nickname` property.
+
+```js
+assert.property(myFavoriteFootballTeam.players[1], 'nickname');
+```
+
+Your `nickname` property should be set to `null`.
+
+```js
+assert.isNull(myFavoriteFootballTeam.players[1]?.nickname);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+--fcc-editable-region--
+
+--fcc-editable-region--
+ ]
+};
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d12b9c7aaee43de1ba265d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d12b9c7aaee43de1ba265d.md
new file mode 100644
index 00000000000..e117f81605f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d12b9c7aaee43de1ba265d.md
@@ -0,0 +1,446 @@
+---
+id: 63d12b9c7aaee43de1ba265d
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+The rest of the data for the `myFavoriteFootballTeam.players` array has been filled out for you.
+
+The next step is to ensure that you can't modify this object by adding or removing any properties. We are going to use a method called `Object.freeze(obj)` which will freeze this object and prevent any changes being made to it.
+
+Use the `Object.freeze()` method to freeze the `myFavoriteFootballTeam` object.
+
+
+# --hints--
+
+You should use the `Object.freeze()` method to freeze the `myFavoriteFootballTeam` object.
+
+```js
+assert.isFrozen(myFavoriteFootballTeam);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d12fe2a595263e8f5084f7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d12fe2a595263e8f5084f7.md
new file mode 100644
index 00000000000..6e03cf91edf
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63d12fe2a595263e8f5084f7.md
@@ -0,0 +1,458 @@
+---
+id: 63d12fe2a595263e8f5084f7
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+To check if the `Object.freeze()` method is working, you can try to assign a new value to one of the existing properties.
+
+Below the `Object.freeze(myFavoriteFootballTeam)`, assign the `USA` string to `myFavoriteFootballTeam.team`. Below that, add a `console.log` for `myFavoriteFootballTeam.team`.
+
+When you open up the console, you will see an `Uncaught TypeError` message. This error appears because the `Object.freeze()` method does not allow you to overwrite that value.
+
+# --hints--
+
+You should assign the `USA` string to `myFavoriteFootballTeam.team`.
+
+```js
+
+assert.match(code, /myFavoriteFootballTeam\.team\s*=\s*('|"|`)USA\1\s*/);
+
+```
+
+You should add a `console.log` for `myFavoriteFootballTeam.team`.
+
+```js
+
+assert.match(code, /console\.log\(\s*myFavoriteFootballTeam\.team\s*\)/);
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e02a333354343b595d64ca.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e02a333354343b595d64ca.md
new file mode 100644
index 00000000000..ab1defde71c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e02a333354343b595d64ca.md
@@ -0,0 +1,470 @@
+---
+id: 63e02a333354343b595d64ca
+title: Step 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Now that you have tested the `Object.freeze()` method, you can delete those two lines of code from the last lesson.
+
+The next step is to access the key called `sport` from the `myFavoriteFootballTeam` object and assign it to a new `const` variable called `sport`.
+
+Remember you can use dot notation for this.
+
+# --hints--
+
+You should remove your assignment of the `USA` string to `myFavoriteFootballTeam.team`.
+
+```js
+assert.notMatch(code, /myFavoriteFootballTeam\.team\s*=\s*('|"|`)USA\1\s*/);
+```
+
+You should remove your `console.log` for `myFavoriteFootballTeam.team`.
+
+```js
+assert.notMatch(code, /console\.log\(\s*myFavoriteFootballTeam\.team\s*\)/);
+```
+
+You should use `const` to declare a `sport` variable.
+
+```js
+assert.match(code, /const\s+sport\s*=/);
+```
+
+You should assign the value of the `sport` key from the `myFavoriteFootballTeam` object to the `sport` variable.
+
+```js
+assert.equal(sport, myFavoriteFootballTeam.sport);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+
+
+--fcc-editable-region--
+
+myFavoriteFootballTeam.team = "USA";
+console.log(myFavoriteFootballTeam.team);
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e0334b7a24bd3c96aca4de.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e0334b7a24bd3c96aca4de.md
new file mode 100644
index 00000000000..9815fa204b9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e0334b7a24bd3c96aca4de.md
@@ -0,0 +1,454 @@
+---
+id: 63e0334b7a24bd3c96aca4de
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Below the `sport` variable, access the key called `team` from the `myFavoriteFootballTeam` object and assign it to a new `const` variable called `team`.
+
+# --hints--
+
+You should use `const` to declare a `team` variable.
+
+```js
+assert.match(code, /const\s+team\s*=/);
+```
+
+You should assign the value of the `team` key from the `myFavoriteFootballTeam` object to the `team` variable.
+
+```js
+assert.equal(team, myFavoriteFootballTeam.team);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+
+
+--fcc-editable-region--
+
+const sport = myFavoriteFootballTeam.sport;
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e036373fc9173d284e165a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e036373fc9173d284e165a.md
new file mode 100644
index 00000000000..ce0835fa4d9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e036373fc9173d284e165a.md
@@ -0,0 +1,464 @@
+---
+id: 63e036373fc9173d284e165a
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+In the last two steps, you have been accessing properties from the `myFavoriteFootballTeam` object using dot notation and assigning them to new `const` variables. But in JavaScript, there is an easier way to accomplish the same goal.
+
+The object destructuring syntax allows you to unpack values from arrays and objects:
+
+```js
+const developerObj = {
+ name: "Jessica Wilkins",
+ isDeveloper: true
+};
+
+// Object destructuring
+const { name, isDeveloper } = developerObj;
+```
+
+Rewrite the two lines of code below using the new destructuring syntax. Your answer should be one line of code.
+
+# --hints--
+
+Use object destructuring to access the `sport` and `team` values.
+
+```js
+
+assert.match(code, /const\s*{\s*(sport\s*\,\s*team)|(team\s*\,\s*sport)\s*}\s*=\s*myFavoriteFootballTeam\s*/)
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+
+
+--fcc-editable-region--
+
+const sport = myFavoriteFootballTeam.sport;
+const team = myFavoriteFootballTeam.team;
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e03b86008bbb3e1c3de846.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e03b86008bbb3e1c3de846.md
new file mode 100644
index 00000000000..de3439a814b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e03b86008bbb3e1c3de846.md
@@ -0,0 +1,449 @@
+---
+id: 63e03b86008bbb3e1c3de846
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Next, add the `year` and `players` to your destructuring assignment.
+
+# --hints--
+
+You should add the `year` and `players` values to your destructuring assignment.
+
+```js
+assert.match(code, /const\s*{\s*((sport\s*,\s*team\s*,\s*year\s*,\s*players)|(team\s*,\s*sport\s*,\s*year\s*,\s*players)|(year\s*,\s*sport\s*,\s*team\s*,\s*players)|(sport\s*,\s*year\s*,\s*team\s*,\s*players)|(team\s*,\s*year\s*,\s*sport\s*,\s*players)|(year\s*,\s*team\s*,\s*sport\s*,\s*players)|(year\s*,\s*team\s*,\s*players\s*,\s*sport)|(team\s*,\s*year\s*,\s*players\s*,\s*sport)|(players\s*,\s*year\s*,\s*team\s*,\s*sport)|(year\s*,\s*players\s*,\s*team\s*,\s*sport)|(team\s*,\s*players\s*,\s*year\s*,\s*sport)|(players\s*,\s*team\s*,\s*year\s*,\s*sport)|(players\s*,\s*sport\s*,\s*year\s*,\s*team)|(sport\s*,\s*players\s*,\s*year\s*,\s*team)|(year\s*,\s*players\s*,\s*sport\s*,\s*team)|(players\s*,\s*year\s*,\s*sport\s*,\s*team)|(sport\s*,\s*year\s*,\s*players\s*,\s*team)|(year\s*,\s*sport\s*,\s*players\s*,\s*team)|(team\s*,\s*sport\s*,\s*players\s*,\s*year)|(sport\s*,\s*team\s*,\s*players\s*,\s*year)|(players\s*,\s*team\s*,\s*sport\s*,\s*year)|(team\s*,\s*players\s*,\s*sport\s*,\s*year)|(sport\s*,\s*players\s*,\s*team\s*,\s*year)|(players\s*,\s*sport\s*,\s*team\s*,\s*year))\s*}\s*=\s*myFavoriteFootballTeam\s*/);
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+
+
+--fcc-editable-region--
+
+const { sport, team } = myFavoriteFootballTeam;
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e042661ad2663f0d468740.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e042661ad2663f0d468740.md
new file mode 100644
index 00000000000..95eda5017a7
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e042661ad2663f0d468740.md
@@ -0,0 +1,448 @@
+---
+id: 63e042661ad2663f0d468740
+title: Step 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+Now you need to access the `coachName` value from the `myFavoriteFootballTeam.headCoach` object using the destructuring syntax.
+
+# --hints--
+
+Use object destructuring to access the `coachName` value.
+
+```js
+
+assert.match(code, /const\s*{\s*coachName\s*}\s*=\s*myFavoriteFootballTeam.headCoach\s*/)
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e050bf935ac341b88326d6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e050bf935ac341b88326d6.md
new file mode 100644
index 00000000000..8179fd09158
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e050bf935ac341b88326d6.md
@@ -0,0 +1,453 @@
+---
+id: 63e050bf935ac341b88326d6
+title: Step 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Now you need to start displaying the team's information on the screen.
+
+Below your destructuring assignments, assign the `sport` variable to `typeOfSport.innerHTML`. Remember that the `innerHTML` property sets the HTML for that particular element.
+
+Once you complete that task, you should see the result in the preview window.
+
+# --hints--
+
+You should assign the `sport` variable to `typeOfSport.innerHTML`.
+
+```js
+
+assert.match(code, /typeOfSport.innerHTML\s*=\s*sport\s*/)
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e05557016dfd45ea49152c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e05557016dfd45ea49152c.md
new file mode 100644
index 00000000000..587342d8d66
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e05557016dfd45ea49152c.md
@@ -0,0 +1,451 @@
+---
+id: 63e05557016dfd45ea49152c
+title: Step 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Below `typeOfSport.innerHTML`, assign the `team` variable to `teamName.innerHTML`.
+
+# --hints--
+
+You should assign the `team` variable to `teamName.innerHTML`.
+
+```js
+
+assert.match(code, /teamName.innerHTML\s*=\s*team\s*/)
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e05c00b615bb46ac87273a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e05c00b615bb46ac87273a.md
new file mode 100644
index 00000000000..fd77bba607c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e05c00b615bb46ac87273a.md
@@ -0,0 +1,462 @@
+---
+id: 63e05c00b615bb46ac87273a
+title: Step 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Below `teamName.innerHTML`, assign the `year` variable to `worldCupYear.innerHTML`. Below that, assign the `coachName` variable to `headCoach.innerHTML`.
+
+You should now see all of that information displayed on the screen below `Team stats`.
+
+# --hints--
+
+You should assign the `year` variable to `worldCupYear.innerHTML`.
+
+```js
+
+assert.match(code, /worldCupYear.innerHTML\s*=\s*year\s*/)
+
+```
+
+You should assign the `coachName` variable to `headCoach.innerHTML`.
+
+```js
+
+assert.match(code, /headCoach.innerHTML\s*=\s*coachName\s*/)
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e060df21bca347b2d2b374.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e060df21bca347b2d2b374.md
new file mode 100644
index 00000000000..64e5e01482a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e060df21bca347b2d2b374.md
@@ -0,0 +1,479 @@
+---
+id: 63e060df21bca347b2d2b374
+title: Step 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Now you will start building out the function that will show player cards based on the selections made by the user in the `Filter Teammates` dropdown menu.
+
+Start by creating an empty arrow function called `setPlayerCards`. You do not need to add a parameter because that will be taken care of in the next step.
+
+
+# --hints--
+
+You should use `const` to declare a `setPlayerCards` variable.
+
+```js
+assert.match(code, /const\s+setPlayerCards\s*=/);
+```
+
+Your `setPlayerCards` variable should be a function.
+
+```js
+assert.isFunction(setPlayerCards);
+```
+
+Your `setPlayerCards` function should use arrow syntax.
+
+```js
+assert.match(code, /const\s+setPlayerCards\s*=\s*\(.*\)\s*=>/);
+```
+
+Your `setPlayerCards` function should not take a parameter.
+
+```js
+assert.match(code, /const\s+setPlayerCards\s*=\s*\(\s*\)\s*=>/);
+```
+
+Your `setPlayerCards` function should be empty.
+
+```js
+assert.match(code, /const\s+setPlayerCards\s*=\s*\(\s*\)\s*=>\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e062d6090ebb486a4eda3a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e062d6090ebb486a4eda3a.md
new file mode 100644
index 00000000000..e2fd95b4278
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e062d6090ebb486a4eda3a.md
@@ -0,0 +1,470 @@
+---
+id: 63e062d6090ebb486a4eda3a
+title: Step 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Function parameters can be initialized with default values. If a function is called without an argument, then the default value will be used:
+
+```js
+const greeting = (name = "Anonymous") => {
+ return "Hello " + name;
+}
+
+console.log(greeting("John")); // Hello John
+console.log(greeting()); // Hello Anonymous
+```
+
+Add a new parameter to your `setPlayerCards` function called `arr` and assign it a default value of `players`.
+
+# --hints--
+
+Your `setPlayerCards` function should take an `arr` parameter.
+
+```js
+assert.match(code, /const\s+setPlayerCards\s*=\s*\(\s*arr/);
+```
+
+Your `arr` parameter should have a default value of `players`.
+
+```js
+assert.match(code, /const\s+setPlayerCards\s*=\s*\(\s*arr\s*=\s*players\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+--fcc-editable-region--
+
+const setPlayerCards = () => {};
+
+--fcc-editable-region--
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e949b8327aa2aca2ca8eac.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e949b8327aa2aca2ca8eac.md
new file mode 100644
index 00000000000..c5f10540ae0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e949b8327aa2aca2ca8eac.md
@@ -0,0 +1,478 @@
+---
+id: 63e949b8327aa2aca2ca8eac
+title: Step 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+The next step is to create a new array that will be responsible for adding the player card information to the page.
+
+Inside the `setPlayerCards` function, start by adding the `map` method to `arr` that will take in an empty callback function. Then, use the addition assignment `+=` operator to assign the new array to `playerCards.innerHTML`.
+
+Remember that the `innerHTML` property gets, or in this case, sets the HTML markup for the `playerCards` element.
+
+# --hints--
+
+You should call the `.map()` method on your `arr` parameter.
+
+```js
+assert.match(setPlayerCards.toString(), /arr\.map\(.*\)/);
+```
+
+Your `.map()` method should take an empty callback function.
+
+```js
+assert.match(code, /arr\.map\(\s*\(\s*\)\s*=>\s*\{\s*\}\s*\)/);
+```
+
+You should use the `+=` operator on `playerCards.innerHTML`.
+
+```js
+assert.match(setPlayerCards.toString(), /playerCards\.innerHTML\s*\+=/);
+```
+
+You should assign `arr.map()` to the `playerCards.innerHTML` using the `+=` operator.
+
+```js
+assert.match(code, /playerCards\.innerHTML\s+\+=\s*arr\.map\(\s*\(\s*\)\s*=>\s*\{\s*\}\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e94dae6dcedbad73f2f6ee.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e94dae6dcedbad73f2f6ee.md
new file mode 100644
index 00000000000..10556005822
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e94dae6dcedbad73f2f6ee.md
@@ -0,0 +1,472 @@
+---
+id: 63e94dae6dcedbad73f2f6ee
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+`arr` contains a series of objects that each contain a `name`, `position`, `number`, `isCaptain` and `nickname` property. In order to access each of those properties inside the callback function, you will need to use object destructuring to unpack them into variables.
+
+Here is an example:
+
+```js
+function myExampleFunction({ name, age, job, city }) {
+
+}
+```
+
+Inside the parameter list in the callback function for the `map` method, unpack all 5 object properties from objects in `arr` using object destructuring.
+
+# --hints--
+
+You should unpack all 5 object properties from objects in `arr` using object destructuring.
+
+```js
+
+assert.match(code, /{\s*((name|position|number|isCaptain|nickname)\s*\,\s*(name|position|number|isCaptain|nickname)\s*\,\s*(name|position|number|isCaptain|nickname)\s*\,\s*(name|position|number|isCaptain|nickname)\s*\,\s*(name|position|number|isCaptain|nickname))\s*}\s*/)
+
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(() => {
+
+ })
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e954321b0a77ae4f6d9650.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e954321b0a77ae4f6d9650.md
new file mode 100644
index 00000000000..564fb6bb8e0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e954321b0a77ae4f6d9650.md
@@ -0,0 +1,467 @@
+---
+id: 63e954321b0a77ae4f6d9650
+title: Step 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Inside the body of the callback function, you will need to add template literals ` `` ` which will contain the HTML content for the player cards.
+
+Inside the template literals, add an empty `div` with a class of `player-card`.
+
+# --hints--
+
+You should use template literals to add an empty `div` with a class of `player-card`.
+
+
+```js
+
+assert.match(code, /`\s*\s*<\/div>\s*`\s*/)
+
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(
+ ({ name, position, number, isCaptain, nickname }) => {
+
+ }
+ );
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e95a45dce95baf41dd4f78.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e95a45dce95baf41dd4f78.md
new file mode 100644
index 00000000000..b9c104fb55a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e95a45dce95baf41dd4f78.md
@@ -0,0 +1,475 @@
+---
+id: 63e95a45dce95baf41dd4f78
+title: Step 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Inside the `div`, add an `h2` element which contains the `name` parameter. Since you are working with template literals, you will need to use an embedded expression for the `name` parameter:
+
+```js
+${expression goes here}
+```
+
+# --hints--
+
+You should add an `h2` element with the `name` parameter.
+
+```js
+assert.match(code, /\s*
\s*\${\s*name\s*}\s*<\/h2>\s*/)
+```
+
+Your `h2` should be nested in your `div`.
+
+```js
+assert.match(code, /`\s*\s*
\s*\${\s*name\s*}\s*<\/h2>\s*<\/div>\s*`\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(
+ ({ name, position, number, isCaptain, nickname }) => {
+ `
+
+
+
+ `;
+ }
+ );
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e95e39860dc5b01ebe9be0.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e95e39860dc5b01ebe9be0.md
new file mode 100644
index 00000000000..53646c4fff0
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e95e39860dc5b01ebe9be0.md
@@ -0,0 +1,467 @@
+---
+id: 63e95e39860dc5b01ebe9be0
+title: Step 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+The next step would be to display the word `(Captain)` next to the player if they are listed as a captain for the team.
+
+Right next to the `${name}` expression, add a new embedded expression. Inside that expression, use a ternary operator to check if `isCaptain` is true. If so, return `(Captain)` otherwise return an empty string.
+
+# --hints--
+
+You should use a ternary operator to check if `isCaptain` is true and return `(Captain)` or return an empty string.
+
+```js
+assert.match(code, /\s*\s*\${\s*name\s*}\s*\$\{isCaptain\s*\?\s*('|"|`)\(Captain\)\1\s*:\s*('|"|`)\2\}\s*<\/h2>\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+ Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(
+ ({ name, position, number, isCaptain, nickname }) => {
+ `
+
+
${name}
+
+ `;
+ }
+ );
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9667c881b61b1e338d276.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9667c881b61b1e338d276.md
new file mode 100644
index 00000000000..f41577b8e76
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9667c881b61b1e338d276.md
@@ -0,0 +1,472 @@
+---
+id: 63e9667c881b61b1e338d276
+title: Step 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Below the `h2` element, add a paragraph element with the text `Position:` and an embedded expression that contains the `position` parameter.
+
+# --hints--
+
+You should add a new paragraph element with the text `Position:` followed by the `position` variable.
+
+```js
+assert.match(code, /\s*\s*Position:\s*\${\s*position\s*}\s*<\/p>\s*/)
+```
+
+Your new `p` element should come after the `h2` element.
+
+```js
+assert.match(code, /<\/h2>\s*
\s*Position:\s*\${\s*position\s*}\s*<\/p>\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(
+ ({ name, position, number, isCaptain, nickname }) => {
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
+
+ `;
+ }
+ );
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e96938d2a347b2734a1587.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e96938d2a347b2734a1587.md
new file mode 100644
index 00000000000..edceac6fe11
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e96938d2a347b2734a1587.md
@@ -0,0 +1,472 @@
+---
+id: 63e96938d2a347b2734a1587
+title: Step 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Below the paragraph element, add another paragraph element with the text `Number:` and an embedded expression that contains the `number` parameter.
+
+# --hints--
+
+You should add a new paragraph element with the text `Number:` followed by the `number` variable.
+
+```js
+assert.match(code, /\s*
\s*Number:\s*\${\s*number\s*}\s*<\/p>\s*/)
+```
+
+Your new `p` element should come after your existing `p` element.
+
+```js
+assert.match(code, /<\/h2>\s*
\s*Position:\s*\${\s*position\s*}\s*<\/p>\s*
\s*Number:\s*\${\s*number\s*}\s*<\/p>\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(
+ ({ name, position, number, isCaptain, nickname }) => {
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
+ `;
+ }
+ );
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e96eb94c97b6b31ee50f63.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e96eb94c97b6b31ee50f63.md
new file mode 100644
index 00000000000..4bb4a4f5aa6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e96eb94c97b6b31ee50f63.md
@@ -0,0 +1,473 @@
+---
+id: 63e96eb94c97b6b31ee50f63
+title: Step 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Below your existing paragraph elements, add another paragraph element with the text `Nickname:`.
+
+# --hints--
+
+You should add a new paragraph element with the text `Nickname:`.
+
+```js
+assert.match(code, /\s*
\s*Nickname:\s*<\/p>\s*/)
+```
+
+Your new `p` element should come after the `h2` element.
+
+```js
+assert.match(code, /<\/h2>\s*
\s*Position:\s*\${\s*position\s*}\s*<\/p>\s*
\s*Number:\s*\${\s*number\s*}\s*<\/p>\s*
\s*Nickname:\s*<\/p>\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(
+ ({ name, position, number, isCaptain, nickname }) => {
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
+ `;
+ }
+ );
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9718d7d490bb3940d5a0a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9718d7d490bb3940d5a0a.md
new file mode 100644
index 00000000000..46379d93380
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9718d7d490bb3940d5a0a.md
@@ -0,0 +1,482 @@
+---
+id: 63e9718d7d490bb3940d5a0a
+title: Step 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Next to the `Nickname:` text, add an embedded expression that will show the player's nickname if they have one.
+
+Use a ternary operator to check if `nickname` is not `null`. If the player has a nickname, display `nickname` otherwise display `"N/A"`.
+
+# --hints--
+
+You should use a ternary operator to check if `nickname` is not `null`.
+
+```js
+assert.match(code, /\s*
\s*Nickname:\s*\$\{\s*nickname\s*!==\s*null\s*\?/)
+```
+
+If your ternary is truthy, it should display the player's `nickname`.
+
+```js
+assert.match(code, /\s*
\s*Nickname:\s*\$\{\s*nickname\s*!==\s*null\s*\?\s*nickname\s*:/)
+```
+
+If your ternary is falsy, it should display the string `N/A`.
+
+```js
+assert.match(code, /\s*
\s*Nickname:\s*\$\{\s*nickname\s*!==\s*null\s*\?\s*nickname\s*:\s*('|"|`)\N\/A\1}\s*<\/p>\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(
+ ({ name, position, number, isCaptain, nickname }) => {
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname:
+
+ `;
+ }
+ );
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9737f686c76b4078a60f4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9737f686c76b4078a60f4.md
new file mode 100644
index 00000000000..b4b4d23626a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63e9737f686c76b4078a60f4.md
@@ -0,0 +1,477 @@
+---
+id: 63e9737f686c76b4078a60f4
+title: Step 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+The `.map()` method will return a new array of `player-card` items separated by commas.
+
+To remove the commas between each `player-card` so it does not show up on screen, chain the `.join()` method to the `.map()` method. Pass an empty string as the argument for the `.join()` method.
+
+
+# --hints--
+
+You should chain the `.join()` method to the `.map()` method.
+
+```js
+assert.match(code, /arr\s*\.map\(.*\)\s*\.join\(/s);
+```
+
+You should pass an empty string to the `.join()` method.
+
+```js
+assert.match(code, /arr\s*\.map\(.*\)\s*\.join\(\s*('|"|`)\1\s*\)/s);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+
+--fcc-editable-region--
+
+ playerCards.innerHTML += arr.map(
+ ({ name, position, number, isCaptain, nickname }) => {
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `;
+ }
+ )
+
+--fcc-editable-region--
+
+};
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f28972973504e7bb58b0b3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f28972973504e7bb58b0b3.md
new file mode 100644
index 00000000000..e5c273332f2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f28972973504e7bb58b0b3.md
@@ -0,0 +1,485 @@
+---
+id: 63f28972973504e7bb58b0b3
+title: Step 36
+challengeType: 0
+dashedName: step-36
+---
+
+# --description--
+
+The next step is to create a function that will detect when a user makes a selection from the `playersDropdownList`.
+
+Use the `.addEventListener()` method on `playersDropdownList`. Inside the event listener, pass in a `change` event type and an empty callback function.
+
+# --hints--
+
+You should call the `.addEventListener()` method on the `playersDropdownList` variable.
+
+```js
+assert.match(code, /playersDropdownList\.addEventListener\(/);
+```
+
+Your event listener should listen for the `change` event.
+
+```js
+assert.match(code, /playersDropdownList\.addEventListener\(\s*('|"|`)change\1/);
+```
+
+Your event listener should have an empty callback function.
+
+```js
+assert.match(code, /playersDropdownList\.addEventListener\(\s*('|"|`)change\1\s*,\s*\(\s*\)\s*=>\s*\{\s*\}\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f28ef082d771e8bf71f94a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f28ef082d771e8bf71f94a.md
new file mode 100644
index 00000000000..8aeee3d3efa
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f28ef082d771e8bf71f94a.md
@@ -0,0 +1,475 @@
+---
+id: 63f28ef082d771e8bf71f94a
+title: Step 37
+challengeType: 0
+dashedName: step-37
+---
+
+# --description--
+
+For the callback function, pass in `e` as a parameter.
+
+`e` represents an object which contains the information for that event.
+
+# --hints--
+
+You should pass in `e` as a parameter to your callback function.
+
+```js
+assert.match(code, /playersDropdownList\.addEventListener\(\s*('|"|`)change\1\s*,\s*\(\s*e\s*\)\s*=>\s*\{\s*\}\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+--fcc-editable-region--
+
+playersDropdownList.addEventListener("change", () => {
+
+});
+
+--fcc-editable-region--
+
+
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f293c804d6f9e9a83ca4c5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f293c804d6f9e9a83ca4c5.md
new file mode 100644
index 00000000000..f8bad487511
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f293c804d6f9e9a83ca4c5.md
@@ -0,0 +1,477 @@
+---
+id: 63f293c804d6f9e9a83ca4c5
+title: Step 38
+challengeType: 0
+dashedName: step-38
+---
+
+# --description--
+
+Inside the callback function, add a `console.log` with the value of `e.target.value`.
+
+Open the console, and make a selection from the teammates dropdown menu. You should see the value of that selection in the console.
+
+`e.target.value` represents the value property from the `playersDropdownList` element. In future steps, you will use this value to show player cards based on the position they play.
+
+# --hints--
+
+You should add a `console.log` with the value of `e.target.value`.
+
+```js
+assert.match(code, /console.log\s*\(e.target.value\)\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f29804e3ec00ea6fab1ec4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f29804e3ec00ea6fab1ec4.md
new file mode 100644
index 00000000000..a15fd647b37
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f29804e3ec00ea6fab1ec4.md
@@ -0,0 +1,489 @@
+---
+id: 63f29804e3ec00ea6fab1ec4
+title: Step 39
+challengeType: 0
+dashedName: step-39
+---
+
+# --description--
+
+Remove the `console.log` statement you created in the previous step.
+
+The next step would be to reset the content for the `playerCards` element.
+
+Inside the callback function, access the `innerHTML` property of the `playerCards` element and assign it a value of an empty string.
+
+# --hints--
+
+You should not have the `console.log` statement in your code.
+
+```js
+assert.notMatch(code, /\s*console.log\(e.target.value\)/);
+```
+
+You should access the `innerHTML` property of the `playerCards` element.
+
+```js
+assert.match(code, /playerCards\.innerHTML\s*=/);
+```
+
+You should set the `innerHTML` property to an empty string.
+
+```js
+assert.match(code, /\s*playerCards.innerHTML\s*=\s*('|"|`)\1/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+
+--fcc-editable-region--
+
+console.log(e.target.value)
+
+--fcc-editable-region--
+
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f29ce62aea65eb041758c8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f29ce62aea65eb041758c8.md
new file mode 100644
index 00000000000..608d5c6243c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f29ce62aea65eb041758c8.md
@@ -0,0 +1,504 @@
+---
+id: 63f29ce62aea65eb041758c8
+title: Step 40
+challengeType: 0
+dashedName: step-40
+---
+
+# --description--
+
+The next step would be to add a `switch` statement which will check for the user's selection from the player dropdown menu and filter out cards based on the player's positions.
+
+A `switch` statement is a control-flow statement that tests the value of an expression against multiple `case` clauses, and can include an optional `default` clause.
+
+This is the basic syntax for a `switch` statement:
+
+```js
+switch (expression) {
+ case 1:
+ console.log("1");
+ break;
+ default:
+ console.log("Not 1");
+}
+```
+
+In this example, the first `case` checks if `expression === 1`, and if so logs `1` to the console. If no cases are true, it will log `Not 1` to the console. The `break` statement stops execution of the `switch` when the `case` is true.
+
+Add a `switch` statement and use `e.target.value` for the expression.
+
+# --hints--
+
+You should use a `switch` statement.
+
+```js
+assert.match(code, /switch/);
+```
+
+Your `switch` statement should use `e.target.value` for the expression.
+
+```js
+assert.match(code, /switch\s*\(\s*e\.target\.value\s*\)/);
+```
+
+Your `switch` statement should be empty.
+
+```js
+assert.match(code, /\s*switch\s*\(e\.target\.value\)\s*{\s*}/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a0a860790eebe61bf908.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a0a860790eebe61bf908.md
new file mode 100644
index 00000000000..ccb59e70221
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a0a860790eebe61bf908.md
@@ -0,0 +1,478 @@
+---
+id: 63f2a0a860790eebe61bf908
+title: Step 41
+challengeType: 0
+dashedName: step-41
+---
+
+# --description--
+
+If the user selects `Nicknames` from the dropdown menu you will want to filter out player cards that have a nickname.
+
+Start by adding a `case` clause for `nickname` inside your `switch` statement.
+
+# --hints--
+
+You should add a new `case` clause for `nickname` inside your `switch` statement.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*nickname\s*\1\s*:\s*/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+
+--fcc-editable-region--
+
+ switch (e.target.value) {
+
+ }
+
+--fcc-editable-region--
+
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a4a8087e6dec8ec47f16.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a4a8087e6dec8ec47f16.md
new file mode 100644
index 00000000000..cabfe408ca5
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a4a8087e6dec8ec47f16.md
@@ -0,0 +1,521 @@
+---
+id: 63f2a4a8087e6dec8ec47f16
+title: Step 44
+challengeType: 0
+dashedName: step-44
+---
+
+# --description--
+
+Next, add a `case` clause for `forward`.
+
+Inside that `case`, call the `setPlayerCards` function with an argument of `players.filter()`.
+
+Inside the `filter()` method, add a callback function with a parameter of `player` that will check if `player.position` equals `forward`.
+
+Lastly, add a `break` statement below the `setPlayerCards` function call.
+
+# --hints--
+
+You should add a new `case` for `forward` inside your `switch` statement.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*forward\s*\1\s*:\s*/)
+```
+
+In your `forward` `case`, you should call the `setPlayerCards` function.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*forward\s*\1\s*:\s*setPlayerCards\(/)
+```
+
+You should pass `players.filter()` to your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*forward\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(/)
+```
+
+You should pass an arrow callback function to your `players.filter()` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*forward\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?.*\)?\s*=>/);
+```
+
+Your `filter()` callback should take a `player` parameter.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*forward\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>/)
+```
+
+Your `filter()` callback should implicitly return the result of checking if `player.position` is `forward`.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*forward\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.position\s*===?\s*('|"|`)forward\2\s*\)/)
+```
+
+You will need to add a `break` statement below your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*forward\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.position\s*===?\s*('|"|`)forward\2\s*\)\s*\);?\s*break/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+
+ switch (e.target.value) {
+ case "nickname":
+ setPlayerCards(players.filter((player) => player.nickname !== null));
+ break;
+
+--fcc-editable-region--
+
+
+
+--fcc-editable-region--
+ }
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a5f09a785aed155c0a56.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a5f09a785aed155c0a56.md
new file mode 100644
index 00000000000..fbf9f1cb1b8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a5f09a785aed155c0a56.md
@@ -0,0 +1,517 @@
+---
+id: 63f2a5f09a785aed155c0a56
+title: Step 45
+challengeType: 0
+dashedName: step-45
+---
+
+# --description--
+
+Add a new `case` for `midfielder` that checks if `player.position` equals `midfielder` following the same pattern from the previous step.
+
+# --hints--
+
+You should add a new `case` for `midfielder` inside your `switch` statement.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*midfielder\s*\1\s*:\s*/)
+```
+
+In your `midfielder` `case`, you should call the `setPlayerCards` function.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*midfielder\s*\1\s*:\s*setPlayerCards\(/)
+```
+
+You should pass `players.filter()` to your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*midfielder\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(/)
+```
+
+You should pass an arrow callback function to your `players.filter()` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*midfielder\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?.*\)?\s*=>/);
+```
+
+Your `filter()` callback should take a `player` parameter.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*midfielder\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>/)
+```
+
+Your `filter()` callback should implicitly return the result of checking if `player.position` is `midfielder`.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*midfielder\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.position\s*===?\s*('|"|`)midfielder\2\s*\)/)
+```
+
+You will need to add a `break` statement below your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*midfielder\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.position\s*===?\s*('|"|`)midfielder\2\s*\)\s*\);?\s*break/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+
+ switch (e.target.value) {
+ case "nickname":
+ setPlayerCards(players.filter((player) => player.nickname !== null));
+ break;
+ case "forward":
+ setPlayerCards(players.filter((player) => player.position === "forward"));
+ break;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+ }
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a8e14fb388edd3242527.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a8e14fb388edd3242527.md
new file mode 100644
index 00000000000..8666f5ab42e
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2a8e14fb388edd3242527.md
@@ -0,0 +1,521 @@
+---
+id: 63f2a8e14fb388edd3242527
+title: Step 46
+challengeType: 0
+dashedName: step-46
+---
+
+# --description--
+
+Add a new `case` for `defender` that checks if `player.position` equals `defender` following the same pattern as the previous step.
+
+# --hints--
+
+You should add a new `case` for `defender` inside your `switch` statement.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*defender\s*\1\s*:\s*/)
+```
+
+In your `defender` `case`, you should call the `setPlayerCards` function.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*defender\s*\1\s*:\s*setPlayerCards\(/)
+```
+
+You should pass `players.filter()` to your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*defender\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(/)
+```
+
+You should pass an arrow callback function to your `players.filter()` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*defender\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?.*\)?\s*=>/);
+```
+
+Your `filter()` callback should take a `player` parameter.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*defender\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>/)
+```
+
+Your `filter()` callback should implicitly return the result of checking if `player.position` is `defender`.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*defender\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.position\s*===?\s*('|"|`)defender\2\s*\)/)
+```
+
+You will need to add a `break` statement below your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*defender\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.position\s*===?\s*('|"|`)defender\2\s*\)\s*\);?\s*break/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+
+ switch (e.target.value) {
+ case "nickname":
+ setPlayerCards(players.filter((player) => player.nickname !== null));
+ break;
+ case "forward":
+ setPlayerCards(players.filter((player) => player.position === "forward"));
+ break;
+ case "midfielder":
+ setPlayerCards(players.filter((player) => player.position === "midfielder"));
+ break;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+ }
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2aa36fcdc63ee4e18fc37.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2aa36fcdc63ee4e18fc37.md
new file mode 100644
index 00000000000..c41768c86d6
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2aa36fcdc63ee4e18fc37.md
@@ -0,0 +1,527 @@
+---
+id: 63f2aa36fcdc63ee4e18fc37
+title: Step 47
+challengeType: 0
+dashedName: step-47
+---
+
+# --description--
+
+Add a new `case` for `goalkeeper` that checks if `player.position` equals `goalkeeper` following the same pattern as the previous step.
+
+# --hints--
+
+You should add a new `case` for `goalkeeper` inside your `switch` statement.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*goalkeeper\s*\1\s*:\s*/)
+```
+
+In your `goalkeeper` `case`, you should call the `setPlayerCards` function.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*goalkeeper\s*\1\s*:\s*setPlayerCards\(/)
+```
+
+You should pass `players.filter()` to your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*goalkeeper\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(/)
+```
+
+You should pass an arrow callback function to your `players.filter()` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*goalkeeper\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?.*\)?\s*=>/);
+```
+
+Your `filter()` callback should take a `player` parameter.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*goalkeeper\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>/)
+```
+
+Your `filter()` callback should implicitly return the result of checking if `player.position` is `goalkeeper`.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*goalkeeper\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.position\s*===?\s*('|"|`)goalkeeper\2\s*\)/)
+```
+
+You will need to add a `break` statement below your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*goalkeeper\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.position\s*===?\s*('|"|`)goalkeeper\2\s*\)\s*\);?\s*break/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+ switch (e.target.value) {
+ case "nickname":
+ setPlayerCards(players.filter((player) => player.nickname !== null));
+ break;
+ case "forward":
+ setPlayerCards(players.filter((player) => player.position === "forward"));
+ break;
+ case "midfielder":
+ setPlayerCards(
+ players.filter((player) => player.position === "midfielder")
+ );
+ break;
+ case "defender":
+ setPlayerCards(
+ players.filter((player) => player.position === "defender")
+ );
+ break;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+
+ }
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2ab4f6c52c5eec6d68de4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2ab4f6c52c5eec6d68de4.md
new file mode 100644
index 00000000000..6c919ef5e37
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/63f2ab4f6c52c5eec6d68de4.md
@@ -0,0 +1,790 @@
+---
+id: 63f2ab4f6c52c5eec6d68de4
+title: Step 48
+challengeType: 0
+dashedName: step-48
+---
+
+# --description--
+
+The final step is to add a `default` clause if none of the other `case` clauses match the user selection.
+
+For the `default` clause, call the `setPlayerCards` function without any arguments passed in.
+
+Test out your dropdown menu, and you should see the player cards be filtered out by position or nickname.
+
+Congratulations on completing the football team cards project!
+
+# --hints--
+
+You should add a `default` clause to your `switch` statement.
+
+```js
+assert.match(code, /default\s*:\s*/)
+```
+
+In your `default` clause, you should call the `setPlayerCards` function without any arguments passed in.
+
+```js
+assert.match(code, /default\s*:\s*setPlayerCards\(\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+
+ switch (e.target.value) {
+ case "nickname":
+ setPlayerCards(players.filter((player) => player.nickname !== null));
+ break;
+ case "forward":
+ setPlayerCards(players.filter((player) => player.position === "forward"));
+ break;
+ case "midfielder":
+ setPlayerCards(
+ players.filter((player) => player.position === "midfielder")
+ );
+ break;
+ case "defender":
+ setPlayerCards(
+ players.filter((player) => player.position === "defender")
+ );
+ break;
+ case "goalkeeper":
+ setPlayerCards(
+ players.filter((player) => player.position === "goalkeeper")
+ );
+ break;
+
+--fcc-editable-region--
+
+
+--fcc-editable-region--
+ }
+});
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js const teamName = document.getElementById("team"); const typeOfSport = document.getElementById("sport"); const worldCupYear = document.getElementById("year"); const headCoach = document.getElementById("head-coach"); const playerCards = document.getElementById("player-cards"); const playersDropdownList = document.getElementById("players"); const myFavoriteFootballTeam = { team: "Argentina", sport: "Football", year: 1986, isWorldCupWinner: true, headCoach: { coachName: "Carlos Bilardo", matches: 7, }, players: [
+ { name: "Sergio Almirón", position: "forward", number: 1, isCaptain: false, nickname: null, },
+ { name: "Sergio Batista", position: "midfielder", number: 2, isCaptain: false, nickname: null, },
+ { name: "Ricardo Bochini", position: "midfielder", number: 3, isCaptain: false, nickname: "El Bocha", },
+ { name: "Claudio Borghi", position: "midfielder", number: 4, isCaptain: false, nickname: "Bichi", },
+ { name: "José Luis Brown", position: "defender", number: 5, isCaptain: false, nickname: "Tata", },
+ { name: "Daniel Passarella", position: "defender", number: 6, isCaptain: false, nickname: "El Gran Capitán", },
+ { name: "Jorge Burruchaga", position: "forward", number: 7, isCaptain: false, nickname: "Burru", },
+ { name: "Néstor Clausen", position: "defender", number: 8, isCaptain: false, nickname: null, },
+ { name: "José Luis Cuciuffo", position: "defender", number: 9, isCaptain: false, nickname: "El Cuchu", },
+ { name: "Diego Maradona", position: "midfielder", number: 10, isCaptain: true, nickname: "El Pibe de Oro", },
+ { name: "Jorge Valdano", position: "forward", number: 11, isCaptain: false, nickname: "The Philosopher of Football", },
+ { name: "Héctor Enrique", position: "midfielder", number: 12, isCaptain: false, nickname: null, },
+ { name: "Oscar Garré", position: "defender", number: 13, isCaptain: false, nickname: null, },
+ { name: "Ricardo Giusti", position: "midfielder", number: 14, isCaptain: false, nickname: null, },
+ { name: "Luis Islas", position: "goalkeeper", number: 15, isCaptain: false, nickname: "El loco", },
+ { name: "Julio Olarticoechea", position: "defender", number: 16, isCaptain: false, nickname: null, },
+ { name: "Pedro Pasculli", position: "forward", number: 17, isCaptain: false, nickname: null, },
+ { name: "Nery Pumpido", position: "goalkeeper", number: 18, isCaptain: false, nickname: null, },
+ { name: "Oscar Ruggeri", position: "defender", number: 19, isCaptain: false, nickname: "El Cabezón", },
+ { name: "Carlos Tapia", position: "midfielder", number: 20, isCaptain: false, nickname: null, },
+ { name: "Marcelo Trobbiani", position: "midfielder", number: 21, isCaptain: false, nickname: "Calesita", },
+ { name: "Héctor Zelada", position: "goalkeeper", number: 22, isCaptain: false, nickname: null, }, ], };
+
+Object.freeze(myFavoriteFootballTeam); const { sport, team, year, players } = myFavoriteFootballTeam; const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport; teamName.innerHTML = team; worldCupYear.innerHTML = year; headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => { playerCards.innerHTML += arr .map( ({ name, position, number, isCaptain, nickname }) => `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
` ) .join(""); };
+
+playersDropdownList.addEventListener("change", (e) => { playerCards.innerHTML = "";
+
+ switch (e.target.value) { case "nickname": setPlayerCards(players.filter((player) => player.nickname !== null)); break; case "forward": setPlayerCards(players.filter((player) => player.position === "forward")); break; case "midfielder": setPlayerCards( players.filter((player) => player.position === "midfielder") ); break; case "defender": setPlayerCards( players.filter((player) => player.position === "defender") ); break; case "goalkeeper": setPlayerCards( players.filter((player) => player.position === "goalkeeper") ); break; default: setPlayerCards(); } });
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/641fc88d8fa7127f76e0324f.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/641fc88d8fa7127f76e0324f.md
new file mode 100644
index 00000000000..03ddbef793f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/641fc88d8fa7127f76e0324f.md
@@ -0,0 +1,504 @@
+---
+id: 641fc88d8fa7127f76e0324f
+title: Step 42
+challengeType: 0
+dashedName: step-42
+---
+
+# --description--
+
+
+Call the `setPlayerCards` function with an argument of `players.filter()`.
+
+Inside the `filter` method, add a callback function with a parameter called `player` and implicitly return `player.nickname` is not `null`.
+
+# --hints--
+
+In your `nickname` case, you should call the `setPlayerCards` function.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*nickname\s*\1\s*:\s*setPlayerCards\(/)
+```
+
+You should pass `players.filter()` to your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*nickname\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(/)
+```
+
+You should pass an arrow callback function to your `players.filter()` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*nickname\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?.*\)?\s*=>/);
+```
+
+Your `filter()` callback should take a `player` parameter.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*nickname\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>/)
+```
+
+Your `filter()` callback should implicitly return the result of checking if `player.nickname` is not `null`.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*nickname\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.nickname\s*!==\s*null\s*\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+
+--fcc-editable-region--
+
+ switch (e.target.value) {
+ case "nickname":
+
+ }
+
+--fcc-editable-region--
+
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/641fcfd468185384ac218b7d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/641fcfd468185384ac218b7d.md
new file mode 100644
index 00000000000..37793932394
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-modern-javascript-methods-by-building-football-team-cards/641fcfd468185384ac218b7d.md
@@ -0,0 +1,488 @@
+---
+id: 641fcfd468185384ac218b7d
+title: Step 43
+challengeType: 0
+dashedName: step-43
+---
+
+# --description--
+
+Before you can move onto the next `case`, you will need to add a `break` statement:
+
+```js
+ case "example":
+ console.log("example");
+ break;
+```
+
+The `break` statement breaks out of the `switch` statement early, usually after executing some code after a `case` clause matches the expression. If a `break` statement is not present, execution will continue through the rest of the causes in the `switch` statement.
+
+Below your `setPlayerCards` call, add a `break` statement.
+
+# --hints--
+
+You will need to add a `break` statement below your `setPlayerCards` call.
+
+```js
+assert.match(code, /\s*case\s*('|"|`)\s*nickname\s*\1\s*:\s*setPlayerCards\(\s*players\.filter\(\s*\(?\s*player\s*\)?\s*=>\s*player\.nickname\s*!==\s*null\s*\)\s*\);?\s*break/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+
+ Learn Modern JavaScript methods by building football team cards
+
+
+
+
+
Team stats
+
+
+
Team:
+
Sport:
+
Year:
+
Head coach:
+
+ Filter Teammates:
+
+ All Players
+ Nicknames
+ Position Forward
+ Position Midfielder
+ Position Defender
+ Position Goalkeeper
+
+
+
+
Sergio Almirón
+
Position: forward
+
Number: 1
+
Nickname: N/A
+
+
+
Sergio Batista
+
Position: midfielder
+
Number: 2
+
Nickname: N/A
+
+
+
Ricardo Bochini
+
Position: midfielder
+
Number: 3
+
Nickname: El Bocha
+
+
+
Claudio Borghi
+
Position: midfielder
+
Number: 4
+
Nickname: Bichi
+
+
+
José Luis Brown
+
Position: defender
+
Number: 5
+
Nickname: Tata
+
+
+
Daniel Passarella
+
Position: defender
+
Number: 6
+
Nickname: El Gran Capitán
+
+
+
Jorge Burruchaga
+
Position: forward
+
Number: 7
+
Nickname: Burru
+
+
+
Néstor Clausen
+
Position: defender
+
Number: 8
+
Nickname: N/A
+
+
+
José Luis Cuciuffo
+
Position: defender
+
Number: 9
+
Nickname: El Cuchu
+
+
+
(Captain) Diego Maradona
+
Position: midfielder
+
Number: 10
+
Nickname: El Pibe de Oro
+
+
+
Jorge Valdano
+
Position: forward
+
Number: 11
+
Nickname: The Philosopher of Football
+
+
+
Héctor Enrique
+
Position: midfielder
+
Number: 12
+
Nickname: N/A
+
+
+
Oscar Garré
+
Position: defender
+
Number: 13
+
Nickname: N/A
+
+
+
Ricardo Giusti
+
Position: midfielder
+
Number: 14
+
Nickname: N/A
+
+
+
Luis Islas
+
Position: goalkeeper
+
Number: 15
+
Nickname: El loco
+
+
+
Julio Olarticoechea
+
Position: defender
+
Number: 16
+
Nickname: N/A
+
+
+
Pedro Pasculli
+
Position: forward
+
Number: 17
+
Nickname: N/A
+
+
+
Nery Pumpido
+
Position: goalkeeper
+
Number: 18
+
Nickname: N/A
+
+
+
Oscar Ruggeri
+
Position: defender
+
Number: 19
+
Nickname: El Cabezón
+
+
+
Carlos Tapia
+
Position: midfielder
+
Number: 20
+
Nickname: N/A
+
+
+
Marcelo Trobbiani
+
Position: midfielder
+
Number: 21
+
Nickname: Calesita
+
+
+
Héctor Zelada
+
Position: goalkeeper
+
Number: 22
+
Nickname: N/A
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #0a0a23;
+ --light-grey: #f5f6f7;
+ --white: #ffffff;
+ --black: #000;
+}
+
+body {
+ background-color: var(--dark-grey);
+ text-align: center;
+ padding: 10px;
+}
+
+.title,
+.options-label,
+.team-stats,
+footer {
+ color: var(--white);
+}
+
+.title {
+ margin: 1.3rem 0;
+}
+
+.team-stats {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ font-size: 1.3rem;
+ margin: 1.2rem 0;
+}
+
+.options-label {
+ font-size: 1.2rem;
+}
+
+.cards {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+}
+
+.player-card {
+ background-color: var(--light-grey);
+ padding: 1.3rem;
+ margin: 1.2rem;
+ width: 300px;
+ border-radius: 15px;
+}
+
+@media (max-width: 768px) {
+ .team-stats {
+ flex-direction: column;
+ }
+}
+
+```
+
+```js
+const teamName = document.getElementById("team");
+const typeOfSport = document.getElementById("sport");
+const worldCupYear = document.getElementById("year");
+const headCoach = document.getElementById("head-coach");
+const playerCards = document.getElementById("player-cards");
+const playersDropdownList = document.getElementById("players");
+const myFavoriteFootballTeam = {
+ team: "Argentina",
+ sport: "Football",
+ year: 1986,
+ isWorldCupWinner: true,
+ headCoach: {
+ coachName: "Carlos Bilardo",
+ matches: 7,
+ },
+ players: [
+ {
+ name: "Sergio Almirón",
+ position: "forward",
+ number: 1,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Sergio Batista",
+ position: "midfielder",
+ number: 2,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Bochini",
+ position: "midfielder",
+ number: 3,
+ isCaptain: false,
+ nickname: "El Bocha",
+ },
+ {
+ name: "Claudio Borghi",
+ position: "midfielder",
+ number: 4,
+ isCaptain: false,
+ nickname: "Bichi",
+ },
+ {
+ name: "José Luis Brown",
+ position: "defender",
+ number: 5,
+ isCaptain: false,
+ nickname: "Tata",
+ },
+ {
+ name: "Daniel Passarella",
+ position: "defender",
+ number: 6,
+ isCaptain: false,
+ nickname: "El Gran Capitán",
+ },
+ {
+ name: "Jorge Burruchaga",
+ position: "forward",
+ number: 7,
+ isCaptain: false,
+ nickname: "Burru",
+ },
+ {
+ name: "Néstor Clausen",
+ position: "defender",
+ number: 8,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "José Luis Cuciuffo",
+ position: "defender",
+ number: 9,
+ isCaptain: false,
+ nickname: "El Cuchu",
+ },
+ {
+ name: "Diego Maradona",
+ position: "midfielder",
+ number: 10,
+ isCaptain: true,
+ nickname: "El Pibe de Oro",
+ },
+ {
+ name: "Jorge Valdano",
+ position: "forward",
+ number: 11,
+ isCaptain: false,
+ nickname: "The Philosopher of Football",
+ },
+ {
+ name: "Héctor Enrique",
+ position: "midfielder",
+ number: 12,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Garré",
+ position: "defender",
+ number: 13,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Ricardo Giusti",
+ position: "midfielder",
+ number: 14,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Luis Islas",
+ position: "goalkeeper",
+ number: 15,
+ isCaptain: false,
+ nickname: "El loco",
+ },
+ {
+ name: "Julio Olarticoechea",
+ position: "defender",
+ number: 16,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Pedro Pasculli",
+ position: "forward",
+ number: 17,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Nery Pumpido",
+ position: "goalkeeper",
+ number: 18,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Oscar Ruggeri",
+ position: "defender",
+ number: 19,
+ isCaptain: false,
+ nickname: "El Cabezón",
+ },
+ {
+ name: "Carlos Tapia",
+ position: "midfielder",
+ number: 20,
+ isCaptain: false,
+ nickname: null,
+ },
+ {
+ name: "Marcelo Trobbiani",
+ position: "midfielder",
+ number: 21,
+ isCaptain: false,
+ nickname: "Calesita",
+ },
+ {
+ name: "Héctor Zelada",
+ position: "goalkeeper",
+ number: 22,
+ isCaptain: false,
+ nickname: null,
+ },
+ ],
+};
+
+Object.freeze(myFavoriteFootballTeam);
+const { sport, team, year, players } = myFavoriteFootballTeam;
+const { coachName } = myFavoriteFootballTeam.headCoach;
+
+typeOfSport.innerHTML = sport;
+teamName.innerHTML = team;
+worldCupYear.innerHTML = year;
+headCoach.innerHTML = coachName;
+
+const setPlayerCards = (arr = players) => {
+ playerCards.innerHTML += arr
+ .map(
+ ({ name, position, number, isCaptain, nickname }) =>
+ `
+
+
${name} ${isCaptain ? "(Captain)" : ""}
+
Position: ${position}
+
Number: ${number}
+
Nickname: ${nickname !== null ? nickname : "N/A"}
+
+ `
+ )
+ .join("");
+};
+
+playersDropdownList.addEventListener("change", (e) => {
+ playerCards.innerHTML = "";
+
+--fcc-editable-region--
+
+ switch (e.target.value) {
+ case "nickname":
+ setPlayerCards(players.filter((player) => player.nickname !== null));
+
+ }
+
+--fcc-editable-region--
+
+});
+
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cd18eb67c661d8a9e11f3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cd18eb67c661d8a9e11f3.md
new file mode 100644
index 00000000000..9afdde2368a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cd18eb67c661d8a9e11f3.md
@@ -0,0 +1,182 @@
+---
+id: 641cd18eb67c661d8a9e11f3
+title: Step 1
+challengeType: 0
+dashedName: step-1
+---
+
+# --description--
+
+To begin the project, use the `.getElementById()` method to retrieve the `#message-input`, `#result`, and `#check-message-btn` elements from the HTML document, and assign them to the variables `messageInput`, `result`, and `checkMessageButton`, respectively.
+
+# --hints--
+
+You should use `const` to declare a `messageInput` variable.
+
+```js
+assert.match(code, /const\s+messageInput\s*=/);
+```
+
+Your `messageInput` variable should have the value of `document.getElementById('message-input')`.
+
+```js
+assert.deepEqual(messageInput, document.getElementById('message-input'));
+```
+
+You should use `const` to declare a `result` variable.
+
+```js
+assert.match(code, /const\s+result\s*=/);
+```
+
+Your `result` variable should have the value of `document.getElementById('result')`.
+
+```js
+assert.deepEqual(result, document.getElementById('result'));
+```
+
+You should use `const` to declare a `checkMessageButton` variable.
+
+```js
+assert.match(code, /const\s+checkMessageButton\s*=/);
+```
+
+Your `checkMessageButton` variable should have the value of `document.getElementById('check-message-btn')`.
+
+```js
+assert.deepEqual(checkMessageButton, document.getElementById('check-message-btn'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cd91d28bebe226f765d86.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cd91d28bebe226f765d86.md
new file mode 100644
index 00000000000..fe80d09027d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cd91d28bebe226f765d86.md
@@ -0,0 +1,168 @@
+---
+id: 641cd91d28bebe226f765d86
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Attach an event listener to your `checkMessageButton`, listening for the `click` event. Give it an empty callback function.
+
+# --hints--
+
+You should call `.addEventListener()` on your `checkMessageButton` element.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(/);
+```
+
+Your `.addEventListener()` method should have a `click` event type.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,/);
+```
+
+Your `.addEventListener()` method should have an empty callback function.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*\}\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdebe67ec0f25a4798356.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdebe67ec0f25a4798356.md
new file mode 100644
index 00000000000..e030b927fe8
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdebe67ec0f25a4798356.md
@@ -0,0 +1,178 @@
+---
+id: 641cdebe67ec0f25a4798356
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+If the `messageInput` is empty, display an alert to the user with the message `Please enter a message.`.
+
+Then, exit the function execution.
+
+# --hints--
+
+Your callback function should have an `if` statement.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(/)
+```
+
+Your `if` statement should check if the `value` of `messageInput` is an empty string.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)/)
+```
+
+Your `if` statement should display an alert to the user with the message `Please enter a message.`.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)\s*\{\s*alert\(\s*('|"|`)Please enter a message\.\3\s*\)/)
+```
+
+Your `if` statement should exit the function execution.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)\s*\{\s*alert\(\s*('|"|`)Please enter a message\.\3\s*\);?\s*return\s*;?\s*\}\s*\}/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+--fcc-editable-region--
+checkMessageButton.addEventListener("click", () => {
+
+});
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdefa704f232675ed98aa.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdefa704f232675ed98aa.md
new file mode 100644
index 00000000000..9310cd9c68f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdefa704f232675ed98aa.md
@@ -0,0 +1,181 @@
+---
+id: 641cdefa704f232675ed98aa
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Create an `isSpam` function using the `const` keyword and arrow syntax. The function should take a single parameter `msg` and implicitly return `false` for now.
+
+# --hints--
+
+You should use `const` to declare an `isSpam` variable.
+
+```js
+assert.match(code, /const\s+isSpam\s*=/);
+```
+
+You should use arrow syntax to assign `isSpam` a function.
+
+```js
+assert.match(code, /const\s+isSpam\s*=\s*\(?.*\)?\s*=>/);
+```
+
+Your `isSpam` function should have a single `msg` parameter.
+
+```js
+assert.match(code, /const\s+isSpam\s*=\s*\(?\s*msg\s*\)?/);
+```
+
+Your `isSpam` function should implicitly return `false`.
+
+```js
+assert.match(code, /const\s+isSpam\s*=\s*\(?\s*msg\s*\)?\s*=>\s*false;?/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdf57c3f7ee276e1d9b32.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdf57c3f7ee276e1d9b32.md
new file mode 100644
index 00000000000..269cc030d8f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cdf57c3f7ee276e1d9b32.md
@@ -0,0 +1,199 @@
+---
+id: 641cdf57c3f7ee276e1d9b32
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Back in your event listener, you need to update the text of the `result` element.
+
+Use a ternary operator to update the text of the `result` element after the `if` statement. Check the truthiness of calling `isSpam()` on the value of the `messageInput` element. If true, set the text to `Oh no! This looks like a spam message.`. Otherwise, set the text to `This message does not seem to contain any spam.`
+
+Then set the `messageInput` element's value to an empty string.
+
+# --hints--
+
+You should use the assignment operator to set the `textContent` property of the `result` element.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)\s*\{\s*alert\(\s*('|"|`)Please enter a message\.\3\s*\);?\s*return\s*;?\s*\}\s*result\.textContent\s*\=\s*/)
+```
+
+You should assign the `isSpam()` function call to `result.textContent`.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)\s*\{\s*alert\(\s*('|"|`)Please enter a message\.\3\s*\);?\s*return\s*;?\s*\}\s*result\.textContent\s*\=\s*isSpam\(\s*messageInput\.value\s*\)/)
+```
+
+You should use ternary syntax to check the truthiness of `isSpam(messageInput.value)`.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)\s*\{\s*alert\(\s*('|"|`)Please enter a message\.\3\s*\);?\s*return\s*;?\s*\}\s*result\.textContent\s*\=\s*isSpam\(\s*messageInput\.value\s*\)\s*\?/)
+```
+
+The truthy expression of your ternary should set the `textContent` property of the `result` element to `Oh no! This looks like a spam message.`.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)\s*\{\s*alert\(\s*('|"|`)Please enter a message\.\3\s*\);?\s*return\s*;?\s*\}\s*result\.textContent\s*\=\s*isSpam\(\s*messageInput\.value\s*\)\s*\?\s*('|"|`)Oh no! This looks like a spam message.\4\s*:/);
+```
+
+The falsy expression of your ternary should set the `textContent` property of the `result` element to `This message does not seem to contain any spam.`.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)\s*\{\s*alert\(\s*('|"|`)Please enter a message\.\3\s*\);?\s*return\s*;?\s*\}\s*result\.textContent\s*\=\s*isSpam\(\s*messageInput\.value\s*\)\s*\?\s*('|"|`)Oh no! This looks like a spam message.\4\s*:\s*('|"|`)This message does not seem to contain any spam.\5;?\s*/);
+```
+
+After your ternary, set the `value` of `messageInput` to an empty string.
+
+```js
+assert.match(code, /checkMessageButton\.addEventListener\(\s*('|"|`)click\1\s*,\s*\(\s*\)\s*=>\s*\{\s*if\s*\(\s*messageInput\.value\s*===\s*('|"|`)\2\s*\)\s*\{\s*alert\(\s*('|"|`)Please enter a message\.\3\s*\);?\s*return\s*;?\s*\}\s*result\.textContent\s*\=\s*isSpam\(\s*messageInput\.value\s*\)\s*\?\s*('|"|`)Oh no! This looks like a spam message.\4\s*:\s*('|"|`)This message does not seem to contain any spam.\5;?\s*messageInput\.value\s*=\s*('|"|`)\6;?\s*\}/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const isSpam = (msg) => false;
+
+--fcc-editable-region--
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+
+});
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce03dfeca10293e05dad7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce03dfeca10293e05dad7.md
new file mode 100644
index 00000000000..4b9ba9bc1af
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce03dfeca10293e05dad7.md
@@ -0,0 +1,188 @@
+---
+id: 641ce03dfeca10293e05dad7
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Your first regular expression will be used to catch help requests. Declare a `helpRegex` variable, and assign it a regular expression that matches the string `please help`.
+
+As a refresher, here is a regular expression to match the string `hello world`:
+
+```js
+const regex = /hello world/;
+```
+
+# --hints--
+
+You should use `const` to declare a `helpRegex` variable.
+
+```js
+assert.match(code, /const\s+helpRegex\s*=/);
+```
+
+Your `helpRegex` variable should be a regular expression.
+
+```js
+assert.instanceOf(helpRegex, RegExp);
+```
+
+Your `helpRegex` variable should match the string `please help`.
+
+```js
+assert.match('please help', helpRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const isSpam = (msg) => false;
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce3065c50e62f97406973.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce3065c50e62f97406973.md
new file mode 100644
index 00000000000..c0028fec254
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce3065c50e62f97406973.md
@@ -0,0 +1,172 @@
+---
+id: 641ce3065c50e62f97406973
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Regular expressions can take
flags to modify their behavior. For instance, the `i` flag can be used to make the expression ignore case, causing it to match `hello`, `HELLO`, and `Hello` for the expression `/hello/`.
+
+Flags are added after the trailing backslash. Add the `i` flag to your `helpRegex`.
+
+# --hints--
+
+Your `helpRegex` should have the case-insensitive `i` flag.
+
+```js
+assert.include(helpRegex.flags, 'i');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+--fcc-editable-region--
+const helpRegex = /please help/;
+--fcc-editable-region--
+
+const isSpam = (msg) => false;
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce3dcd0aec8309fbc9971.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce3dcd0aec8309fbc9971.md
new file mode 100644
index 00000000000..aa5f5c1bb48
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ce3dcd0aec8309fbc9971.md
@@ -0,0 +1,174 @@
+---
+id: 641ce3dcd0aec8309fbc9971
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Strings have a `.match()` method, which accepts a regular expression as an argument and determines if the string matches that expression.
+
+Update your `isSpam()` function to implicitly return the result of calling the `.match()` method on `msg`, passing `helpRegex` as the argument.
+
+Then, try entering some messages on your page and see the result.
+
+# --hints--
+
+Your `isSpam()` function should implicitly return the result of `msg.match(helpRegex)`.
+
+```js
+assert.match(code, /const\s*isSpam\s*=\s*\(msg\)\s*=>\s*msg\.match\(helpRegex\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help/i;
+
+--fcc-editable-region--
+const isSpam = (msg) => false;
+--fcc-editable-region--
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ceed81533263283835c3d.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ceed81533263283835c3d.md
new file mode 100644
index 00000000000..318d7db7662
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641ceed81533263283835c3d.md
@@ -0,0 +1,174 @@
+---
+id: 641ceed81533263283835c3d
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Instead of using the `.match()` method, you can use the `.test()` method of a regular expression to test if a string matches the pattern. Unlike `.match()`, `.test()` returns a boolean value indicating whether or not the string matches the pattern.
+
+Update your `isSpam()` function to use the `.test()` method of `helpRegex` to test if `msg` is a match.
+
+Then, try entering some messages on your page and see the result.
+
+# --hints--
+
+Your `isSpam()` function should implicitly return the result of `helpRegex.test(msg)`.
+
+```js
+assert.match(code, /const\s*isSpam\s*=\s*\(msg\)\s*=>\s*helpRegex\.test\(msg\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help/i;
+
+--fcc-editable-region--
+const isSpam = (msg) => msg.match(helpRegex);
+--fcc-editable-region--
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cf198ec366c33d6504854.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cf198ec366c33d6504854.md
new file mode 100644
index 00000000000..db22a7b6b2f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/641cf198ec366c33d6504854.md
@@ -0,0 +1,184 @@
+---
+id: 641cf198ec366c33d6504854
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+The
alternate sequence `|` can be used to match either the text on the left or the text on the right of the `|`. For example, the regular expression `/yes|no/` will match either `yes` or `no`.
+
+Update your `helpRegex` to match either `please help` or `assist me`.
+
+# --hints--
+
+Your `helpRegex` should use the `|` alternate sequence.
+
+```js
+assert.match(helpRegex.toString(), /\|/);
+```
+
+Your `helpRegex` should match the string `please help`.
+
+```js
+assert.match('please help', helpRegex);
+```
+
+Your `helpRegex` should match the string `assist me`.
+
+```js
+assert.match('assist me', helpRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+--fcc-editable-region--
+const helpRegex = /please help/i;
+--fcc-editable-region--
+
+const isSpam = (msg) => helpRegex.test(msg);
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6421f6f59d665615c9e94d8a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6421f6f59d665615c9e94d8a.md
new file mode 100644
index 00000000000..bfbdaa2e30b
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6421f6f59d665615c9e94d8a.md
@@ -0,0 +1,186 @@
+---
+id: 6421f6f59d665615c9e94d8a
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Before you start creating additional regular expressions, you need to update your application to check more than one regular expression.
+
+Start by declaring a `denyList` variable. Assign it an array containing your `helpRegex`.
+
+# --hints--
+
+You should use `const` to declare a `denyList` variable.
+
+```js
+assert.match(code, /const\s*denyList\s*=/);
+```
+
+Your `denyList` variable should be an array.
+
+```js
+assert.isArray(denyList);
+```
+
+Your `denyList` array should have `helpRegex` as its only element.
+
+```js
+assert.deepEqual(denyList, [helpRegex]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const isSpam = (msg) => helpRegex.test(msg);
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6421f98f4999d1179ce37cb4.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6421f98f4999d1179ce37cb4.md
new file mode 100644
index 00000000000..0d884ee0ab3
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6421f98f4999d1179ce37cb4.md
@@ -0,0 +1,192 @@
+---
+id: 6421f98f4999d1179ce37cb4
+title: Step 12
+challengeType: 0
+dashedName: step-12
+---
+
+# --description--
+
+Remember that arrays have a `.some()` method. Use the `.some()` method to check if testing your `msg` on any of your `denyList` regular expressions returns `true`.
+
+Use `regex` as the parameter for the callback function, for clarity.
+
+# --hints--
+
+Your `isSpam` function should implicitly return the result of `denyList.some()`.
+
+```js
+assert.match(code, /const\s*isSpam\s*=\s*\(?\s*msg\s*\)?\s*=>\s*/)
+```
+
+Your `.some()` method should use arrow syntax for the callback.
+
+```js
+assert.match(code, /const\s*isSpam\s*=\s*\(?\s*msg\s*\)?\s*=>\s*denyList\.some\(\s*\(?.*\)?\s*=>/);
+```
+
+Your `.some()` callback should take `regex` as the parameter.
+
+```js
+assert.match(code, /const\s*isSpam\s*=\s*\(?\s*msg\s*\)?\s*=>\s*denyList\.some\(\s*\(?\s*regex\s*\)?\s*=>/);
+```
+
+Your `.some()` callback should implicitly return the result of testing `msg` on `regex`.
+
+```js
+assert.match(code, /const\s*isSpam\s*=\s*\(?\s*msg\s*\)?\s*=>\s*denyList\.some\(\s*\(?\s*regex\s*\)?\s*=>\s*regex\.test\(\s*msg\s*\)\s*\)/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+
+const denyList = [helpRegex];
+
+--fcc-editable-region--
+const isSpam = (msg) => helpRegex.test(msg);
+--fcc-editable-region--
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642205fa6376c818f78bb24e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642205fa6376c818f78bb24e.md
new file mode 100644
index 00000000000..38360e8284d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642205fa6376c818f78bb24e.md
@@ -0,0 +1,193 @@
+---
+id: 642205fa6376c818f78bb24e
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+The next regular expression you will work on is one that matches mentions of dollar amounts.
+
+Start by declaring a `dollarRegex` variable, and assign it a case-insensitive regular expression that matches the text `dollars`.
+
+# --hints--
+
+You should use `const` to declare a `dollarRegex` variable.
+
+```js
+assert.match(code, /const\s*dollarRegex\s*=/);
+```
+
+Your `dollarRegex` variable should be a regular expression.
+
+```js
+assert.instanceOf(dollarRegex, RegExp);
+```
+
+Your `dollarRegex` should match `dollars`.
+
+```js
+assert.match('dollars', dollarRegex);
+```
+
+Your `dollarRegex` should be case-insensitive.
+
+```js
+assert.include(dollarRegex.flags, 'i');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const denyList = [helpRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642206618bdd611a0c4e90f3.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642206618bdd611a0c4e90f3.md
new file mode 100644
index 00000000000..3cb29fcb5b9
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642206618bdd611a0c4e90f3.md
@@ -0,0 +1,181 @@
+---
+id: 642206618bdd611a0c4e90f3
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Add your `dollarRegex` to the `denyList` array so that you can test the regular expression.
+
+Then try entering a message in your app.
+
+# --hints--
+
+Your `denyList` array should include `dollarRegex`.
+
+```js
+assert.deepInclude(denyList, dollarRegex);
+```
+
+Your `denyList` array should still include `helpRegex`.
+
+```js
+assert.deepInclude(denyList, helpRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /dollars/i;
+
+--fcc-editable-region--
+const denyList = [helpRegex];
+--fcc-editable-region--
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642206e054eef81b5e3092ed.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642206e054eef81b5e3092ed.md
new file mode 100644
index 00000000000..f879e8ee96d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642206e054eef81b5e3092ed.md
@@ -0,0 +1,189 @@
+---
+id: 642206e054eef81b5e3092ed
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+You need to match a number before the text `dollars`. While you could write out `0|1|2` and so on, regular expressions have a feature that makes this easier.
+
+A
character class is defined by square brackets, and matches any character within the brackets. For example, `[aeiou]` matches any character in the list `aeiou`. You can also define a range of characters to match using a hyphen. For example, `[a-z]` matches any character from `a` to `z`.
+
+Add a character class to match the digits `0` through `9` to your `dollarRegex` expression - remember the digit must come before the word `dollars`, and there should be a space between the digit and the word.
+
+# --hints--
+
+Your `dollarRegex` should use a character class.
+
+```js
+assert.match(dollarRegex.source, /\[.*\]/);
+```
+
+Your character class should be `0-9`.
+
+```js
+assert.match(dollarRegex.source, /\[0-9\]/);
+```
+
+Your `dollarRegex` should match `1 dollars`.
+
+```js
+assert.match('1 dollars', dollarRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+--fcc-editable-region--
+const dollarRegex = /dollars/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642208bc4d44701c6fd6f65e.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642208bc4d44701c6fd6f65e.md
new file mode 100644
index 00000000000..6cadb0b8709
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642208bc4d44701c6fd6f65e.md
@@ -0,0 +1,193 @@
+---
+id: 642208bc4d44701c6fd6f65e
+title: Step 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+The dollar value may be more than one digit. To match this, the `+` quantifier can be used - this matches one or more consecutive occurrence. For example, the regular expression `/a+/` matches one or more consecutive `a` characters.
+
+Update your regular expression to match one or more consecutive digits.
+
+# --hints--
+
+Your `dollarRegex` should use the `+` quantifier.
+
+```js
+assert.match(dollarRegex.source, /\+/);
+```
+
+Your `dollarRegex` should use the `+` quantifier on your `[0-9]` character class.
+
+```js
+assert.match(dollarRegex.source, /\[0-9\]\+/);
+```
+
+Your `dollarRegex` should match `100 dollars`.
+
+```js
+assert.match('100 dollars', dollarRegex);
+```
+
+Your `dollarRegex` should match `3 dollars`.
+
+```js
+assert.match('3 dollars', dollarRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+--fcc-editable-region--
+const dollarRegex = /[0-9] dollars/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220e8cb589f61e625bf453.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220e8cb589f61e625bf453.md
new file mode 100644
index 00000000000..9b6e7192541
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220e8cb589f61e625bf453.md
@@ -0,0 +1,215 @@
+---
+id: 64220e8cb589f61e625bf453
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Between your digits and your `dollars` text, you want to catch place values.
+
+Use the `|` token to allow `hundred`, `thousand`, `million`, or `billion` between your digits and `dollars`.
+
+# --hints--
+
+Your `dollarRegex` should use the `|` token.
+
+```js
+assert.match(dollarRegex.source, /\|/);
+```
+
+Your `dollarRegex` should have three `|` tokens.
+
+```js
+assert.lengthOf(dollarRegex.source.match(/\|/g), 3);
+```
+
+Your `dollarRegex` should use the `|` token to match `hundred`, `thousand`, `million`, or `billion`.
+
+```js
+const placeValues = dollarRegex.source.replace("[0-9]+ ", "").replace(" dollars", "").split('|');
+assert.include(placeValues, 'hundred');
+assert.include(placeValues, 'thousand');
+assert.include(placeValues, 'million');
+assert.include(placeValues, 'billion');
+```
+
+Your `dollarRegex` should match `1 hundred dollars`.
+
+```js
+assert.match('1 hundred dollars', dollarRegex);
+```
+
+Your `dollarRegex` should match `1 thousand dollars`.
+
+```js
+assert.match('1 thousand dollars', dollarRegex);
+```
+
+Your `dollarRegex` should match `1 million dollars`.
+
+```js
+assert.match('1 million dollars', dollarRegex);
+```
+
+Your `dollarRegex` should match `1 billion dollars`.
+
+```js
+assert.match('1 billion dollars', dollarRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+--fcc-editable-region--
+const dollarRegex = /[0-9]+ dollars/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220f22dff8151f751a53a7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220f22dff8151f751a53a7.md
new file mode 100644
index 00000000000..d06112d99fc
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220f22dff8151f751a53a7.md
@@ -0,0 +1,187 @@
+---
+id: 64220f22dff8151f751a53a7
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+A
capture group is a way to define a part of the expression that should be captured and saved for later reference. You can define a capture group by wrapping a part of your expression in parentheses. For example, `/h(i|ey) camper/` would match either `hi camper` or `hey camper`, and would capture `i` or `ey` in a group.
+
+Turn your place values into a capture group.
+
+# --hints--
+
+You should not change your `helpRegex` regular expression.
+
+```js
+assert.match(helpRegex.source, /please help|assist me/);
+```
+
+Your `dollarRegex` should use a capture group.
+
+```js
+assert.match(dollarRegex.source, /\(.*\)/)
+```
+
+Your `hundred|thousand|million|billion` pattern should be a capture group.
+
+```js
+assert.match(dollarRegex.source, /\(hundred\|thousand\|million\|billion\)/)
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+--fcc-editable-region--
+const dollarRegex = /[0-9]+ hundred|thousand|million|billion dollars/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220fb017c57d20612de8b8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220fb017c57d20612de8b8.md
new file mode 100644
index 00000000000..3af8f66ca54
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64220fb017c57d20612de8b8.md
@@ -0,0 +1,181 @@
+---
+id: 64220fb017c57d20612de8b8
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+Now that you have your capture group, you can mark the entire pattern as an optional match. The `?` quantifier matches zero or one occurrence of the preceding character or group. For example, the regular expression `/colou?r/` matches both `color` and `colour`, because the `u` is optional.
+
+Mark your capture group as optional.
+
+# --hints--
+
+Your `dollarRegex` should use the `?` quantifier.
+
+```js
+assert.match(dollarRegex.source, /\?/);
+```
+
+Your `(hundred|thousand|million|billion)` capture group should be optional.
+
+```js
+assert.match(dollarRegex.source, /\(hundred\|thousand\|million\|billion\)\?/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+--fcc-editable-region--
+const dollarRegex = /[0-9]+ (hundred|thousand|million|billion) dollars/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64221007887f38213fa57827.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64221007887f38213fa57827.md
new file mode 100644
index 00000000000..b1c681fe077
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64221007887f38213fa57827.md
@@ -0,0 +1,195 @@
+---
+id: 64221007887f38213fa57827
+title: Step 20
+challengeType: 0
+dashedName: step-20
+---
+
+# --description--
+
+One last thing with this expression. You don't actually need the match value from your capture group, so you can turn it into a
non-capturing group . This will allow you to group the characters together without preserving the result.
+
+To create a non-capturing group in a regular expression, you can add `?:` after the opening parenthesis of a group. For instance, `(?:a|b)` will match either `a` or `b`, but it will not capture the result.
+
+Update your regular expression to use a non-capturing group.
+
+# --hints--
+
+Your `dollarRegex` should use `?:`.
+
+```js
+assert.match(dollarRegex.source, /\?:/);
+```
+
+Your `dollarRegex` should use a non-capturing group.
+
+```js
+assert.match(dollarRegex.source, /\(\?:.*\)/);
+```
+
+Your `(hundred|thousand|million|billion)` should be a non-capturing group.
+
+```js
+assert.match(dollarRegex.source, /\(\?:hundred\|thousand\|million\|billion\)/);
+```
+
+Your `(hundred|thousand|million|billion)` group should still be optional.
+
+```js
+assert.match(dollarRegex.source, /\(\?:hundred\|thousand\|million\|billion\)\?/);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+--fcc-editable-region--
+const dollarRegex = /[0-9]+ (hundred|thousand|million|billion)? dollars/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642213bf8d38b0227ed6ab0b.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642213bf8d38b0227ed6ab0b.md
new file mode 100644
index 00000000000..ffff341569f
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642213bf8d38b0227ed6ab0b.md
@@ -0,0 +1,192 @@
+---
+id: 642213bf8d38b0227ed6ab0b
+title: Step 21
+challengeType: 0
+dashedName: step-21
+---
+
+# --description--
+
+Your next regular expression will look for strings like `free money`. Start by declaring a `freeRegex` variable and assigning it a regular expression that will match the string `free money`. Remember to make it case-insensitive.
+
+# --hints--
+
+You should declare a `freeRegex` variable using `const`.
+
+```js
+assert.match(code, /const\s*freeRegex\s*=/);
+```
+
+Your `freeRegex` variable should be a regular expression.
+
+```js
+assert.instanceOf(freeRegex, RegExp);
+```
+
+Your `freeRegex` should match `free money`.
+
+```js
+assert.match('free money', freeRegex);
+```
+
+Your `freeRegex` should be case-insensitive.
+
+```js
+assert.include(freeRegex.flags, 'i');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233060735ddf06451c5c8c.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233060735ddf06451c5c8c.md
new file mode 100644
index 00000000000..1ba309995ce
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233060735ddf06451c5c8c.md
@@ -0,0 +1,186 @@
+---
+id: 64233060735ddf06451c5c8c
+title: Step 22
+challengeType: 0
+dashedName: step-22
+---
+
+# --description--
+
+Add your new regular expression to your `denyList` array so you can test it.
+
+# --hints--
+
+Your `denyList` array should include your `freeRegex` variable.
+
+```js
+assert.deepInclude(denyList, freeRegex);
+```
+
+Your `denyList` array should include your `dollarRegex` variable.
+
+```js
+assert.deepInclude(denyList, dollarRegex);
+```
+
+Your `denyList` array should include your `helpRegex` variable.
+
+```js
+assert.deepInclude(denyList, helpRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /free money/i;
+
+--fcc-editable-region--
+const denyList = [helpRegex, dollarRegex];
+--fcc-editable-region--
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233094a1293c079b5b0996.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233094a1293c079b5b0996.md
new file mode 100644
index 00000000000..c5af62cc064
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233094a1293c079b5b0996.md
@@ -0,0 +1,200 @@
+---
+id: 64233094a1293c079b5b0996
+title: Step 23
+challengeType: 0
+dashedName: step-23
+---
+
+# --description--
+
+Spam messages often use numbers instead of letters to bypass filters. Your regular expression should catch these.
+
+Replace the `e` characters in your regular expression with character classes that match `e` and `3`.
+
+# --hints--
+
+Your `freeRegex` should use a character class.
+
+```js
+assert.match(freeRegex.source, /\[.*\]/);
+```
+
+Your `freeRegex` should use a character class to match `e` and `3`.
+
+```js
+assert.match(freeRegex.source, /\[(e3|3e)\]/);
+```
+
+Your `freeRegex` should use three character classes to match `e` and `3`.
+
+```js
+assert.lengthOf(freeRegex.source.match(/\[(e3|3e)\]/g), 3);
+```
+
+Your `freeRegex` should match `free money`.
+
+```js
+assert.match('free money', freeRegex);
+```
+
+Your `freeRegex` should match `fr33 mon3y`.
+
+```js
+assert.match('fr33 mon3y', freeRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+--fcc-editable-region--
+const freeRegex = /free money/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423322e71f8d108608005cb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423322e71f8d108608005cb.md
new file mode 100644
index 00000000000..4021e82456c
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423322e71f8d108608005cb.md
@@ -0,0 +1,186 @@
+---
+id: 6423322e71f8d108608005cb
+title: Step 24
+challengeType: 0
+dashedName: step-24
+---
+
+# --description--
+
+Now update your `o` character to match `o` and `0` (the digit).
+
+# --hints--
+
+Your `freeRegex` should use a character class to match `o` and `0`.
+
+```js
+assert.match(freeRegex.source, /\[(o0|0o)\]/);
+```
+
+Your `freeRegex` should match `free money`.
+
+```js
+assert.match('free money', freeRegex);
+```
+
+Your `freeRegex` should match `fr33 m0n3y`.
+
+```js
+assert.match('fr33 m0n3y', freeRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+--fcc-editable-region--
+const freeRegex = /fr[e3][e3] mon[e3]y/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423331f0527840934183aba.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423331f0527840934183aba.md
new file mode 100644
index 00000000000..ccb25a40b92
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423331f0527840934183aba.md
@@ -0,0 +1,183 @@
+---
+id: 6423331f0527840934183aba
+title: Step 25
+challengeType: 0
+dashedName: step-25
+---
+
+# --description--
+
+Your regex should match whole words, not partial words. That is, you do not want to match `hands-free money management`.
+
+To do this, start by checking for spaces before and after your pattern. You can do this by using the meta character `\s`, which will match spaces, tabs, and line breaks.
+
+# --hints--
+
+Your `freeRegex` should use the `\s` token.
+
+```js
+assert.match(freeRegex.source, /\s/);
+```
+
+Your `freeRegex` should look for spaces at the beginning and end of your pattern.
+
+```js
+assert.isTrue(freeRegex.source.startsWith('\\s'));
+assert.isTrue(freeRegex.source.endsWith('\\s'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+--fcc-editable-region--
+const freeRegex = /fr[e3][e3] m[o0]n[e3]y/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642335220b7d830a69eb59fb.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642335220b7d830a69eb59fb.md
new file mode 100644
index 00000000000..8e87903b371
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642335220b7d830a69eb59fb.md
@@ -0,0 +1,202 @@
+---
+id: 642335220b7d830a69eb59fb
+title: Step 26
+challengeType: 0
+dashedName: step-26
+---
+
+# --description--
+
+If you try entering the message `free money`, you'll notice it doesn't match your expression! This is because `\s` doesn't match the beginning or end of the text.
+
+To match the beginning of the text, you can use the `^` anchor. This asserts that your pattern match starts at the beginning of the full string.
+
+Replace your first `\s` character with a non-capturing group that matches `\s` or `^`.
+
+# --hints--
+
+Your `freeRegex` should use a non-capturing group.
+
+```js
+assert.match(freeRegex.source, /\(\?:/);
+```
+
+Your `freeRegex` should use a non-capturing group to match `\s` or `^`.
+
+```js
+assert.match(freeRegex.source, /\(\?:(\^\|\\s|\\s\|\^)\)/);
+```
+
+Your `freeRegex` should match `it's free money time`.
+
+```js
+assert.match("it's free money time", freeRegex);
+```
+
+Your `freeRegex` should match `free money time`.
+
+```js
+assert.match('free money time', freeRegex);
+```
+
+Your `freeRegex` should not match `hands-free money time`.
+
+```js
+assert.notMatch('hands-free money', freeRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+--fcc-editable-region--
+const freeRegex = /\sfr[e3][e3] m[o0]n[e3]y\s/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642335d232d7690b2d67dbaf.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642335d232d7690b2d67dbaf.md
new file mode 100644
index 00000000000..5ae27ea1ee2
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642335d232d7690b2d67dbaf.md
@@ -0,0 +1,220 @@
+---
+id: 642335d232d7690b2d67dbaf
+title: Step 27
+challengeType: 0
+dashedName: step-27
+---
+
+# --description--
+
+You still aren't matching `free money` yet, because you need to match the end of the string as well.
+
+Like the `^` anchor, you can use the `$` anchor to match the end of the string.
+
+Update your regular expression to match either the end of the string or a space, like you did for the beginning of the string.
+
+# --hints--
+
+Your `freeRegex` should use a second non-capturing group.
+
+```js
+assert.lengthOf(freeRegex.source.match(/\(\?:/g), 2);
+```
+
+Your `freeRegex` should use a non-capturing group to match `\s` or `$`.
+
+```js
+assert.match(freeRegex.source, /\(\?:(\$\|\\s|\\s\|\$)\)/);
+```
+
+Your `freeRegex` should match `it's free money time`.
+
+```js
+assert.match("it's free money time", freeRegex);
+```
+
+Your `freeRegex` should match `free money time`.
+
+```js
+assert.match('free money time', freeRegex);
+```
+
+Your `freeRegex` should match `it's free money`.
+
+```js
+assert.match("it's free money", freeRegex);
+```
+
+Your `freeRegex` should match `free money`.
+
+```js
+assert.match('free money', freeRegex);
+```
+
+Your `freeRegex` should not match `hands-free money time`.
+
+```js
+assert.notMatch('hands-free money', freeRegex);
+```
+
+Your `freeRegex` should not match `free money-management`.
+
+```js
+assert.notMatch('free money-management', freeRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+--fcc-editable-region--
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y\s/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233d08f234a310e73f9496.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233d08f234a310e73f9496.md
new file mode 100644
index 00000000000..ae37726dd1a
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64233d08f234a310e73f9496.md
@@ -0,0 +1,219 @@
+---
+id: 64233d08f234a310e73f9496
+title: Step 28
+challengeType: 0
+dashedName: step-28
+---
+
+# --description--
+
+Your next regular expression will match strings like `stock alert`. Declare a `stockRegex` variable and assign it a regular expression that will match the string `stock alert`. Remember to make it case insensitive.
+
+Add it to your `denyList` array as well.
+
+# --hints--
+
+You should use `const` to declare your `stockRegex` variable.
+
+```js
+assert.match(code, /const\s+stockRegex\s*=/);
+```
+
+Your `stockRegex` variable should be assigned a regular expression.
+
+```js
+assert.instanceOf(stockRegex, RegExp);
+```
+
+Your `stockRegex` should match `stock alert`.
+
+```js
+assert.match('stock alert', stockRegex);
+```
+
+Your `stockRegex` should be case-insensitive.
+
+```js
+assert.include(stockRegex.flags, 'i');
+```
+
+Your `denyList` array should contain `stockRegex`.
+
+```js
+assert.deepInclude(denyList, stockRegex);
+```
+
+Your `denyList` array should contain `freeRegex`.
+
+```js
+assert.deepInclude(denyList, freeRegex);
+```
+
+Your `denyList` array should contain `dollarRegex`.
+
+```js
+assert.deepInclude(denyList, dollarRegex);
+```
+
+Your `denyList` array should contain `helpRegex`.
+
+```js
+assert.deepInclude(denyList, helpRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+--fcc-editable-region--
+
+
+const denyList = [helpRegex, dollarRegex, freeRegex];
+--fcc-editable-region--
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642344dc9390c712080432c7.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642344dc9390c712080432c7.md
new file mode 100644
index 00000000000..aa2fb10cb37
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642344dc9390c712080432c7.md
@@ -0,0 +1,193 @@
+---
+id: 642344dc9390c712080432c7
+title: Step 29
+challengeType: 0
+dashedName: step-29
+---
+
+# --description--
+
+Like your `freeRegex`, update your `stockRegex` to replace the `e` and `o` characters with character classes to match the letter and the corresponding number.
+
+# --hints--
+
+Your `stockRegex` should use a character class to match the letter `e` and the number `3`.
+
+```js
+assert.match(stockRegex.source, /\[(e3|3e)\]/);
+```
+
+Your `stockRegex` should use a character class to match the letter `o` and the number `0`.
+
+```js
+assert.match(stockRegex.source, /\[(o0|0o)\]/);
+```
+
+Your `stockRegex` should match `stock alert`.
+
+```js
+assert.match('stock alert', stockRegex);
+```
+
+Your `stockRegex` should match `st0ck al3rt`.
+
+```js
+assert.match('st0ck al3rt', stockRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+--fcc-editable-region--
+const stockRegex = /stock alert/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex, stockRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64234598ef08dd13114edae5.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64234598ef08dd13114edae5.md
new file mode 100644
index 00000000000..49c7b6696ba
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64234598ef08dd13114edae5.md
@@ -0,0 +1,193 @@
+---
+id: 64234598ef08dd13114edae5
+title: Step 30
+challengeType: 0
+dashedName: step-30
+---
+
+# --description--
+
+Next update your `s` and `t` characters to also match `5` and `7` respectively.
+
+# --hints--
+
+Your `stockRegex` should use a character class to match the letter `s` and the number `5`.
+
+```js
+assert.match(stockRegex.source, /\[(s5|5s)\]/);
+```
+
+Your `stockRegex` should use a character class to match the letter `t` and the number `7`.
+
+```js
+assert.match(stockRegex.source, /\[(t7|7t)\]/);
+```
+
+Your `stockRegex` should match `stock alert`.
+
+```js
+assert.match('stock alert', stockRegex);
+```
+
+Your `stockRegex` should match `570ck al3r7`.
+
+```js
+assert.match('570ck al3r7', stockRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+--fcc-editable-region--
+const stockRegex = /st[o0]ck al[e3]rt/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex, stockRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423462975f33b14056583de.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423462975f33b14056583de.md
new file mode 100644
index 00000000000..e195aa26eb1
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423462975f33b14056583de.md
@@ -0,0 +1,199 @@
+---
+id: 6423462975f33b14056583de
+title: Step 31
+challengeType: 0
+dashedName: step-31
+---
+
+# --description--
+
+Character classes can take more than two characters. Replace your `a` character with a character class that matches `a`, `@`, and `4`.
+
+# --hints--
+
+Your `stockRegex` should use a character class to match `a`, `@`, and `4`.
+
+```js
+assert.match(stockRegex.source, /\[(a@4|a4@|4@a|4a@|@a4|@4a)]/);
+```
+
+Your `stockRegex` should match `stock alert`.
+
+```js
+assert.match('stock alert', stockRegex);
+```
+
+Your `stockRegex` should match `stock @lert`.
+
+```js
+assert.match('stock @lert', stockRegex);
+```
+
+Your `stockRegex` should match `stock 4lert`.
+
+```js
+assert.match('stock 4lert', stockRegex);
+```
+
+Your `stockRegex` should match `570ck 4l3r7`.
+
+```js
+assert.match('570ck 4l3r7', stockRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+--fcc-editable-region--
+const stockRegex = /[s5][t7][o0]ck al[e3]r[t7]/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex, stockRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423472aeed932150e8984b6.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423472aeed932150e8984b6.md
new file mode 100644
index 00000000000..109cc7bd27d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423472aeed932150e8984b6.md
@@ -0,0 +1,199 @@
+---
+id: 6423472aeed932150e8984b6
+title: Step 32
+challengeType: 0
+dashedName: step-32
+---
+
+# --description--
+
+Using the same syntax, update `c` to match `c`, `{`, `[`, and `(`.
+
+# --hints--
+
+Your `stockRegex` should use a character class to match `c`, `{`, `[`, and `(`.
+
+```js
+assert.match(stockRegex.source, /\[(c\{\[\(|\{c\[\(|\[c\{\(|c\[\{\(|\{\[c\(|\[\{c\(|\[\{\(c|\{\[\(c|\(\[\{c|\[\(\{c|\{\(\[c|\(\{\[c|\(c\[\{|c\(\[\{|\[\(c\{|\(\[c\{|c\[\(\{|\[c\(\{|\{c\(\[|c\{\(\[|\(\{c\[|\{\(c\[|c\(\{\[|\(c\{\[)\]/);
+```
+
+Your `stockRegex` should match `stock alert`.
+
+```js
+assert.match('stock alert', stockRegex);
+```
+
+Your `stockRegex` should match `570(k 4l3r7`.
+
+```js
+assert.match('570(k 4l3r7', stockRegex);
+```
+
+Your `stockRegex` should match `sto{k alert`.
+
+```js
+assert.match('sto{k alert', stockRegex);
+```
+
+Your `stockRegex` should match `sto[k alert`.
+
+```js
+assert.match('sto[k alert', stockRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+--fcc-editable-region--
+const stockRegex = /[s5][t7][o0]ck [a@4]l[e3]r[t7]/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex, stockRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64234797d84734163088961a.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64234797d84734163088961a.md
new file mode 100644
index 00000000000..162eaba6781
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/64234797d84734163088961a.md
@@ -0,0 +1,229 @@
+---
+id: 64234797d84734163088961a
+title: Step 33
+challengeType: 0
+dashedName: step-33
+---
+
+# --description--
+
+Finally, allow your regex to match whole words (like you did with `freeRegex`).
+
+# --hints--
+
+Your `stockRegex` should use a non-capturing group.
+
+```js
+assert.match(stockRegex.source, /\(\?:/);
+```
+
+Your `stockRegex` should use a non-capturing group to match `\s` or `^`.
+
+```js
+assert.match(stockRegex.source, /\(\?:(\^\|\\s|\\s\|\^)\)/);
+```
+
+Your `stockRegex` should use a second non-capturing group.
+
+```js
+assert.lengthOf(stockRegex.source.match(/\(\?:/g), 2);
+```
+
+Your `stockRegex` should use a non-capturing group to match `\s` or `$`.
+
+```js
+assert.match(stockRegex.source, /\(\?:(\$\|\\s|\\s\|\$)\)/);
+```
+
+Your `stockRegex` should match `it's stock alert time`.
+
+```js
+assert.match("it's stock alert time", stockRegex);
+```
+
+Your `stockRegex` should match `stock alert time`.
+
+```js
+assert.match('stock alert time', stockRegex);
+```
+
+Your `stockRegex` should match `it's stock alert`.
+
+```js
+assert.match("it's stock alert", stockRegex);
+```
+
+Your `stockRegex` should match `stock alert`.
+
+```js
+assert.match('stock alert', stockRegex);
+```
+
+Your `stockRegex` should not match `hands-stock alert time`.
+
+```js
+assert.notMatch('hands-stock alert', stockRegex);
+```
+
+Your `stockRegex` should not match `stock alert-management`.
+
+```js
+assert.notMatch('stock alert-management', stockRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+--fcc-editable-region--
+const stockRegex = /[s5][t7][o0][c{[(]k [a@4]l[e3]r[t7]/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex, stockRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423491485db5e1786dd6434.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423491485db5e1786dd6434.md
new file mode 100644
index 00000000000..dfa5e758a73
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/6423491485db5e1786dd6434.md
@@ -0,0 +1,224 @@
+---
+id: 6423491485db5e1786dd6434
+title: Step 34
+challengeType: 0
+dashedName: step-34
+---
+
+# --description--
+
+Your final regular expression will look for strings like `dear friend`. Declare a `dearRegex` and assign it a regular expression that will match the string `dear friend`. Remember to make it case insensitive, and add it to your `denyList` array.
+
+# --hints--
+
+You should use `const` to declare your `dearRegex` variable.
+
+```js
+assert.match(code, /const\s+dearRegex\s*=/);
+```
+
+Your `dearRegex` variable should be assigned a regular expression.
+
+```js
+assert.instanceOf(dearRegex, RegExp);
+```
+
+Your `dearRegex` should match `dear friend`.
+
+```js
+assert.match('dear friend', dearRegex);
+```
+
+Your `dearRegex` should be case-insensitive.
+
+```js
+assert.include(dearRegex.flags, 'i');
+```
+
+Your `denyList` array should contain `dearRegex`.
+
+```js
+assert.deepInclude(denyList, dearRegex);
+```
+
+Your `denyList` array should contain `stockRegex`.
+
+```js
+assert.deepInclude(denyList, stockRegex);
+```
+
+Your `denyList` array should contain `freeRegex`.
+
+```js
+assert.deepInclude(denyList, freeRegex);
+```
+
+Your `denyList` array should contain `dollarRegex`.
+
+```js
+assert.deepInclude(denyList, dollarRegex);
+```
+
+Your `denyList` array should contain `helpRegex`.
+
+```js
+assert.deepInclude(denyList, helpRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+const stockRegex = /(?:^|\s)[s5][t7][o0][c{[(]k [a@4]l[e3]r[t7](?:$|\s)/i;
+--fcc-editable-region--
+
+
+const denyList = [helpRegex, dollarRegex, freeRegex, stockRegex];
+--fcc-editable-region--
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642349b5b7bae31af21cd5f8.md b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642349b5b7bae31af21cd5f8.md
new file mode 100644
index 00000000000..fc71b4dac4d
--- /dev/null
+++ b/curriculum/challenges/swahili/15-javascript-algorithms-and-data-structures-22/learn-regular-expressions-by-building-a-spam-filter/642349b5b7bae31af21cd5f8.md
@@ -0,0 +1,416 @@
+---
+id: 642349b5b7bae31af21cd5f8
+title: Step 35
+challengeType: 0
+dashedName: step-35
+---
+
+# --description--
+
+To put everything you have learned together, update your `dearRegex` to map the vowels to the corresponding numbers (note that `i` should match `1`, and also match the pipe symbol `|`), and to match whole words.
+
+With that, your spam filter project is complete.
+
+# --hints--
+
+Your `dearRegex` should use a character class to match `e` or `3`.
+
+```js
+assert.match(dearRegex.source, /\[(e3|3e)\]/);
+```
+
+Your `dearRegex` should use a character class to match `a`, `@`, or `4`.
+
+```js
+assert.match(dearRegex.source, /\[(a@4|a4@|4a@|4@a|@a4|@4a)\]/);
+```
+
+Your `dearRegex` should use a character class to match `i`, `1`, or `|`.
+
+```js
+assert.match(dearRegex.source, /\[(i1\||i\|1|1i\||1\|i|\|1i|\|i1)\]/);
+```
+
+Your `dearRegex` should use a non-capturing group.
+
+```js
+assert.match(dearRegex.source, /\(\?:/);
+```
+
+Your `dearRegex` should use a non-capturing group to match `\s` or `^`.
+
+```js
+assert.match(dearRegex.source, /\(\?:(\^\|\\s|\\s\|\^)\)/);
+```
+
+Your `dearRegex` should use a second non-capturing group.
+
+```js
+assert.lengthOf(dearRegex.source.match(/\(\?:/g), 2);
+```
+
+Your `dearRegex` should use a non-capturing group to match `\s` or `$`.
+
+```js
+assert.match(dearRegex.source, /\(\?:(\$\|\\s|\\s\|\$)\)/);
+```
+
+Your `dearRegex` should match `dear friend`.
+
+```js
+assert.match('dear friend', dearRegex);
+```
+
+Your `dearRegex` should match `d34r fr13nd`.
+
+```js
+assert.match('d34r fr13nd', dearRegex);
+```
+
+Your `dearRegex` should match `d3@r fr|3nd`.
+
+```js
+assert.match('d3@r fr|3nd', dearRegex);
+```
+
+Your `dearRegex` should match `my dear friend Naomi`.
+
+```js
+assert.match('my dear friend Naomi', dearRegex);
+```
+
+Your `dearRegex` should match `dear friend Naomi`
+
+```js
+assert.match('dear friend Naomi', dearRegex);
+```
+
+Your `dearRegex` should match `my dear friend`.
+
+```js
+assert.match('my dear friend', dearRegex);
+```
+
+Your `dearRegex` should not match `non-dear friend`.
+
+```js
+assert.notMatch('non-dear friend', dearRegex);
+```
+
+Your `dearRegex` should not match `dear friend-o`.
+
+```js
+assert.notMatch('dear friend-o', dearRegex);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+const stockRegex = /(?:^|\s)[s5][t7][o0][c{[(]k [a@4]l[e3]r[t7](?:$|\s)/i;
+--fcc-editable-region--
+const dearRegex = /dear friend/i;
+--fcc-editable-region--
+
+const denyList = [helpRegex, dollarRegex, freeRegex, stockRegex, dearRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
Learn Regular Expressions by Building a Spam Filter
+
+
+
+
+
+ Is this Spam?
+
+ Enter a phrase to check if it would be marked as spam or not.
+
+
+
+
+ Message:
+
+
+ Check message
+
+
+
+
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --dark-grey: #1b1b32;
+ --light-grey: #f5f6f7;
+ --golden-yellow: #fecc4c;
+ --yellow: #ffcc4c;
+ --gold: #feac32;
+ --orange: #ffac33;
+ --dark-orange: #f89808;
+}
+
+body {
+ background-color: var(--dark-grey);
+ color: var(--light-grey);
+}
+
+body,
+#message-input:placeholder-shown {
+ text-align: center;
+}
+
+textarea {
+ max-width: 90%;
+}
+
+.main-text {
+ margin: 25px 0;
+}
+
+.title {
+ font-size: 2.5rem;
+}
+
+.description {
+ margin-top: 15px;
+ font-size: 1.4rem;
+}
+
+.message-label {
+ display: block;
+ margin-bottom: 20px;
+ font-size: 1.5rem;
+}
+
+#message-input:placeholder-shown,
+textarea {
+ font-size: 1.1rem;
+}
+
+.btn {
+ display: block;
+ cursor: pointer;
+ width: 200px;
+ margin: 10px auto;
+ color: var(--dark-grey);
+ background-color: var(--gold);
+ background-image: linear-gradient(var(--golden-yellow), var(--orange));
+ border-color: var(--gold);
+ border-width: 3px;
+}
+
+.btn:hover {
+ background-image: linear-gradient(var(--yellow), var(--dark-orange));
+}
+
+#result {
+ font-size: 2rem;
+ margin: 20px 0;
+}
+
+.footer {
+ margin-top: 10px;
+}
+```
+
+```js
+const messageInput = document.getElementById("message-input");
+const result = document.getElementById("result");
+const checkMessageButton = document.getElementById("check-message-btn");
+
+const helpRegex = /please help|assist me/i;
+const dollarRegex = /[0-9]+ (?:hundred|thousand|million|billion)? dollars/i;
+const freeRegex = /(?:^|\s)fr[e3][e3] m[o0]n[e3]y(?:$|\s)/i;
+const stockRegex = /(?:^|\s)[s5][t7][o0][c{[(]k [a@4]l[e3]r[t7](?:$|\s)/i;
+const dearRegex = /(?:^|\s)d[e3][a@4]r fr[i1|][e3]nd(?:$|\s)/i;
+
+const denyList = [helpRegex, dollarRegex, freeRegex, stockRegex, dearRegex];
+
+const isSpam = (msg) => denyList.some((regex) => regex.test(msg));
+
+checkMessageButton.addEventListener("click", () => {
+ if (messageInput.value === "") {
+ alert("Please enter a message.");
+ return;
+ }
+
+ result.textContent = isSpam(messageInput.value)
+ ? "Oh no! This looks like a spam message."
+ : "This message does not seem to contain any spam.";
+ messageInput.value = "";
+});
+```
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-build-a-recipe-project/top-build-a-recipe-project.md b/curriculum/challenges/swahili/16-the-odin-project/top-build-a-recipe-project/top-build-a-recipe-project.md
new file mode 100644
index 00000000000..39441cd555d
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-build-a-recipe-project/top-build-a-recipe-project.md
@@ -0,0 +1,204 @@
+---
+id: 6391d1a4f7ac71efd0621380
+title: Build a Recipe Page Project
+challengeType: 14
+dashedName: top-build-a-recipe-project
+---
+
+# --description--
+
+The website will consist of a main index page which will have links to a few recipes. The website won’t look very pretty by the time you’ve finished.
+
+**User Stories:**
+
+1. Your recipe page should contain a `DOCTYPE` tag.
+1. Your recipe page should include an `html` element with a `head` and `body` element as children.
+1. You should have a `title` element within the `head` element with the text `The Odin Recipes`.
+1. You should see an `h1` element that has the text `Creamy Chocolate Fudge`.
+1. You should see an image with the url `*placeholder-fcc-cdn*` with a fitting `alt` text.
+1. There should be an `h2` element with the text `Description` under the image.
+1. You should see a couple of paragraphs under `Description` that describe the recipe.
+1. There should be an `h2` element with the text `Ingredients`
+1. Under the `Ingredients` heading there should be an unordered list with the ingredients needed for the recipe.
+1. Under the list of ingredients add another heading called `Steps`.
+1. You should see an ordered list with a couple of steps needed to complete the recipe.
+1. Under the steps there should be an `h2` element with the text `More Recipes`
+1. You should see a couple of links to other recipes inside an unordered list which has a couple of list items with anchor elements within.
+1. These anchor elements should have `href` attribute with the value set to `#`
+
+# --hints--
+
+You should have a `DOCTYPE` tag.
+
+```js
+assert(code.match(//gi));
+```
+
+You should have a `html` element with `head` and `body` element.
+
+```js
+const html = document.querySelectorAll('html')[0];
+const head = document.querySelectorAll('html > head')[0];
+const body = document.querySelectorAll('html > body')[0];
+
+assert(html && head && body);
+```
+
+You should have a `title` element within the `head` element that contains the text `The Odin Recipes`.
+
+```js
+assert(document.querySelectorAll('HEAD > TITLE')[0].innerText == 'The Odin Recipes');
+```
+
+You should have a `h1` element within your `body` element that contains the text `Creamy Chocolate Fudge`.
+
+```js
+assert(document.querySelectorAll('BODY > H1')[0].innerText == 'Creamy Chocolate Fudge');
+```
+
+You should have an image with the url `*placeholder-fcc-cdn*` with an `alt` attribute that has a fitting text.
+
+```js
+const img = document.querySelectorAll('IMG')[0];
+
+assert(img && img.alt !='' && img.src === 'https://i.imgur.com/p0J5baJ.jpg')
+```
+
+You should have an `h2` element with the text `Description`.
+
+```js
+const h2 = document.querySelectorAll('H2')[0];
+
+assert(h2.innerText == 'Description');
+```
+
+You should have at least two `p` elements describing the recipe.
+
+```js
+const paragraphs = document.querySelectorAll('P');
+
+assert(paragraphs.length > 1);
+```
+
+You should have an `h2` element with the text `Ingredients`.
+
+```js
+const h2 = document.querySelectorAll('H2')[1];
+
+assert(h2.innerText == 'Ingredients');
+```
+
+You should have an unordered list `
` with some ingredients as the list items ``.
+
+```js
+const unorderedList = document.querySelectorAll('UL')[0];
+const listItems = document.querySelectorAll('UL > LI');
+
+assert(unorderedList && listItems && listItems.length > 1);
+```
+
+You should have an `h2` element with the text `Steps`.
+
+```js
+const h2 = document.querySelectorAll('H2')[2];
+
+assert(h2.innerText == 'Steps');
+```
+
+You should have a `` with the the steps as the list items ``.
+
+```js
+const orderedList = document.querySelectorAll('OL')[0];
+const listItems = document.querySelectorAll('OL > LI');
+
+assert(orderedList && listItems && listItems.length > 1);
+```
+
+You should have an `h2` element with the text `More Recipes`.
+
+```js
+const h2 = document.querySelectorAll('H2')[3];
+
+assert(h2.innerText == 'More Recipes');
+```
+
+You should have an unordered list `` element with list items `` that contain `` tags which lead to other recipes.
+
+```js
+const unorderedList = document.querySelectorAll('UL')[1];
+const listItems = unorderedList.querySelectorAll('LI');
+
+const allAreListItems = unorderedList.children.length == listItems.length;
+
+const containsAnchors = [...listItems].every(function(listItem) {
+ return listItem.querySelector("a") !== null;
+});
+
+assert(unorderedList && allAreListItems && containsAnchors && listItems.length > 1);
+```
+
+Your anchor tags linking to the recipes should have a `href` attribute with the value set to `#`
+
+```js
+const anchorTags = document.querySelectorAll("a");
+
+const allAnchorsHaveHrefHash = [...anchorTags].every(function(anchorTag) {
+ return anchorTag.hasAttribute("href") && anchorTag.getAttribute("href") === "#";
+});
+
+assert(allAnchorsHaveHrefHash && anchorTags.length > 0);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+```
+
+```css
+
+```
+
+## --solutions--
+
+```html
+
+
+
+ The Odin Recipes
+
+
+ Creamy Chocolate Fudge
+
+ Description
+ This recipe is for a rich and creamy chocolate fudge that is sure to satisfy your sweet tooth. It's perfect for a special occasion or as a tasty treat for any time of the year.
+ This recipe is easy to follow and only requires a few simple ingredients. With just a few steps, you'll be able to create a delicious dessert that everyone will love.
+ Ingredients
+
+ 1 cup sugar
+ 1/2 cup unsalted butter
+ 1/4 cup milk
+ 1/4 cup cocoa powder
+ 1/4 cup chocolate chips
+ 1/4 tsp salt
+ 1 tsp vanilla extract
+
+ Steps
+
+ In a medium saucepan, melt the butter over medium heat.
+ Add the sugar, milk, cocoa powder, and salt to the saucepan and stir until well combined.
+ Bring the mixture to a boil, stirring constantly, and then reduce the heat to low and simmer for 5 minutes.
+ Remove the saucepan from the heat and stir in the chocolate chips and vanilla extract until the chocolate is melted and the mixture is smooth.
+ Pour the fudge into a greased 8-inch square pan and let it cool completely before cutting into squares.
+
+ More Recipes
+
+
+
+```
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-a.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-a.md
new file mode 100644
index 00000000000..cb894a8ffd3
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-a.md
@@ -0,0 +1,194 @@
+---
+id: 63ee3f71381756f9716727ef
+title: CSS Foundations Exercise A
+challengeType: 14
+dashedName: css-foundations-exercise-a
+---
+
+# --description--
+
+**Objective:** In this exercise, you're going to practice adding CSS to an HTML file using all three methods: external CSS, internal CSS, and inline CSS. You should only be using type selectors for this exercise when adding styles via the external and internal methods. You should also use keywords for colors (e.g. "blue") instead of using `RGB` or `HEX` values.
+
+## User Stories
+
+1. You should see a `div` element with a `red` background, `white` text, a font size of `32px`, center aligned, and `bold`.
+
+1. The CSS of the `div` element should be added externally by using a type selector.
+
+1. You should see a `p` element with a `green` background, `white` text, and a font size of `18px`.
+
+1. The CSS of the `p` element should be added internally by using a type selector.
+
+1. You should see a `button` element with an `orange` background and a font size of `18px`.
+
+1. The CSS of the `button` element should have an inline style.
+
+# --hints--
+
+There should be one `div` element. It should contain some text and be aligned in the center.
+
+```js
+const aligned = new __helpers.CSSHelp(document).getStyle('div')?.getPropertyValue('text-align');
+
+assert(aligned === 'center');
+assert(document.getElementsByTagName('DIV')?.length == 1);
+assert(document.getElementsByTagName('DIV')?.[0]?.innerText.length > 0)
+```
+
+The `div` element should have a `background-color` of `red` and a text color of `white`.
+
+```js
+
+const bgc = new __helpers.CSSHelp(document).getStyle('div')?.getPropertyValue('background-color');
+
+const color = new __helpers.CSSHelp(document).getStyle('div')?.getPropertyValue('color');
+
+assert(bgc === 'red');
+assert(color === 'white');
+```
+
+The `div` element should have a `font-weight` of `bold` and a `font-size` of `32px`.
+
+```js
+const fontSize = new __helpers.CSSHelp(document).getStyle('div')?.getPropertyValue('font-size');
+const fontWeight = new __helpers.CSSHelp(document).getStyle('div')?.getPropertyValue('font-weight');
+
+assert(fontSize === '32px');
+assert(fontWeight === 'bold');
+```
+
+The `div` element should have its CSS added externally.
+
+```js
+assert(!document.getElementsByTagName('style')?.[0]?.innerText.includes('div'));
+assert(!document.getElementsByTagName('div')?.[0]?.hasAttribute('style'));
+```
+
+There should be one `p` element and it should contain some text.
+
+```js
+assert(document.getElementsByTagName('P')?.length == 1);
+assert(document.getElementsByTagName('P')?.[0]?.innerText.length > 0)
+```
+
+The `p` element should have its `color` set to `white`.
+
+```js
+const color = new __helpers.CSSHelp(document).getStyle('div')?.getPropertyValue('color');
+
+assert(color == 'white');
+```
+
+The `p` element should have a `font-size` of `18px`.
+
+```js
+const styleTag = document.getElementsByTagName('style')?.[0];
+let pHasFontSize18 = false;
+
+const rules = styleTag?.sheet?.cssRules || styleTag?.sheet?.rules;
+if (rules) {
+ for (let j = 0; j < rules.length; j++) {
+ const rule = rules[j];
+ if (rule.selectorText === 'p' && rule.style.fontSize === '18px') {
+ pHasFontSize18 = true;
+ break;
+ }
+ }
+}
+
+assert(pHasFontSize18);
+```
+
+The `p` element should have its style added internally.
+
+```js
+
+const styleTag = document.getElementsByTagName('style')?.[0];
+let pIsStyled = false;
+
+
+const rules = styleTag?.sheet?.cssRules || styleTag?.sheet?.rules;
+if (rules) {
+ for (let j = 0; j < rules.length; j++) {
+ const rule = rules[j];
+ if (rule.selectorText === 'p') {
+ pIsStyled = true;
+ break;
+ }
+ }
+}
+
+assert(pIsStyled);
+```
+
+The `button` element should have its `background-color` set to `orange`.
+
+```js
+assert(document.getElementsByTagName('button')?.[0]?.style.backgroundColor === 'orange')
+```
+
+The `button` element should have its `font-size` set to `18px`.
+
+```js
+assert(document.getElementsByTagName('button')?.[0]?.style.fontSize === '18px')
+```
+
+The `button` element should have an inline style.
+
+```js
+assert(document.getElementsByTagName('button')?.[0]?.hasAttribute('style'));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ Exercise A
+
+
+
+
+
+```
+
+```css
+/* style.css */
+```
+
+# --solutions--
+
+```html
+
+
+
+ My Styling Example
+
+
+
+
+ Hello World!
+ This is a paragraph.
+ Click Me
+
+
+```
+
+```css
+div {
+ background-color: red;
+ color: white;
+ font-size: 32px;
+ text-align: center;
+ font-weight: bold;
+}
+```
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-b.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-b.md
new file mode 100644
index 00000000000..92905cb7265
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-b.md
@@ -0,0 +1,184 @@
+---
+id: 63ee3fe4381756f9716727f0
+title: CSS Foundations Exercise B
+challengeType: 14
+dashedName: css-foundations-exercise-b
+---
+
+# --description--
+
+**Objective:** There are several elements in the HTML file provided, which you will have to add either class or ID attributes to. You will then have to add rules in the CSS file provided using the correct selector syntax.
+
+## User Stories
+
+1. You should see a `yellow` background for all odd numbered elements in the list.
+
+1. You should have a `class` selector used for all odd numbered elements in the list.
+
+1. You should see that the second element in the list has `blue` text and a `font-size` of `36px`.
+
+1. The `font-size` and text color on the second element should be set by using an `id` attribute.
+
+1. You should see that the third element in the list has a `font-size` of `24px`.
+
+1. The `font-size` on the third element should be set by using a `class` attribute.
+
+1. You should see that the fourth element in the list has a `red` background, a `font-size` of `24px`, and a `font-weight` of `bold`.
+
+1. The `font-size` of the fourth element should be set with a `class` attribute. The `font-weight` and the color should be set with an `id` attribute.
+
+# --hints--
+
+Every odd element should have a `class` attribute.
+
+```js
+const p = Array.from(document.querySelectorAll('P'));
+
+const everyPHasClass = p?.every((paragraph) => paragraph.classList.length > 0);
+
+assert(everyPHasClass);
+```
+
+Your odd elements should have a `background-color` of `yellow`.
+
+```js
+const p = Array.from(document.querySelectorAll('P'));
+
+const everyPhasBackgroundColor = p?.every((paragraph) => {
+
+ const style = getComputedStyle(paragraph);
+
+ return style?.backgroundColor === 'rgb(255, 255, 0)';
+})
+```
+
+Your second element should have `blue` text and a `font-size` of `36px`.
+
+```js
+const secondElementId = document.querySelectorAll('div')?.[0]?.id;
+
+const style = new __helpers.CSSHelp(document).getStyle(`#${secondElementId}`);
+
+assert.equal(style?.color, 'rgb(0, 0, 255)')
+assert.equal(style?.fontSize, '36px');
+```
+
+Your third element should have text and a `font-size` of `24px`.
+
+```js
+const thirdElement = document.querySelectorAll('p')?.[1];
+
+assert(thirdElement?.innerText?.length > 0);
+
+const thirdElementClasses = Array.from(thirdElement?.classList?.values());
+
+assert(thirdElementClasses.some(thirdElementClass => {
+
+ const style = new __helpers.CSSHelp(document).getStyle(`.${thirdElementClass}`);
+
+ return style?.fontSize === '24px';
+
+}))
+
+```
+
+The fourth element should have a `font-size` of `24px`.
+
+```js
+const fourthElementClass = document.querySelectorAll('div')?.[1]?.classList[0];
+
+const style = new __helpers.CSSHelp(document).getStyle(`.${fourthElementClass}`);
+
+assert(style?.fontSize === '24px');
+```
+
+The fourth element should have a `red` `background-color`.
+
+```js
+const fourthElement = document.querySelectorAll('div')?.[1]?.id;
+
+const style = new __helpers.CSSHelp(document).getStyle(`#${fourthElement}`);
+
+assert(style?.backgroundColor === 'red');
+```
+
+The fourth element should have a `font-weight` of `bold`.
+
+```js
+const fourthElement = document.querySelectorAll('div')?.[1]?.id;
+
+const style = new __helpers.CSSHelp(document).getStyle(`#${fourthElement}`);
+
+assert(style?.fontWeight === 'bold');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Class and ID Selectors
+
+
+
+ Number 1 - I'm a class!
+ Number 2 - I'm one ID.
+ Number 3 - I'm a class, but cooler!
+ Number 4 - I'm another ID.
+ Number 5 - I'm a class!
+
+
+```
+
+```css
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
+ Class and ID Selectors
+
+
+
+ Number 1 - I'm a class!
+ Number 2 - I'm one ID.
+ Number 3 - I'm a class, but cooler!
+ Number 4 - I'm another ID.
+ Number 5 - I'm a class!
+
+
+```
+
+```css
+.odd {
+ background-color: rgb(255, 167, 167);
+ font-family: Verdana, "DejaVu Sans", sans-serif;
+}
+
+.adjust-font-size {
+ font-size: 24px;
+}
+
+#two {
+ color: #0000ff;
+ font-size: 36px;
+}
+
+#four {
+ background-color: red;
+ font-weight: bold;
+}
+```
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-c.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-c.md
new file mode 100644
index 00000000000..b569e271014
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-c.md
@@ -0,0 +1,162 @@
+---
+id: 63ee3fe9381756f9716727f1
+title: CSS Foundations Exercise C
+challengeType: 14
+dashedName: css-foundations-exercise-c
+---
+
+# --description--
+
+Let's build a little off the previous exercise, in which you added multiple classes to a single element in order to apply two different rules to it.
+
+1. You should see a black background and white text on the first `button` element.
+1. You should see a yellow background on the second `button` element.
+1. You should set a font size of `28px` using a grouping selector.
+1. You should have a list of fonts containing `Helvetica` and `Times New Roman` with `sans-serif` as a fallback.
+1. You should see a unique class name on each element.
+1. You should have a grouping selector for styles that both elements share.
+
+# --hints--
+
+You should have a `black` background on the first element.
+
+```js
+const classes = document.querySelectorAll('button')?.[0].classList;
+
+const style = new __helpers.CSSHelp(document).getStyle(`.${classes[0]}`);
+
+assert.equal(style?.backgroundColor, 'black');
+
+```
+
+Your first element should have a text color of `white`.
+
+```js
+
+const classes = document.querySelectorAll('button')?.[0].classList;
+
+const style = new __helpers.CSSHelp(document).getStyle(`.${classes[0]}`);
+
+assert.equal(style?.color, 'white');
+
+```
+
+You should set the `font-size` for both elements to `28px` using a grouping selector.
+
+```js
+const classOne = document.querySelectorAll('button')?.[0].classList?.[0];
+const classTwo = document.querySelectorAll('button')?.[1].classList?.[0];
+
+function eitherOr() {
+ const a = new __helpers.CSSHelp(document)
+ return a.getStyle(`.${classOne}, .${classTwo}`) ?? a.getStyle(`.${classTwo}, .${classOne}`);
+}
+assert.equal(eitherOr()?.fontSize, '28px');
+```
+
+You have a unique class name on each element.
+
+```js
+const elementOneClasses = document.querySelectorAll('button')?.[0].classList;
+const elementTwoClasses = document.querySelectorAll('button')?.[1].classList;
+
+for(let i = 0; i < elementOneClasses.length; i++){
+ assert(![...elementTwoClasses].includes(elementOneClasses[i]));
+}
+
+```
+
+You should have a grouping selector for styles that both elements share.
+
+```js
+const classOne = document.querySelectorAll('button')?.[0].classList?.[0];
+const classTwo = document.querySelectorAll('button')?.[1].classList?.[0];
+
+function eitherOr() {
+ const a = new __helpers.CSSHelp(document)
+ return a.getStyle(`.${classOne}, .${classTwo}`) ?? a.getStyle(`.${classTwo}, .${classOne}`);
+}
+assert.exists(eitherOr());
+```
+
+You should have a list of fonts containing `Helvetica` and `Times New Roman` with `sans-serif` as a fallback.
+
+```js
+const classOne = document.querySelectorAll('button')?.[0].classList?.[0];
+const classTwo = document.querySelectorAll('button')?.[1].classList?.[0];
+
+function eitherOr() {
+ const a = new __helpers.CSSHelp(document)
+ return a.getStyle(`.${classOne}, .${classTwo}`) ?? a.getStyle(`.${classTwo}, .${classOne}`);
+}
+
+assert.equal(eitherOr()?.fontFamily, 'Helvetica, "Times New Roman", sans-serif');
+```
+
+Each element should only have one class.
+
+```js
+const elementOneClasses = document.querySelectorAll('button')?.[0].classList;
+const elementTwoClasses = document.querySelectorAll('button')?.[1].classList;
+
+assert(elementOneClasses.length === 1 && elementTwoClasses.length === 1);
+```
+
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ Grouping Selectors
+
+
+
+ Click Me!
+ No, Click Me!
+
+
+```
+
+```css
+
+```
+
+# --solutions--
+
+```html
+
+
+
+
+
+
+ Grouping Selectors
+
+
+
+ Click Me!
+ No, Click Me!
+
+
+```
+
+```css
+.inverted,
+.fancy {
+ font-family: Helvetica, "Times New Roman", sans-serif;
+ font-size: 28px;
+}
+
+.inverted {
+ background-color: black;
+ color: white;
+}
+
+.fancy {
+ background-color: yellow;
+}
+```
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-d.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-d.md
new file mode 100644
index 00000000000..a1deee676a2
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-d.md
@@ -0,0 +1,130 @@
+---
+id: 63ee3ff1381756f9716727f2
+title: CSS Foundations Exercise D
+challengeType: 14
+dashedName: css-foundations-exercise-d
+---
+
+# --description--
+
+With this exercise, we've provided you a completed HTML file, so you will only have to edit the CSS file. For this exercise, it's more important to understand how chaining different selectors works than how to actually add the attributes.
+
+1. You should see a `width` of `300px` on the `avatar` and `proportioned` class.
+1. You should give it a height so that it retains its original square proportions (don't hardcode in a pixel value for the height!).
+1. You should give the elements with both the `avatar` and `distorted` classes a `width` of `200px`.
+1. You should give it a `height` twice as big as it's width.
+
+# --hints--
+
+You should have a `width` of `300px` on the `avatar` and `proportioned` class.
+
+```js
+const style = new __helpers.CSSHelp(document).getStyle(`.avatar.proportioned`) || new __helpers.CSSHelp(document).getStyle(`.proportioned.avatar`);
+assert(style?.width === '300px');
+```
+
+You should have a height of `auto` on the `avatar` and `proportioned` class.
+
+```js
+const style = new __helpers.CSSHelp(document).getStyle(`.avatar.proportioned`) || new __helpers.CSSHelp(document).getStyle(`.proportioned.avatar`)
+assert(style?.height === 'auto');
+```
+
+You should use a chaining selector on the `avatar` and `proportioned` class.
+
+```js
+const style = new __helpers.CSSHelp(document).getStyle(`.avatar.proportioned`) || new __helpers.CSSHelp(document).getStyle(`.proportioned.avatar`);
+assert(style);
+```
+
+You should have a `width` of `200px` on the `avatar` and `distorted` class.
+
+```js
+const style = new __helpers.CSSHelp(document).getStyle(`.avatar.distorted`) || new __helpers.CSSHelp(document).getStyle(`.distorted.avatar`);
+assert(style?.width === '200px');
+```
+
+You should use a chaining selector on the `avatar` and `distorted` class.
+
+```js
+const style = new __helpers.CSSHelp(document).getStyle(`.avatar.distorted`) || new __helpers.CSSHelp(document).getStyle(`.distorted.avatar`);
+assert(style);
+```
+
+You should have a `height` two times the width on the `avatar` and `distorted` class.
+
+```js
+const style = new __helpers.CSSHelp(document).getStyle(`.avatar.distorted`) || new __helpers.CSSHelp(document).getStyle(`.distorted.avatar`);
+assert(style?.height === '400px');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```css
+
+```
+
+```html
+
+
+
+ Chaining Selectors
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
+
+# --solutions--
+
+```html
+
+
+
+ Chaining Selectors
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+.avatar.proportioned {
+ height: auto;
+ width: 300px;
+}
+
+.avatar.distorted {
+ height: 400px;
+ width: 200px;
+}
+```
+
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-e.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-e.md
new file mode 100644
index 00000000000..1f1a60542e3
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations-projects/css-foundations-exercise-e.md
@@ -0,0 +1,166 @@
+---
+id: 63ee3ff8381756f9716727f3
+title: CSS Foundations Exercise E
+challengeType: 14
+dashedName: css-foundations-exercise-e
+---
+
+# --description--
+
+Understanding how combinators work can become a lot easier when you start playing around with them and see what exactly is affected by them versus what isn't.
+
+The goal of this exercise is to apply styles to elements that are descendants of another element, while leaving elements that aren't descendants of that element unstyled.
+
+1. You should see a `yellow` background for `p` elements that are descendants of the `div` element.
+1. You should see a text color of `red` for elements that are descendants of the `div` element.
+1. You should see a font size of `20px` for elements that are descendants of the `div` element.
+1. You should center align text for elements that are descendants of the `div` element.
+
+# --hints--
+
+You should have a background color of `yellow` on your descendants.
+
+```js
+const styleOne = new __helpers.CSSHelp(document).getStyle('.container .text');
+const styleTwo = new __helpers.CSSHelp(document).getStyle('div p');
+const styleThree = new __helpers.CSSHelp(document).getStyle('div .text');
+const styleFour = new __helpers.CSSHelp(document).getStyle('.container p');
+
+const styles = [styleOne, styleTwo, styleThree, styleFour];
+
+function getCorrectStyle(){
+ for(let i = 0; i < styles.length; i++){
+ if(styles[i] != undefined){
+ return styles[i];
+ }
+ }
+}
+
+assert(getCorrectStyle()?.backgroundColor === 'yellow');
+
+```
+
+You should have a text color of `red` on your descendants.
+
+```js
+const styleOne = new __helpers.CSSHelp(document).getStyle('.container .text');
+const styleTwo = new __helpers.CSSHelp(document).getStyle('div p');
+const styleThree = new __helpers.CSSHelp(document).getStyle('div .text');
+const styleFour = new __helpers.CSSHelp(document).getStyle('.container p');
+
+const styles = [styleOne, styleTwo, styleThree, styleFour];
+
+function getCorrectStyle(){
+ for(let i = 0; i < styles.length; i++){
+ if(styles[i] != undefined){
+ return styles[i];
+ }
+ }
+}
+
+assert(getCorrectStyle()?.color === 'red');
+
+```
+
+You should have a font size of `20px` on your descendants.
+
+```js
+const styleOne = new __helpers.CSSHelp(document).getStyle('.container .text');
+const styleTwo = new __helpers.CSSHelp(document).getStyle('div p');
+const styleThree = new __helpers.CSSHelp(document).getStyle('div .text');
+const styleFour = new __helpers.CSSHelp(document).getStyle('.container p');
+
+const styles = [styleOne, styleTwo, styleThree, styleFour];
+
+function getCorrectStyle(){
+ for(let i = 0; i < styles.length; i++){
+ if(styles[i] != undefined){
+ return styles[i];
+ }
+ }
+}
+
+assert(getCorrectStyle()?.fontSize === '20px');
+
+```
+
+You should center align the text on your descendants.
+
+```js
+const styleOne = new __helpers.CSSHelp(document).getStyle('.container .text');
+const styleTwo = new __helpers.CSSHelp(document).getStyle('div p');
+const styleThree = new __helpers.CSSHelp(document).getStyle('div .text');
+const styleFour = new __helpers.CSSHelp(document).getStyle('.container p');
+
+const styles = [styleOne, styleTwo, styleThree, styleFour];
+
+function getCorrectStyle(){
+ for(let i = 0; i < styles.length; i++){
+ if(styles[i] != undefined){
+ return styles[i];
+ }
+ }
+}
+
+assert(getCorrectStyle()?.textAlign === 'center');
+
+```
+
+# --seed--
+
+## --seed-contents--
+```css
+```
+
+```html
+
+
+
+ Descendant Combinator
+
+
+
+
+
This should be styled.
+
+ This should be unstyled.
+ This should be unstyled.
+
+
This should be styled.
+
This should be styled.
+
+
+
+```
+
+# --solutions--
+
+```html
+
+
+
+ Descendant Combinator
+
+
+
+
+
This should be styled.
+
+ This should be unstyled.
+ This should be unstyled.
+
+
This should be styled.
+
This should be styled.
+
+
+
+```
+
+```css
+.container .text {
+ background-color: yellow;
+ color: red;
+ font-size: 20px;
+ text-align: center;
+}
+```
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-a.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-a.md
new file mode 100644
index 00000000000..425d54224f6
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-a.md
@@ -0,0 +1,53 @@
+---
+id: 63ee351d0d8d4841c3a7091a
+videoId: LGQuIIv2RVA
+title: CSS Foundations Question A
+challengeType: 15
+dashedName: css-foundations-question-a
+---
+
+# --description--
+
+A type selector (or element selector) will select all elements of the given element type, and the syntax is just the name of the element:
+
+```html
+
+
+Hello, World!
+Hello again!
+Hi...
+Okay, bye.
+```
+
+```css
+/* styles.css */
+
+div {
+ color: white;
+}
+```
+
+Here, all three `` elements would be selected, while the `
` element wouldn’t be.
+
+# --question--
+
+## --text--
+
+Which of the following best describes the CSS code given above?
+
+## --answers--
+
+The code applies a `white` color to all elements in the HTML file.
+
+---
+
+The code applies a `white` color to all `div` elements in the HTML file.
+
+---
+
+The code applies a `white` color to all `p` elements in the HTML file.
+
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-b.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-b.md
new file mode 100644
index 00000000000..aad3818d270
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-b.md
@@ -0,0 +1,75 @@
+---
+id: 63ee35240d8d4841c3a7091b
+videoId: LGQuIIv2RVA
+title: CSS Foundations Question B
+challengeType: 15
+dashedName: css-foundations-question-b
+---
+
+# --description--
+
+Class selectors will select all elements with the given `class`, which is just an attribute you place on an HTML element. Here’s how you add a class to an HTML tag and select it in CSS:
+
+```html
+
+
+
+ Please agree to our terms of service.
+
+```
+
+```css
+/* styles.css */
+
+.alert-text {
+ color: red;
+}
+```
+
+Note the syntax for `class` selectors: a period immediately followed by the case-sensitive value of the class attribute. Classes aren’t required to be unique, so you can use the same `class` on as many elements as you want.
+
+Another thing you can do with the `class` attribute is to add multiple classes to a single element as a space-separated list, such as `class="alert-text severe-alert"`. Since whitespace is used to separate `class` names like this, you should never use spaces for multi-worded names and should use a hyphen instead.
+
+## ID Selectors
+ID selectors are similar to `class` selectors. They select an element with the given `id`, which is another attribute you place on an HTML element:
+
+```html
+
+
+
My Awesome 90's Page
+```
+
+```css
+/* styles.css */
+
+#title {
+ background-color: red;
+}
+```
+
+Instead of a period, you use a hashtag immediately followed by the case-sensitive value of the `id` attribute. A common pitfall is people overusing the `id` attribute when they don’t necessarily need to, and when classes will suffice. While there are cases where using an `id` makes sense or is needed, such as taking advantage of specificity or having links redirect to a section on the current page, you should use `id`s sparingly (if at all).
+
+The major difference between classes and IDs is that an element can only have one `id`. An `id` cannot be repeated on a single page, and the `id` attribute should not contain any whitespace at all.
+
+# --question--
+
+## --text--
+
+What is the syntax for class and ID selectors?
+
+## --answers--
+
+To select a `class` you use `$` and to select an `id` you use `#`
+
+---
+
+To select a `class` you use `.` and to select an `id` you use `*`
+
+---
+
+To select a `class` you use `.` and to select an `id` you use `#`
+
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-c.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-c.md
new file mode 100644
index 00000000000..eb36575f5e7
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-c.md
@@ -0,0 +1,90 @@
+---
+id: 63ee352b0d8d4841c3a7091c
+videoId: LGQuIIv2RVA
+title: CSS Foundations Question C
+challengeType: 15
+dashedName: css-foundations-question-c
+---
+
+# --description--
+
+What if you have two groups of elements that share some of their style declarations?
+
+```css
+.read {
+ color: white;
+ background-color: black;
+ /* several unique declarations */
+}
+
+.unread {
+ color: white;
+ background-color: black;
+ /* several unique declarations */
+}
+```
+
+Both our `.read` and `.unread` selectors share the `color: white;` and `background-color: black;` declarations, but otherwise have several of their own unique declarations. To cut down on the repetition, you can group these two selectors together as a comma-separated list:
+
+```css
+.read,
+.unread {
+ color: white;
+ background-color: black;
+}
+
+.read {
+ /* several unique declarations */
+}
+
+.unread {
+ /* several unique declarations */
+}
+```
+
+Both of the examples above (with and without grouping) will have the same result, but the second example reduces the repetition of declarations and makes it easier to edit either the `color` or `background-color` for both classes at once.
+
+# --question--
+
+## --text--
+
+How would you apply a single rule to two different selectors, `.red-box` and `.yellow-box`?
+
+## --answers--
+
+```css
+.red-box,
+.yellow-box {
+ width: 25px;
+ height: 25px;
+}
+```
+
+---
+
+```css
+.red-box {
+ width: 25px;
+ height: 25px;
+}
+
+.yellow-box {
+ width: 25px;
+ height: 25px;
+}
+```
+
+---
+
+```css
+.red-box {
+ width: 25px;
+ .yellow-box {
+ height: 25px;
+ }
+}
+```
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-d.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-d.md
new file mode 100644
index 00000000000..4cfe1014093
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-d.md
@@ -0,0 +1,86 @@
+---
+id: 63ee35300d8d4841c3a7091d
+videoId: LGQuIIv2RVA
+title: CSS Foundations Question D
+challengeType: 15
+dashedName: css-foundations-question-d
+---
+
+# --description--
+
+Another way to use selectors is to chain them as a list without any separation. Let’s say you had the following HTML:
+
+```html
+
+
+
This is where a preview for a post might go.
+
+```
+
+You have two elements with the `subsection` class that have some sort of unique styles, but what if you only want to apply a separate rule to the element that also has `header` as a second class? Well, you could chain both the `class` selectors together in your CSS like so:
+
+```css
+.subsection.header {
+ color: red;
+}
+```
+
+What `.subsection.header` does is it selects any element that has both the `subsection` and `header` classes. Notice how there isn’t any space between the `.subsection` and `.header` `class` selectors. This syntax basically works for chaining any combination of selectors, except for chaining more than one type selector.
+
+This can also be used to chain a class and an ID, as shown below:
+
+```html
+
+
+
This is where a preview for a post might go.
+
+```
+
+You can take the two elements above and combine them with the following:
+
+```css
+.subsection.header {
+ color: red;
+}
+
+.subsection#preview {
+ color: blue;
+}
+```
+
+In general, you can’t chain more than one type selector since an element can’t be two different types at once. For example, chaining two type selectors like `div` and `p` would give us the selector `divp`, which wouldn’t work since the selector would try to find a literal `
` element, which doesn’t exist.
+
+# --question--
+
+## --text--
+
+Given an element that has an `id` of `title` and a `class` of `primary`, how would you use both attributes for a single rule?
+
+## --answers--
+
+```css
+.title.primary {
+ ...
+}
+```
+
+---
+
+```css
+.title > primary {
+ ...
+}
+```
+
+---
+
+```css
+#title.primary {
+ ...
+}
+```
+
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-e.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-e.md
new file mode 100644
index 00000000000..b6038767181
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-e.md
@@ -0,0 +1,61 @@
+---
+id: 63ee35370d8d4841c3a7091e
+videoId: LGQuIIv2RVA
+title: CSS Foundations Question E
+challengeType: 15
+dashedName: css-foundations-question-e
+---
+
+# --description--
+
+Combinators allow us to combine multiple selectors differently than either grouping or chaining them, as they show a relationship between the selectors. There are four types of combinators in total, but for right now we’re going to only show you the descendant combinator, which is represented in CSS by a single space between selectors. A descendant combinator will only cause elements that match the last selector to be selected if they also have an ancestor (parent, grandparent, etc) that matches the previous selector.
+
+So something like `.ancestor .child` would select an element with the class `child` if it has an ancestor with the class `ancestor`. Another way to think of it is child will only be selected if it is nested inside of `ancestor`, no matter how deep. Take a quick look at the example below and see if you can tell which elements would be selected based on the CSS rule provided:
+
+```html
+
+
+
+
+
+```
+
+```css
+/* styles.css */
+
+.ancestor .contents {
+ /* some declarations */
+}
+```
+
+In the above example, the first two elements with the `contents` class (`B` and `C`) would be selected, but that last element (`D`) won’t be. Was your guess correct?
+
+There’s really no limit to how many combinators you can add to a rule, so `.one .two .three .four` would be totally valid. This would just select an element that has a class of `four` if it has an ancestor with a class of `three`, and if that ancestor has its own ancestor with a class of `two`, and so on. You generally want to avoid trying to select elements that need this level of nesting, though, as it can get pretty confusing and long, and it can cause issues when it comes to specificity.
+
+# --question--
+
+## --text--
+
+What does the descendant combinator do?
+
+## --answers--
+
+It groups certain classes together which share the same declarations.
+
+---
+
+It gives the ability to select an element that shares the same `class` and `id`.
+
+---
+
+It allows you to select an element based on its relationship with its ancestor (parent, grandparent, and so on).
+
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-f.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-f.md
new file mode 100644
index 00000000000..5a18ff3b1a4
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-f.md
@@ -0,0 +1,47 @@
+---
+id: 63ee353e0d8d4841c3a7091f
+videoId: LGQuIIv2RVA
+title: CSS Foundations Question F
+challengeType: 15
+dashedName: css-foundations-question-f
+---
+
+# --description--
+
+Okay, you went over quite a bit so far. The only thing left for now is to go over how to add all this CSS to your HTML. There are three methods to do so.
+
+External CSS is the most common method you will come across, and it involves creating a separate file for the CSS and linking it inside of an HTML’s opening and closing `` tags with a self-closing ` ` element:
+
+First, you add a self-closing ` ` element inside of the opening and closing `` tags of the HTML file. The `href` attribute is the location of the CSS file, either an absolute URL or, what you’ll be utilizing, a URL relative to the location of the HTML file. In the example above, you are assuming both files are located in the same directory. The `rel` attribute is required, and it specifies the relationship between the HTML file and the linked file.
+
+Then inside of the newly created `styles.css` file, you have the selector (the `div` and `p`), followed by a pair of opening and closing curly braces, which create a “declaration block”. Finally, you place any declarations inside of the declaration block. `color: white;` is one declaration, with `color` being the property and `white` being the value, and `background-color: black;` is another declaration.
+
+A note on file names: `styles.css` is just what you went with as the file name here. You can name the file whatever you want as long as the file type is `.css`, though “style” or “styles” is most commonly used.
+
+A couple of the pros to this method are:
+
+1. It keeps your HTML and CSS separated, which results in the HTML file being smaller and making things look cleaner.
+2. You only need to edit the CSS in one place, which is especially handy for websites with many pages that all share similar styles.
+
+# --question--
+
+## --text--
+
+Which of the following best describes the purpose of the `rel` attribute in the ` ` element when linking an external CSS file to an HTML file?
+
+## --answers--
+
+It specifies the location of the CSS file relative to the location of the HTML file.
+
+---
+
+It specifies the relationship between the HTML file and the linked file.
+
+---
+
+It specifies the type of file being linked (e.g. "stylesheet").
+
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-g.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-g.md
new file mode 100644
index 00000000000..7da4a22a122
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-g.md
@@ -0,0 +1,54 @@
+---
+id: 63ee35450d8d4841c3a70920
+videoId: LGQuIIv2RVA
+title: CSS Foundations Question G
+challengeType: 15
+dashedName: css-foundations-question-g
+---
+
+# --description--
+
+Internal CSS (or embedded CSS) involves adding the CSS within the HTML file itself instead of creating a completely separate file. With the internal method, you place all the rules inside of a pair of opening and closing `
+
+...
+```
+
+This method can be useful for adding unique styles to a single page of a website, but it doesn’t keep things separate like the external method, and depending on how many rules and declarations there are it can cause the HTML file to get pretty big.
+
+# --question--
+
+## --text--
+
+Which of the following is a difference between internal and external CSS methods?
+
+## --answers--
+
+The external method places CSS rules in a separate file, while the internal method places CSS rules within the HTML file itself.
+
+---
+
+The internal method keeps CSS separate from HTML, while the external method embeds CSS directly in HTML.
+
+---
+
+The internal method uses ` ` element to link CSS to HTML, while the external method embeds CSS directly in HTML.
+
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-h.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-h.md
new file mode 100644
index 00000000000..2b39dd69ed3
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-css-foundations/css-foundations-question-h.md
@@ -0,0 +1,46 @@
+---
+id: 63ee354c0d8d4841c3a70921
+videoId: LGQuIIv2RVA
+title: CSS Foundations Question H
+challengeType: 15
+dashedName: css-foundations-question-h
+---
+
+# --description--
+
+Inline `CSS` makes it possible to add styles directly to `HTML` elements, though this method isn’t as recommended:
+
+```html
+
+ ...
+
+```
+
+The first thing to note is that there aren't any selectors here, since the styles are being added directly to the opening `` tag itself. Next, you have the `style` attribute, with its value within the pair of quotation marks being the declarations.
+
+If you need to add a unique style for a single element, this method can work just fine. Generally, though, this isn’t exactly a recommended way for adding CSS to HTML for a few reasons:
+
+It can quickly become pretty messy once you start adding a lot of declarations to a single element, causing your HTML file to become unnecessarily bloated. If you want many elements to have the same style, you would have to copy + paste the same style to each individual element, causing lots of unnecessary repetition and more bloat. Any inline CSS will override the other two methods, which can cause unexpected results. (While you won’t dive into it here, this can actually be taken advantage of).
+
+# --question--
+
+## --text--
+
+Which of the following is the main disadvantage of using inline CSS?
+
+## --answers--
+
+It can quickly become pretty messy once you start adding a lot of declarations to a single element, causing your HTML file to become unnecessarily bloated.
+
+---
+
+It requires using selectors, which can be complicated for beginners.
+
+---
+
+Any inline CSS will override the other two methods (internal and external), which can cause unexpected results.
+
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/elements-and-tags-question-a.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/elements-and-tags-question-a.md
new file mode 100644
index 00000000000..f4b05b12871
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/elements-and-tags-question-a.md
@@ -0,0 +1,54 @@
+---
+id: 637f4e0e72c65bc8e73dfe1e
+videoId: LGQuIIv2RVA
+title: Elements and Tags Question A
+challengeType: 15
+dashedName: elements-and-tags-question-a
+---
+
+# --description--
+
+Almost all elements on an HTML page are just pieces of content wrapped in opening and closing HTML tags.
+
+Opening tags tell the browser this is the start of an HTML element. They are comprised of a keyword enclosed in angle brackets `<>`. For example, an opening paragraph tag looks like this: `
`.
+
+Closing tags tell the browser where an element ends. They are almost the same as opening tags; the only difference is that they have a forward slash before the keyword. For example, a closing paragraph tag looks like this: `
`.
+
+A full paragraph element looks like this:
+
+
+
+You can think of elements as containers for content. The opening and closing tags tell the browser what content the element contains. The browser can then use that information to determine how it should interpret and format the content.
+
+There are some HTML elements that do not have a closing tag. These elements often look like this: `
` or `
`, but some can also be used without the closing forward slash such as `
` or `
`. These are known as self-closing tags or empty elements because they don’t wrap any content. You will encounter a few of these in later lessons, but for the most part, elements will have both opening and closing tags.
+
+HTML has a vast list of predefined tags that you can use to create all kinds of different elements. It is important to use the correct tags for content. Using the correct tags can have a big impact on two aspects of your sites: how they are ranked in search engines; and how accessible they are to users who rely on assistive technologies, like screen readers, to use the internet.
+
+Using the correct elements for content is called semantic HTML. You will explore this in much more depth later on in the curriculum.
+
+# --question--
+
+## --assignment--
+
+Watch Kevin Powell’s [Introduction to HTML video](https://www.youtube.com/watch?v=LGQuIIv2RVA&list=PL4-IK0AVhVjM0xE0K2uZRvsM7LkIhsPT-)
+
+## --text--
+
+What are HTML tags?
+
+## --answers--
+
+HTML tags tell the browser what content an element contains.
+
+---
+
+HTML tags tell the browser when to load its content.
+
+---
+
+HTML tags tell the browser what content the next element contains.
+
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/elements-and-tags-question-b.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/elements-and-tags-question-b.md
new file mode 100644
index 00000000000..51bf43a7014
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/elements-and-tags-question-b.md
@@ -0,0 +1,49 @@
+---
+id: 637f4e1672c65bc8e73dfe1f
+title: Elements and Tags Question B
+challengeType: 15
+dashedName: elements-and-tags-question-b
+---
+
+# --description--
+
+Almost all elements on an HTML page are just pieces of content wrapped in opening and closing HTML tags.
+
+Opening tags tell the browser this is the start of an HTML element. They are comprised of a keyword enclosed in angle brackets <>. For example, an opening paragraph tag looks like this: `
`.
+
+Closing tags tell the browser where an element ends. They are almost the same as opening tags; the only difference is that they have a forward slash before the keyword. For example, a closing paragraph tag looks like this: `
`.
+
+A full paragraph element looks like this:
+
+
+
+You can think of elements as containers for content. The opening and closing tags tell the browser what content the element contains. The browser can then use that information to determine how it should interpret and format the content.
+
+There are some HTML elements that do not have a closing tag. These elements often look like this: `
` or `
`, but some can also be used without the closing forward slash such as `
` or `
`. These are known as self-closing tags or empty elements because they don’t wrap any content. You will encounter a few of these in later lessons, but for the most part, elements will have both opening and closing tags.
+
+HTML has a vast list of predefined tags that you can use to create all kinds of different elements. It is important to use the correct tags for content. Using the correct tags can have a big impact on two aspects of your sites: how they are ranked in search engines; and how accessible they are to users who rely on assistive technologies, like screen readers, to use the internet.
+
+Using the correct elements for content is called semantic HTML. You will explore this in much more depth later on in the curriculum.
+
+# --question--
+
+## --text--
+
+What are the three parts of most HTML elements?
+
+## --answers--
+
+An opening tag, self closing tag, and content.
+
+---
+
+An opening tag, closing tag, and content.
+
+---
+
+An opening tag, closing tag, and attribute.
+
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-a.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-a.md
new file mode 100644
index 00000000000..ab85844e81b
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-a.md
@@ -0,0 +1,54 @@
+---
+id: 637f4e1c72c65bc8e73dfe20
+title: HTML Boilerplate Question A
+challengeType: 15
+dashedName: html-boilerplate-question-a
+---
+
+# --description--
+
+To demonstrate an HTML boilerplate, you first need an HTML file to work with.
+
+Create a new folder on your computer and name it `html-boilerplate`. Within that folder create a new file and name it `index.html`.
+
+You’re probably already familiar with a lot of different types of files, for example doc, pdf, and image files.
+
+To let the computer know you want to create an HTML file, you need to append the filename with the `.html` extension as you have done when creating the `index.html` file.
+
+It is worth noting that you named your HTML file index. You should always name the HTML file that will contain the homepage of your websites `index.html`. This is because web servers will by default look for an index.html page when users land on your websites - and not having one will cause big problems.
+
+## The DOCTYPE
+
+Every HTML page starts with a doctype declaration. The doctype’s purpose is to tell the browser what version of HTML it should use to render the document. The latest version of HTML is HTML5, and the doctype for that version is simply ``.
+
+The doctypes for older versions of HTML were a bit more complicated. For example, this is the doctype declaration for HTML4:
+
+```html
+
+```
+
+However, you probably won’t ever want to be using an older version of HTML, and so you’ll always use ``.
+
+Open the `index.html` file created earlier in your text editor and add `` to the very first line.
+
+# --question--
+## --text--
+
+What is the purpose of the `DOCTYPE` declaration?
+
+## --answers--
+
+It tells the browser which version of HTML to use to render the document.
+
+---
+
+It tells the browser that this document uses JavaScript.
+
+---
+
+It tells the browser the title of the document.
+
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-b.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-b.md
new file mode 100644
index 00000000000..ffd10a4b5ac
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-b.md
@@ -0,0 +1,46 @@
+---
+id: 637f4e2872c65bc8e73dfe21
+title: HTML Boilerplate Question B
+challengeType: 15
+dashedName: html-boilerplate-question-b
+---
+
+# --description--
+
+After you declare the doctype, you need to provide an `` element. This is what’s known as the root element of the document, meaning that every other element in the document will be a descendant of it.
+
+This becomes more important later on when you learn about manipulating HTML with JavaScript. For now, just know that the `html` element should be included on every HTML document.
+
+Back in the `index.html` file, let’s add the `` element by typing out its opening and closing tags, like so:
+
+```html
+
+
+
+```
+
+## What is the lang attribute?
+`lang` specifies the language of the text content in that element. This attribute is primarily used for improving accessibility of the webpage. It allows assistive technologies, for example screen readers, to adapt according to the language and invoke correct pronunciation.
+
+# --question--
+
+## --text--
+
+What is the `html` element?
+
+## --answers--
+
+It is the root element in the document and tells the browser which version of HTML it should use.
+
+---
+
+It is the root element in the document and all other elements should descend from it.
+
+---
+
+It is the root element in the document and all other elements should come after it.
+
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-c.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-c.md
new file mode 100644
index 00000000000..e4ddaa12c4b
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-c.md
@@ -0,0 +1,65 @@
+---
+id: 637f4e2f72c65bc8e73dfe22
+title: HTML Boilerplate Question C
+challengeType: 15
+dashedName: html-boilerplate-question-c
+---
+
+# --description--
+
+The `` element is where you put important meta-information about your webpages, and stuff required for your webpages to render correctly in the browser. Inside the ``, you should not use any element that displays content on the webpage.
+
+## The Charset Meta Element
+You should always have the `meta` tag for the `charset` encoding of the webpage in the `head` element: `
`.
+
+Setting the encoding is very important because it ensures that the webpage will display special symbols and characters from different languages correctly in the browser.
+
+## Title Element
+Another element you should always include in the head of an HTML document is the `title` element:
+
+```html
+
My First Webpage
+```
+
+The `title` element is used to give webpages a human-readable title which is displayed in your webpage’s browser tab.
+
+If you didn’t include a `title` element, the webpage’s title would default to its file name. In your case that would be `index.html`, which isn’t very meaningful for users; this would make it very difficult to find your webpage if the user has many browser tabs open.
+
+There are many more elements that can go within the `head` of an HTML document. However, for now it’s only crucial to know about the two elements you have covered here. You will introduce more elements that go into the `head` throughout the rest of the curriculum.
+
+Back in `index.html` file, let’s add a `head` element with a `charset` `meta` element and a `title` within it. The head element goes within the HTML element and should always be the first element under the opening `` tag:
+
+
+```html
+
+
+
+
+
+
My First Webpage
+
+
+```
+
+# --question--
+
+## --text--
+
+What is the purpose of the `head` element?
+
+## --answers--
+
+The `head` element is used to display all elements that are displayed on the webpage.
+
+---
+
+The `head` element is used to display important information about your webpage and is used to render web pages correctly with `meta` elements.
+
+---
+
+The `head` element is used to display the header content on top of the webpage.
+
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-d.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-d.md
new file mode 100644
index 00000000000..302b6a95d44
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/html-boilerplate-question-d.md
@@ -0,0 +1,48 @@
+---
+id: 637f4e3672c65bc8e73dfe23
+videoId: V8UAEoOvqFg
+title: HTML Boilerplate Question D
+challengeType: 15
+dashedName: html-boilerplate-question-d
+---
+
+# --description--
+
+The final element needed to complete the HTML boilerplate is the `` element. This is where all the content that will be displayed to users will go - the text, images, lists, links, and so on.
+
+To complete the boilerplate, add a `body` element to the `index.html` file. The `body` element also goes within the `html` element and is always below the `head` element, like so:
+
+# --question--
+
+## --assignment--
+
+Watch and follow along to Kevin Powell’s brilliant Building your first web page video above.
+
+---
+
+Build some muscle memory by deleting the contents of the `index.html` file and trying to write out all the boilerplate again from memory. Don’t worry if you have to peek at the lesson content the first few times if you get stuck. Just keep going until you can do it a couple of times from memory.
+
+---
+
+Run your boilerplate through this [HTML validator](https://www.freeformatter.com/html-validator.html). Validators ensure your markup is correct and are an excellent learning tool, as they provide feedback on syntax errors you may be making often and aren’t aware of, such as missing closing tags and extra spaces in your HTML.
+
+## --text--
+
+What is the purpose of the `body` element?
+
+## --answers--
+
+This is where all important information about the webpage is displayed such as the `title` and `meta` tags.
+
+---
+
+This is where you tell the browser how to render the webpage correctly.
+
+---
+
+This is where all content will be displayed on the page such images, text, and links.
+
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-a.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-a.md
new file mode 100644
index 00000000000..6c1bfb0a976
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-a.md
@@ -0,0 +1,41 @@
+---
+id: 6374f208de18c50e48ba767b
+title: Introduction To HTML and CSS Question A
+challengeType: 15
+dashedName: introduction-to-html-and-css-question-a
+---
+
+# --description--
+
+HTML and CSS are two languages that work together to create everything that you see when you look at something on the internet. HTML is the raw data that a webpage is built out of. All the text, links, cards, lists, and buttons are created in HTML. CSS is what adds style to those plain elements. HTML puts information on a webpage, and CSS positions that information, gives it color, changes the font, and makes it look great!
+
+Many helpful resources out there keep referring to HTML and CSS as programming languages, but if you want to get technical, labeling them as such is not quite accurate. This is because they are only concerned with presenting information. They are not used to program logic. JavaScript, which you will learn in the next section, is a programming language because it’s used to make webpages do things. Yet, there is quite a lot you can do with just HTML and CSS, and you will definitely need them both. Throughout our curriculum, the following lessons focus on giving you the tools you need to succeed once you reach JavaScript content.
+
+# --question--
+
+## --assignment--
+
+Read
the HTML vs CSS vs JavaScript article . It is a quick overview of the relationships between HTML, CSS, and JavaScript.
+
+## --text--
+
+Which of the following statements is true?
+
+## --answers--
+
+CSS is used to create the basic structure of a webpage, and HTML is used to add style.
+
+---
+
+HTML is used to create the basic structure of a webpage, and CSS is used to add style.
+
+---
+
+HTML and CSS are used to add style to a webpage, and JavaScript is used to create the basic structure.
+
+
+## --video-solution--
+
+2
+
+
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-b.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-b.md
new file mode 100644
index 00000000000..87aff63d4ec
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-b.md
@@ -0,0 +1,36 @@
+---
+id: 6376327e2724a688c04636e3
+title: Introduction To HTML and CSS Question B
+challengeType: 15
+dashedName: introduction-to-html-and-css-question-b
+---
+
+# --description--
+
+
+HTML and CSS are two languages that work together to create everything that you see when you look at something on the internet. HTML is the raw data that a webpage is built out of. All the text, links, cards, lists, and buttons are created in HTML. CSS is what adds style to those plain elements. HTML puts information on a webpage, and CSS positions that information, gives it color, changes the font, and makes it look great!
+
+Many helpful resources out there keep referring to HTML and CSS as programming languages, but if you want to get technical, labeling them as such is not quite accurate. This is because they are only concerned with presenting information. They are not used to program logic. JavaScript, which you will learn in the next section, is a programming language because it’s used to make webpages do things. Yet, there is quite a lot you can do with just HTML and CSS, and you will definitely need them both. Throughout our curriculum, the following lessons focus on giving you the tools you need to succeed once you reach JavaScript content.
+
+# --question--
+
+## --text--
+
+Between HTML and CSS, which should you use to add paragraphs of text on a webpage?
+
+## --answers--
+
+CSS
+
+---
+
+JavaScript
+
+---
+
+HTML
+
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-c.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-c.md
new file mode 100644
index 00000000000..2ca9f2fbacb
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-c.md
@@ -0,0 +1,33 @@
+---
+id: 637633162724a688c04636e4
+title: Introduction To HTML and CSS Question C
+challengeType: 15
+dashedName: introduction-to-html-and-css-question-c
+---
+
+# --description--
+
+HTML and CSS are two languages that work together to create everything that you see when you look at something on the internet. HTML is the raw data that a webpage is built out of. All the text, links, cards, lists, and buttons are created in HTML. CSS is what adds style to those plain elements. HTML puts information on a webpage, and CSS positions that information, gives it color, changes the font, and makes it look great!
+
+Many helpful resources out there keep referring to HTML and CSS as programming languages, but if you want to get technical, labeling them as such is not quite accurate. This is because they are only concerned with presenting information. They are not used to program logic. JavaScript, which you will learn in the next section, is a programming language because it’s used to make webpages do things. Yet, there is quite a lot you can do with just HTML and CSS, and you will definitely need them both. Throughout our curriculum, the following lessons focus on giving you the tools you need to succeed once you reach JavaScript content.
+# --question--
+
+## --text--
+
+Between HTML and CSS, which should you use to change the font and background color of a button?
+
+## --answers--
+
+You should use CSS to change the background color and font of a button.
+
+---
+
+You should use JavaScript to change the background color and font of a button.
+
+---
+
+You should use HTML to change the background color and font of a button.
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-d.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-d.md
new file mode 100644
index 00000000000..53e4c08471a
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/introduction-to-html-css-question-d.md
@@ -0,0 +1,34 @@
+---
+id: 637633672724a688c04636e5
+title: Introduction To HTML and CSS Question D
+challengeType: 15
+dashedName: introduction-to-html-and-css-question-d
+---
+
+# --description--
+
+HTML and CSS are two languages that work together to create everything that you see when you look at something on the internet. HTML is the raw data that a webpage is built out of. All the text, links, cards, lists, and buttons are created in HTML. CSS is what adds style to those plain elements. HTML puts information on a webpage, and CSS positions that information, gives it color, changes the font, and makes it look great!
+
+Many helpful resources out there keep referring to HTML and CSS as programming languages, but if you want to get technical, labeling them as such is not quite accurate. This is because they are only concerned with presenting information. They are not used to program logic. JavaScript, which you will learn in the next section, is a programming language because it’s used to make webpages do things. Yet, there is quite a lot you can do with just HTML and CSS, and you will definitely need them both. Throughout our curriculum, the following lessons focus on giving you the tools you need to succeed once you reach JavaScript content.
+
+# --question--
+
+## --text--
+
+What is the difference between HTML, CSS, and JavaScript?
+
+## --answers--
+
+HTML is for creating interactive elements, CSS is for the look and feel, and JavaScript is for creating the structure of a webpage.
+
+---
+
+CSS is for the look and feel, JavaScript is for creating interactive elements, and HTML is for creating the structure of a webpage.
+
+---
+
+JavaScript is for the look and feel, CSS is for creating the structure, and HTML is for creating interactive elements of a webpage.
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-a.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-a.md
new file mode 100644
index 00000000000..b4d237448f3
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-a.md
@@ -0,0 +1,66 @@
+---
+id: 637f704072c65bc8e73dfe36
+videoId: tsEQgGjSmkM
+title: Links and Images Question A
+challengeType: 15
+dashedName: links-and-images-question-a
+---
+
+# --description--
+
+To get some practice using links and images throughout this lesson you need an HTML project to work with.
+
+- Create a new directory named `odin-links-and-images`.
+
+- Within that directory, create a new file named `index.html`.
+
+- Fill in the usual HTML boilerplate.
+
+- Finally, add the following `h1` to the `body`: `
Homepage `
+
+## Anchor Elements
+To create a link in HTML, you use the anchor element. An anchor element is defined by wrapping the text or another HTML element you want to be a link with an `
` tag. Add the following to the `body` of the `index.html` page you created and open it in the browser:
+
+```html
+ click me
+```
+
+You may have noticed that clicking this link doesn’t do anything. This is because an anchor tag on its own won’t know where you want to link to. You have to tell it a destination to go to. You do this by using an HTML attribute.
+
+An HTML attribute gives additional information to an HTML element and always goes in the element’s opening tag. An attribute is usually made up of two parts: a name, and a value; however, not all attributes require a value. In your case, you need to add a `href` (hyperlink reference) attribute to the opening anchor tag. The value of the `href` attribute is the destination you want your link to go to.
+
+Add the following `href` attribute to the anchor element you created previously and try clicking it again, don’t forget to refresh the browser so the new changes can be applied.
+
+```html
+
click me
+```
+
+By default, any text wrapped with an anchor tag without a `href` attribute will look like plain text. If the `href` attribute is present, the browser will give the text a blue color and underline it to signify it is a link.
+
+It’s worth noting you can use anchor tags to link to any kind of resource on the internet, not just other HTML documents. You can link to videos, pdf files, images, and so on, but for the most part, you will be linking to other HTML documents.
+
+# --question--
+
+## --assignment--
+
+Watch Kevin Powell’s HTML Links video above.
+
+## --text--
+
+What HTML tag is used to create a link?
+
+## --answers--
+
+`
`
+
+---
+
+``
+
+---
+
+`
`
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-b.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-b.md
new file mode 100644
index 00000000000..a138268c406
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-b.md
@@ -0,0 +1,54 @@
+---
+id: 637f703572c65bc8e73dfe35
+title: Links and Images Question B
+challengeType: 15
+dashedName: links-and-images-question-b
+---
+
+# --description--
+
+To get some practice using links and images throughout this lesson you need an HTML project to work with.
+
+- Create a new directory named `odin-links-and-images`.
+
+- Within that directory, create a new file named `index.html`.
+
+- Fill in the usual HTML boilerplate.
+
+- finally, add the following `h1` to the `body`: `Homepage `
+
+## Anchor Elements
+To create a link in HTML, you use the anchor element. An anchor element is defined by wrapping the text or another HTML element you want to be a link with an `` tag. Add the following to the `body` of the `index.html` page you created and open it in the browser:
+
+```html
+ click me
+```
+
+You may have noticed that clicking this link doesn’t do anything. This is because an anchor tag on its own won’t know where you want to link to. You have to tell it a destination to go to. You do this by using an HTML attribute. An HTML attribute gives additional information to an HTML element and always goes in the element’s opening tag. An attribute is usually made up of two parts: a name, and a value; however, not all attributes require a value. In your case, you need to add a `href` (hyperlink reference) attribute to the opening anchor tag. The value of the `href` attribute is the destination you want your link to go to. Add the following `href` attribute to the anchor element you created previously and try clicking it again, don’t forget to refresh the browser so the new changes can be applied.
+
+```html
+click me
+```
+
+By default, any text wrapped with an anchor tag without a `href` attribute will look like plain text. If the `href` attribute is present, the browser will give the text a blue color and underline it to signify it is a link. It’s worth noting you can use anchor tags to link to any kind of resource on the internet, not just other HTML documents. You can link to videos, pdf files, images, and so on, but for the most part, you will be linking to other HTML documents.
+
+# --question--
+## --text--
+
+What is an attribute?
+## --answers--
+
+An HTML attribute gives additional information to an HTML element and always goes in the element’s closing tag.
+
+---
+
+An HTML attribute is used to tell the browser what the element contains.
+
+---
+
+An HTML attribute gives additional information to an HTML element and always goes in the element’s opening tag.
+
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-c.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-c.md
new file mode 100644
index 00000000000..8863b087456
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-c.md
@@ -0,0 +1,55 @@
+---
+id: 637f703072c65bc8e73dfe34
+title: Links and Images Question C
+challengeType: 15
+dashedName: links-and-images-question-c
+---
+
+# --description--
+
+To get some practice using links and images throughout this lesson you need an HTML project to work with.
+
+- Create a new directory named `odin-links-and-images`.
+
+- Within that directory, create a new file named `index.html`.
+
+- Fill in the usual HTML boilerplate.
+
+- finally, add the following `h1` to the `body`: `Homepage `
+
+## Anchor Elements
+To create a link in HTML, you use the anchor element. An anchor element is defined by wrapping the text or another HTML element you want to be a link with an `` tag. Add the following to the `body` of the `index.html` page you created and open it in the browser:
+
+```html
+ click me
+```
+
+You may have noticed that clicking this link doesn’t do anything. This is because an anchor tag on its own won’t know where you want to link to. You have to tell it a destination to go to. You do this by using an HTML attribute. An HTML attribute gives additional information to an HTML element and always goes in the element’s opening tag. An attribute is usually made up of two parts: a name, and a value; however, not all attributes require a value. In your case, you need to add a `href` (hyperlink reference) attribute to the opening anchor tag. The value of the `href` attribute is the destination you want your link to go to. Add the following `href` attribute to the anchor element you created previously and try clicking it again, don’t forget to refresh the browser so the new changes can be applied.
+
+```html
+click me
+```
+
+By default, any text wrapped with an anchor tag without a `href` attribute will look like plain text. If the `href` attribute is present, the browser will give the text a blue color and underline it to signify it is a link. It’s worth noting you can use anchor tags to link to any kind of resource on the internet, not just other HTML documents. You can link to videos, pdf files, images, and so on, but for the most part, you will be linking to other HTML documents.
+
+# --question--
+
+## --text--
+
+What attribute tells links where to go to?
+
+## --answers--
+
+`src`
+
+---
+
+`href`
+
+---
+
+`link`
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-d.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-d.md
new file mode 100644
index 00000000000..37eebffbabf
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-d.md
@@ -0,0 +1,112 @@
+---
+id: 637f702872c65bc8e73dfe33
+videoId: ta3Oxx7Yqbo
+title: Links and Images Question D
+challengeType: 15
+dashedName: links-and-images-question-d
+---
+
+# --description--
+
+
+Generally, there are two kinds of links you will create:
+
+- Links to pages on other websites on the internet
+
+- Links to pages located on your own websites
+
+
+## Absolute Links
+Links to pages on other websites on the internet are called absolute links. A typical absolute link will be made up of the following parts: `protocol://domain/path`. An absolute link will always contain the protocol and domain of the destination.
+
+You’ve already seen an absolute link in action. The link you created to The Odin Project’s About page earlier was an absolute link as it contains the protocol and domain.
+
+`https://www.theodinproject.com/about`
+
+## Relative Links
+Links to other pages within your own website are called relative links. Relative links do not include the domain name, since it is another page on the same site, it assumes the domain name will be the same as the page you created the link on.
+
+Relative links only include the file path to the other page, relative to the page you are creating the link on. This is quite abstract, let’s see this in action using an example.
+
+Within the `odin-links-and-images` directory, create another HTML file named `about.html` and paste the following code into it:
+
+```html
+
+
+
+
+ Odin Links and Images
+
+
+
+ About Page
+
+
+```
+
+Back in the `index` page, add the following anchor element to create a link to the `about` page:
+
+```html
+
+ Homepage
+ click me
+
+ About
+
+```
+
+Open the `index.html` file in a browser and click on the about link to make sure it is all wired together correctly. Clicking the link should go to the `about` page you just created.
+
+This works because the `index` and `about` page are in the same directory. That means you can simply use its name (`about.html`) as the link’s `href` value.
+
+But you will usually want to organize your website directories a little better. Normally you would only have the `index.html` at the root directory and all other HTML files in their own directory.
+
+Create a directory named `pages` within the `odin-links-and-images` directory and move the `about.html` file into this new directory.
+
+Refresh the `index` page in the browser and then click on the `about` link. It will now be broken. This is because the location of the `about` page file has changed.
+
+To fix this, you just need to update the `about` link `href` value to include the `pages/` directory since that is the new location of the `about.html` file relative to the `index.html` file.
+
+```html
+
+ Homepage
+ About
+
+```
+
+Refresh the `index` page in the browser and try clicking the `about` link again, it should now be back in working order.
+
+In many cases, this will work just fine; however, you can still run into unexpected issues with this approach. Prepending `./` before the link will in most cases prevent such issues. By adding `./` you are specifying to your code that it should start looking for the file/directory relative to the **current** directory.
+
+```html
+
+ Homepage
+ About
+
+```
+
+# --question--
+
+## --assignment--
+
+Watch Kevin Powell’s HTML File Structure video above.
+
+## --text--
+
+What is the difference between an absolute and a relative link?
+
+## --answers--
+
+An absolute link is a link to another page on the current website. A relative link is a link to another website.
+
+---
+
+An absolute link is a link to another website. A relative link is a link another page on the current website.
+
+---
+
+There is no difference between absolute and relative links.
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-e.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-e.md
new file mode 100644
index 00000000000..ae008078088
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-e.md
@@ -0,0 +1,98 @@
+---
+id: 637f702372c65bc8e73dfe32
+videoId: 0xoztJCHpbQ
+title: Links and Images Question E
+challengeType: 15
+dashedName: links-and-images-question-e
+---
+
+# --description--
+
+Websites would be fairly boring if they could only display text. Luckily HTML provides a wide variety of elements for displaying all sorts of different media. The most widely used of these is the image element.
+
+To display an image in HTML you use the ` ` element. Unlike the other elements you have encountered, the ` ` element is self-closing. Empty, self-closing HTML elements do not need a closing tag.
+
+Instead of wrapping content with an opening and closing tag, it embeds an image into the page using a `src` attribute which tells the browser where the image file is located. The `src` attribute works much like the `href` attribute for anchor tags. It can embed an image using both absolute and relative paths.
+
+For example, using an absolute path you can display an image located on The Odin Project site:
+
+
+
+To use images that you have on your own websites, you can use a relative path.
+
+- Create a new directory named `images` within the `odin-links-and-images` project.
+
+- Next, download [this image](https://unsplash.com/photos/Mv9hjnEUHR4/download?force=true&w=640) and move it into the `images` directory you just created.
+
+- Rename the image to `dog.jpg`.
+
+Finally add the image to the `index.html` file:
+
+```html
+
+ Homepage
+ click me
+
+ About
+
+
+
+```
+
+Save the `index.html` file and open it in a browser to view Charles in all his glory.
+
+
+## Parent Directories
+
+What if you want to use the dog image in the `about` page? You would first have to go up one level out of the pages directory into its parent directory so you could then access the images directory.
+
+To go to the parent directory you need to use two dots in the relative filepath like this: `../.` Let’s see this in action, within the `body` of the `about.html` file, add the following image below the heading you added earlier:
+
+```html
+
+```
+
+To break this down:
+
+- First, you are going to the parent directory of the pages directory which is `odin-links-and-images`.
+
+- Then, from the parent directory, you can go into the `images` directory.
+
+- Finally, you can access the `dog.jpg` file.
+
+Using the metaphor we used earlier, using `../` in a filepath is kind of like stepping out from the room you are currently in to the main hallway so you can go to another room.
+
+## `Alt` attribute
+
+Besides the `src` attribute, every image element should also have an `alt` (alternative text) attribute.
+
+The `alt` attribute is used to describe an image. It will be used in place of the image if it cannot be loaded. It is also used with screen readers to describe what the image is to visually impaired users.
+
+This is how the The Odin Project logo example you used earlier looks with an `alt` attribute included:
+
+
+# --question--
+
+## --assignment--
+
+Watch Kevin Powell’s HTML Images Video above.
+
+## --text--
+
+Which tag is used to display an image?
+
+## --answers--
+
+` `
+
+---
+
+``
+
+---
+
+` `
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-f.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-f.md
new file mode 100644
index 00000000000..e1af2d6a659
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-f.md
@@ -0,0 +1,93 @@
+---
+id: 637f701c72c65bc8e73dfe31
+title: Links and Images Question F
+challengeType: 15
+dashedName: links-and-images-question-f
+---
+
+# --description--
+
+Websites would be fairly boring if they could only display text. Luckily HTML provides a wide variety of elements for displaying all sorts of different media. The most widely used of these is the image element.
+
+To display an image in HTML you use the ` ` element. Unlike the other elements you have encountered, the ` ` element is self-closing. Empty, self-closing HTML elements do not need a closing tag.
+
+Instead of wrapping content with an opening and closing tag, it embeds an image into the page using a `src` attribute which tells the browser where the image file is located. The `src` attribute works much like the `href` attribute for anchor tags. It can embed an image using both absolute and relative paths.
+
+For example, using an absolute path you can display an image located on The Odin Project site:
+
+
+
+To use images that you have on your own websites, you can use a relative path.
+
+- Create a new directory named `images` within the `odin-links-and-images` project.
+
+- Next, download [this image](https://unsplash.com/photos/Mv9hjnEUHR4/download?force=true&w=640) and move it into the images directory you just created.
+
+- Rename the image to `dog.jpg`.
+
+Finally add the image to the `index.html` file:
+
+```html
+
+ Homepage
+ click me
+
+ About
+
+
+
+```
+
+Save the `index.html` file and open it in a browser to view Charles in all his glory.
+
+
+## Parent Directories
+
+What if you want to use the dog image in the `about` page? You would first have to go up one level out of the pages directory into its parent directory so you could then access the images directory.
+
+To go to the parent directory you need to use two dots in the relative filepath like this: `../.` Let’s see this in action, within the `body` of the `about.html` file, add the following image below the heading you added earlier:
+
+```html
+
+```
+
+To break this down:
+
+- First, you are going to the parent directory of the pages directory which is `odin-links-and-images`.
+
+- Then, from the parent directory, you can go into the `images` directory.
+
+- Finally, you can access the `dog.jpg` file.
+
+Using the metaphor we used earlier, using `../` in a filepath is kind of like stepping out from the room you are currently in to the main hallway so you can go to another room.
+
+## Alt attribute
+
+Besides the `src` attribute, every image element should also have an `alt` (alternative text) attribute.
+
+The `alt` attribute is used to describe an image. It will be used in place of the image if it cannot be loaded. It is also used with screen readers to describe what the image is to visually impaired users.
+
+This is how the The Odin Project logo example you used earlier looks with an alt attribute included:
+
+
+# --question--
+
+## --text--
+
+What two attributes do images always need to have?
+
+## --answers--
+
+`href` and `alt`
+
+---
+
+`name` and `href`
+
+---
+
+`alt` and `src`
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-g.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-g.md
new file mode 100644
index 00000000000..5bc84fa6c96
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-g.md
@@ -0,0 +1,93 @@
+---
+id: 637f701572c65bc8e73dfe30
+title: Links and Images Question G
+challengeType: 15
+dashedName: links-and-images-question-g
+---
+
+# --description--
+
+Websites would be fairly boring if they could only display text. Luckily HTML provides a wide variety of elements for displaying all sorts of different media. The most widely used of these is the image element.
+
+To display an image in HTML you use the ` ` element. Unlike the other elements you have encountered, the ` ` element is self-closing. Empty, self-closing HTML elements do not need a closing tag.
+
+Instead of wrapping content with an opening and closing tag, it embeds an image into the page using a `src` attribute which tells the browser where the image file is located. The `src` attribute works much like the `href` attribute for anchor tags. It can embed an image using both absolute and relative paths.
+
+For example, using an absolute path you can display an image located on The Odin Project site:
+
+
+
+To use images that you have on your own websites, you can use a relative path.
+
+- Create a new directory named `images` within the `odin-links-and-images` project.
+
+- Next, download [this image](https://unsplash.com/photos/Mv9hjnEUHR4/download?force=true&w=640) and move it into the images directory you just created.
+
+- Rename the image to `dog.jpg`.
+
+Finally add the image to the `index.html` file:
+
+```html
+
+ Homepage
+ click me
+
+ About
+
+
+
+```
+
+Save the `index.html` file and open it in a browser to view Charles in all his glory.
+
+
+## Parent Directories
+
+What if you want to use the dog image in the `about` page? You would first have to go up one level out of the pages directory into its parent directory so you could then access the images directory.
+
+To go to the parent directory you need to use two dots in the relative filepath like this: `../.` Let’s see this in action, within the `body` of the `about.html` file, add the following image below the heading you added earlier:
+
+```html
+
+```
+
+To break this down:
+
+- First, you are going to the parent directory of the pages directory which is `odin-links-and-images`.
+
+- Then, from the parent directory, you can go into the `images` directory.
+
+- Finally, you can access the `dog.jpg` file.
+
+Using the metaphor we used earlier, using `../` in a filepath is kind of like stepping out from the room you are currently in to the main hallway so you can go to another room.
+
+## Alt attribute
+
+Besides the `src` attribute, every image element should also have an `alt` (alternative text) attribute.
+
+The `alt` attribute is used to describe an image. It will be used in place of the image if it cannot be loaded. It is also used with screen readers to describe what the image is to visually impaired users.
+
+This is how the The Odin Project logo example you used earlier looks with an alt attribute included:
+
+
+# --question--
+
+## --text--
+
+How do you access a parent directory in a filepath?
+
+## --answers--
+
+`../`
+
+---
+
+`./`
+
+---
+
+`.../`
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-h.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-h.md
new file mode 100644
index 00000000000..71157081ae7
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/links-and-images-question-h.md
@@ -0,0 +1,97 @@
+---
+id: 637f700b72c65bc8e73dfe2f
+title: Links and Images Question H
+challengeType: 15
+dashedName: links-and-images-question-h
+---
+
+# --description--
+
+Websites would be fairly boring if they could only display text. Luckily HTML provides a wide variety of elements for displaying all sorts of different media. The most widely used of these is the image element.
+
+To display an image in HTML you use the ` ` element. Unlike the other elements you have encountered, the ` ` element is self-closing. Empty, self-closing HTML elements do not need a closing tag.
+
+Instead of wrapping content with an opening and closing tag, it embeds an image into the page using a `src` attribute which tells the browser where the image file is located. The `src` attribute works much like the `href` attribute for anchor tags. It can embed an image using both absolute and relative paths.
+
+For example, using an absolute path you can display an image located on The Odin Project site:
+
+
+
+To use images that you have on your own websites, you can use a relative path.
+
+- Create a new directory named `images` within the `odin-links-and-images` project.
+
+- Next, download [this image](https://unsplash.com/photos/Mv9hjnEUHR4/download?force=true&w=640) and move it into the images directory you just created.
+
+- Rename the image to `dog.jpg`.
+
+Finally add the image to the `index.html` file:
+
+```html
+
+ Homepage
+ click me
+
+ About
+
+
+
+```
+
+Save the `index.html` file and open it in a browser to view Charles in all his glory.
+
+
+## Parent Directories
+
+What if you want to use the dog image in the `about` page? You would first have to go up one level out of the pages directory into its parent directory so you could then access the images directory.
+
+To go to the parent directory you need to use two dots in the relative filepath like this: `../.` Let’s see this in action, within the `body` of the `about.html` file, add the following image below the heading you added earlier:
+
+```html
+
+```
+
+To break this down:
+
+- First, you are going to the parent directory of the pages directory which is `odin-links-and-images`.
+
+- Then, from the parent directory, you can go into the `images` directory.
+
+- Finally, you can access the `dog.jpg` file.
+
+Using the metaphor we used earlier, using `../` in a filepath is kind of like stepping out from the room you are currently in to the main hallway so you can go to another room.
+
+## Alt attribute
+
+Besides the `src` attribute, every image element should also have an `alt` (alternative text) attribute.
+
+The `alt` attribute is used to describe an image. It will be used in place of the image if it cannot be loaded. It is also used with screen readers to describe what the image is to visually impaired users.
+
+This is how the The Odin Project logo example you used earlier looks with an alt attribute included:
+
+
+# --question--
+
+## --assignment--
+
+Read about the four main image formats that can be used on the web.
+
+## --text--
+
+What are the four main image formats that you can use for images on the web?
+
+## --answers--
+
+TIFF, GIF, PNG, and SVG.
+
+---
+
+JPG, PNG, GIF, and SVG.
+
+---
+
+JPG, PDF, SVG, and GIF.
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-a.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-a.md
new file mode 100644
index 00000000000..f4625eb7e31
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-a.md
@@ -0,0 +1,65 @@
+---
+id: 637f4e3e72c65bc8e73dfe24
+videoId: kcHKFZBVtf4
+title: Understand Ordered and Unordered List Question A
+challengeType: 15
+dashedName: understand-ordered-and-unordered-list-question-a
+---
+
+# --description--
+
+If you want to have a list of items where the order doesn’t matter, like a shopping list of items that can be bought in any order, then you can use an unordered list.
+
+Unordered lists are created using the `` element, and each item within the list is created using the list item element ``.
+
+Each list item in an unordered list begins with a bullet point:
+
+
+
+If you instead want to create a list of items where the order does matter, like step-by-step instructions for a recipe, or your top 10 favorite TV shows, then you can use an ordered list.
+
+Ordered lists are created using the `` element. Each individual item in them is again created using the list item element ``. However, each list item in an ordered list begins with a number instead:
+
+
+
+# --question--
+
+## --assignment--
+
+Watch the first three minutes of Kevin Powell's video on Ordered and Unordered lists above.
+
+---
+
+Make an unordered shopping list of your favorite foods.
+
+---
+
+Make an ordered list of todo’s you need to get done today.
+
+---
+
+Make an unordered list of places you’d like to visit someday.
+
+---
+
+Make an ordered list of your all time top 5 favorite video games or movies.
+
+## --text--
+
+What HTML tag is used to create an unordered list?
+
+## --answers--
+
+` `
+
+---
+
+``
+
+---
+
+``
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-b.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-b.md
new file mode 100644
index 00000000000..67e79f0ccb9
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-b.md
@@ -0,0 +1,44 @@
+---
+id: 637f4e4672c65bc8e73dfe25
+title: Understand Ordered and Unordered List Question B
+challengeType: 15
+dashedName: understand-ordered-and-unordered-list-question-b
+---
+
+# --description--
+
+If you want to have a list of items where the order doesn’t matter, like a shopping list of items that can be bought in any order, then you can use an unordered list.
+
+Unordered lists are created using the `` element, and each item within the list is created using the list item element ``.
+
+Each list item in an unordered list begins with a bullet point:
+
+
+
+If you instead want to create a list of items where the order does matter, like step-by-step instructions for a recipe, or your top 10 favorite TV shows, then you can use an ordered list.
+
+Ordered lists are created using the `` element. Each individual item in them is again created using the list item element ``. However, each list item in an ordered list begins with a number instead:
+
+
+
+# --question--
+
+## --text--
+
+What HTML tag is used to create an ordered list?
+
+## --answers--
+
+``
+
+---
+
+``
+
+---
+
+``
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-c.md b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-c.md
new file mode 100644
index 00000000000..1edd6feffbf
--- /dev/null
+++ b/curriculum/challenges/swahili/16-the-odin-project/top-learn-html-foundations/understand-ordered-and-unordered-list-question-c.md
@@ -0,0 +1,44 @@
+---
+id: 637f4e5172c65bc8e73dfe26
+title: Understand Ordered and Unordered List Question C
+challengeType: 15
+dashedName: understand-ordered-and-unordered-list-question-c
+---
+
+# --description--
+
+If you want to have a list of items where the order doesn’t matter, like a shopping list of items that can be bought in any order, then you can use an unordered list.
+
+Unordered lists are created using the `` element, and each item within the list is created using the list item element ``.
+
+Each list item in an unordered list begins with a bullet point:
+
+