diff --git a/client/i18n/locales/english/intro.json b/client/i18n/locales/english/intro.json
index 987bb4f1576..ac95aea8813 100644
--- a/client/i18n/locales/english/intro.json
+++ b/client/i18n/locales/english/intro.json
@@ -2004,7 +2004,13 @@
"Test what you've learned in this quiz of how positioning works in CSS."
]
},
- "xebj": { "title": "103", "intro": [] },
+ "workshop-piano": {
+ "title": "Design a Piano",
+ "intro": [
+ "Responsive Design tells your webpage how it should look on different-sized screens.",
+ "In this workshop, you'll use CSS and Responsive Design to code a piano. You'll also practice media queries and pseudo selectors."
+ ]
+ },
"jkdt": { "title": "104", "intro": [] },
"lab-technical-documentation-page": {
"title": "Build a Technical Documentation Page",
diff --git a/client/src/pages/learn/front-end-development/workshop-piano/index.md b/client/src/pages/learn/front-end-development/workshop-piano/index.md
new file mode 100644
index 00000000000..f26de368763
--- /dev/null
+++ b/client/src/pages/learn/front-end-development/workshop-piano/index.md
@@ -0,0 +1,11 @@
+---
+title: Introduction to the Design a Piano
+block: workshop-piano
+superBlock: front-end-development
+---
+
+## Introduction to the Design a Piano
+
+Responsive Design tells your webpage how it should look on different-sized screens.
+
+In this workshop, you'll use CSS and Responsive Design to code a piano. You'll also practice media queries and pseudo selectors.
diff --git a/curriculum/challenges/_meta/workshop-piano/meta.json b/curriculum/challenges/_meta/workshop-piano/meta.json
new file mode 100644
index 00000000000..05c4dffc91b
--- /dev/null
+++ b/curriculum/challenges/_meta/workshop-piano/meta.json
@@ -0,0 +1,137 @@
+{
+ "name": "Design a Piano",
+ "blockType": "workshop",
+ "isUpcomingChange": true,
+ "usesMultifileEditor": true,
+ "hasEditableBoundaries": true,
+ "dashedName": "workshop-piano",
+ "order": 103,
+ "superBlock": "front-end-development",
+ "challengeOrder": [
+ {
+ "id": "612e78af05201622d4bab8aa",
+ "title": "Step 1"
+ },
+ {
+ "id": "612e7d1c29fb872d6384379c",
+ "title": "Step 2"
+ },
+ {
+ "id": "612e804c54d5e7308d7ebe56",
+ "title": "Step 3"
+ },
+ {
+ "id": "612e813b3ba67633222cbe54",
+ "title": "Step 4"
+ },
+ {
+ "id": "612e8279827a28352ce83a72",
+ "title": "Step 5"
+ },
+ {
+ "id": "612e83ec2eca1e370f830511",
+ "title": "Step 6"
+ },
+ {
+ "id": "612e89562043183c86df287c",
+ "title": "Step 7"
+ },
+ {
+ "id": "612e89d254fe5d3df7d6693d",
+ "title": "Step 8"
+ },
+ {
+ "id": "612e8eebe3a6dc3fcc33a66f",
+ "title": "Step 9"
+ },
+ {
+ "id": "612e95ef2e4bdf41f69067f9",
+ "title": "Step 10"
+ },
+ {
+ "id": "612e96fc87fe8e44f69f7ec5",
+ "title": "Step 11"
+ },
+ {
+ "id": "612e98f3245c98475e49cfc6",
+ "title": "Step 12"
+ },
+ {
+ "id": "612e9a21381a1949327512e6",
+ "title": "Step 13"
+ },
+ {
+ "id": "612e9d142affc44a453655db",
+ "title": "Step 14"
+ },
+ {
+ "id": "612e9f1e7e5ccd4fa9ada0be",
+ "title": "Step 15"
+ },
+ {
+ "id": "612ea4c4993aba52ab4aa32e",
+ "title": "Step 16"
+ },
+ {
+ "id": "612ea97df5742154772f312e",
+ "title": "Step 17"
+ },
+ {
+ "id": "612ead8788d28655ef8db056",
+ "title": "Step 18"
+ },
+ {
+ "id": "612eaf56b7ba3257fdbfb0db",
+ "title": "Step 19"
+ },
+ {
+ "id": "612eb4893b63c75bb9251ddf",
+ "title": "Step 20"
+ },
+ {
+ "id": "612eb75153591b5e3b1ab65e",
+ "title": "Step 21"
+ },
+ {
+ "id": "612eb7ca8c275d5f89c73333",
+ "title": "Step 22"
+ },
+ {
+ "id": "612eb8e984cd73677a92b7e9",
+ "title": "Step 23"
+ },
+ {
+ "id": "612eb934f64a4d6890a45518",
+ "title": "Step 24"
+ },
+ {
+ "id": "612ebcba99bfa46a15370b11",
+ "title": "Step 25"
+ },
+ {
+ "id": "612ebe7fe6d07e6b76d1cae2",
+ "title": "Step 26"
+ },
+ {
+ "id": "612ebedec97e096c8bf64999",
+ "title": "Step 27"
+ },
+ {
+ "id": "612ebf9a210f2b6d77001e68",
+ "title": "Step 28"
+ },
+ {
+ "id": "612ec0490ae8626e9adf82e4",
+ "title": "Step 29"
+ },
+ {
+ "id": "612ec19d5268da7074941f84",
+ "title": "Step 30"
+ },
+ {
+ "id": "612ec29c84b9a6718b1f5cec",
+ "title": "Step 31"
+ }
+ ],
+ "helpCategory": "HTML-CSS"
+}
\ No newline at end of file
diff --git a/curriculum/challenges/english/25-front-end-development/workshop-piano/612e78af05201622d4bab8aa.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e78af05201622d4bab8aa.md
new file mode 100644
index 00000000000..3a5d4134854
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e78af05201622d4bab8aa.md
@@ -0,0 +1,58 @@
+---
+id: 612e78af05201622d4bab8aa
+title: Step 1
+challengeType: 0
+dashedName: step-1
+demoType: onLoad
+---
+
+# --description--
+
+Create a `div` element within your `body` element with the `id` set to `piano`.
+
+# --hints--
+
+You should create a new `div` element.
+
+```js
+const div = document.querySelector('div');
+assert.exists(div);
+```
+
+Your `div` should be within your `body` element.
+
+```js
+const div = document.querySelector('div');
+assert(div?.parentElement?.localName === 'body');
+```
+
+Your `div` should have the `id` set to `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/english/25-front-end-development/workshop-piano/612e7d1c29fb872d6384379c.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e7d1c29fb872d6384379c.md
new file mode 100644
index 00000000000..e5c80cf6b41
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e7d1c29fb872d6384379c.md
@@ -0,0 +1,60 @@
+---
+id: 612e7d1c29fb872d6384379c
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Nest a second `div` within your existing `div`, and set the `class` to be `keys`.
+
+# --hints--
+
+You should create a second `div` element.
+
+```js
+const divDiv = document.querySelectorAll('div');
+assert(divDiv?.length === 2);
+```
+
+Your new `div` element should be within your existing `div` element.
+
+```js
+const div = document.querySelector('div');
+assert(div?.children?.length === 1);
+assert(div?.children?.[0]?.localName === 'div');
+```
+
+Your new `div` element should have the `class` set to `keys`.
+
+```js
+const div = document.querySelector('div');
+assert(div?.children?.[0]?.className === 'keys');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/english/25-front-end-development/workshop-piano/612e804c54d5e7308d7ebe56.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e804c54d5e7308d7ebe56.md
new file mode 100644
index 00000000000..bfbbe7748d2
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e804c54d5e7308d7ebe56.md
@@ -0,0 +1,60 @@
+---
+id: 612e804c54d5e7308d7ebe56
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Within your `.keys` element, add seven `div` elements, each with the class `key`.
+
+# --hints--
+
+You should create seven new `div` elements.
+
+```js
+const divDivDiv = document.querySelectorAll('div');
+assert(divDivDiv?.length === 9);
+```
+
+Your seven new `div` elements should be within your `.keys` element.
+
+```js
+const keys = document.querySelector('.keys');
+assert([...keys?.children].length === 7);
+assert([...keys?.children].every(child => child?.tagName === 'DIV'));
+```
+
+Your seven new `div` elements should all have the `class` set to `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/english/25-front-end-development/workshop-piano/612e813b3ba67633222cbe54.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e813b3ba67633222cbe54.md
new file mode 100644
index 00000000000..93e60db476b
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e813b3ba67633222cbe54.md
@@ -0,0 +1,95 @@
+---
+id: 612e813b3ba67633222cbe54
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Remember, a `class` attribute can hold multiple values. To differentiate between your white and black keys, add a second `class` value of `black--key` to your second, third, fifth, sixth, and seventh `.key` elements.
+
+# --hints--
+
+Your second `.key` element should also have a `class` of `black--key`.
+
+```js
+const key = document.querySelectorAll('.key')?.[1];
+assert(key?.className?.includes('black--key'));
+```
+
+Your third `.key` should have `black--key` in the `class`.
+
+```js
+const third = document.querySelectorAll('.key')?.[2];
+assert(third?.classList?.contains('black--key'));
+```
+
+Your fifth `.key` should have `black--key` in the `class`.
+
+```js
+const fifth = document.querySelectorAll('.key')?.[4];
+assert(fifth?.classList?.contains('black--key'));
+```
+
+Your sixth `.key` should have `black--key` in the `class`.
+
+```js
+const sixth = document.querySelectorAll('.key')?.[5];
+assert(sixth?.classList?.contains('black--key'));
+```
+
+Your seventh `.key` should have `black--key` in the `class`.
+
+```js
+const seventh = document.querySelectorAll('.key')?.[6];
+assert(seventh?.classList?.contains('black--key'));
+```
+
+You should have five `.black--key` elements.
+
+```js
+const blackKeys = document.querySelectorAll('.black--key');
+assert(blackKeys?.length === 5);
+```
+
+You should have seven `.key` elements.
+
+```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/english/25-front-end-development/workshop-piano/612e8279827a28352ce83a72.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e8279827a28352ce83a72.md
new file mode 100644
index 00000000000..d42477e30ca
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e8279827a28352ce83a72.md
@@ -0,0 +1,74 @@
+---
+id: 612e8279827a28352ce83a72
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Now, copy the set of seven `.key` elements and paste two additional sets into the `.keys` div.
+
+# --hints--
+
+You should have 21 `.key` elements.
+
+```js
+const keys = document.querySelectorAll('.key');
+assert(keys?.length === 21);
+```
+
+You should have 15 `.black--key` elements.
+
+```js
+const blackKeys = document.querySelectorAll('.black--key');
+assert(blackKeys?.length === 15);
+```
+
+All `.key` elements should be within your `.keys` element.
+
+```js
+const keys = document.querySelector('.keys');
+assert(keys?.querySelectorAll('.key')?.length === 21);
+```
+
+All `.black--key` elements should be within your `.keys` element.
+
+```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/english/25-front-end-development/workshop-piano/612e83ec2eca1e370f830511.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e83ec2eca1e370f830511.md
new file mode 100644
index 00000000000..1f4190864e8
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e83ec2eca1e370f830511.md
@@ -0,0 +1,107 @@
+---
+id: 612e83ec2eca1e370f830511
+title: Step 6
+challengeType: 0
+dashedName: step-6
+---
+
+# --description--
+
+Add a `link` element inside your `head` element. Set its `rel` attribute to `stylesheet` and its `href` attribute to `styles.css`.
+
+# --hints--
+
+Your code should have a `link` element.
+
+```js
+assert.isNotNull(document.querySelector('link'));
+```
+
+You should not change your existing `head` tags. Make sure you did not delete the closing tag.
+
+```js
+const headElements = document.querySelectorAll('head');
+assert.strictEqual(headElements?.length, 1);
+```
+
+You should have one `link` element.
+
+```js
+assert.strictEqual(document.querySelectorAll('link')?.length, 1);
+```
+
+Your `link` element should be inside your `head` element.
+
+```js
+const headContentRegex = /(?<=)[\S|\s]*(?=<\/head\s*>)/;
+const headElementContent = code.match(headContentRegex);
+
+const headElement = document.createElement("head");
+headElement.innerHTML = headElementContent;
+assert.isNotNull(headElement.querySelector('link'));
+```
+
+Your `link` element should have a `rel` attribute with the value `stylesheet`.
+
+```js
+const linkElement = document.querySelector('link');
+const rel = linkElement?.getAttribute("rel");
+assert.strictEqual(rel, "stylesheet");
+```
+
+Your `link` element should have an `href` attribute with the value `styles.css`.
+
+```js
+const linkElement = document.querySelector('link');
+assert.strictEqual(linkElement?.dataset.href, "styles.css");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+ --fcc-editable-region--
+
+ Piano
+
+ --fcc-editable-region--
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```css
+
+```
diff --git a/curriculum/challenges/english/25-front-end-development/workshop-piano/612e89562043183c86df287c.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e89562043183c86df287c.md
new file mode 100644
index 00000000000..a5dad2247f9
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e89562043183c86df287c.md
@@ -0,0 +1,77 @@
+---
+id: 612e89562043183c86df287c
+title: Step 7
+challengeType: 0
+dashedName: step-7
+---
+
+# --description--
+
+Browsers often apply default margin and padding values to specific elements. To make sure your piano layout displays correctly, you need to reset the box model.
+
+Add an `html` rule selector to your CSS file, and set the `box-sizing` property to `border-box`.
+
+# --hints--
+
+You should have an `html` selector.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('html'));
+```
+
+Your `html` selector should have the `box-sizing` property set to `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/english/25-front-end-development/workshop-piano/612e89d254fe5d3df7d6693d.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e89d254fe5d3df7d6693d.md
new file mode 100644
index 00000000000..cd1ca1882c5
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e89d254fe5d3df7d6693d.md
@@ -0,0 +1,83 @@
+---
+id: 612e89d254fe5d3df7d6693d
+title: Step 8
+challengeType: 0
+dashedName: step-8
+---
+
+# --description--
+
+Now that you've reset the `html` box model, you need to apply this to the elements inside it as well. To do this, set the `box-sizing` property to `inherit`, which ensures that the targeted elements adopt the same value as their parent element.
+
+You will also need to target the pseudo-elements, which are special keywords that follow a selector. The two pseudo-elements you will be using are the `::before` and `::after` pseudo-elements.
+
+The `::before` selector creates a pseudo-element which is the first child of the selected element, while the `::after` selector creates a pseudo-element which is the last child of the selected element. These pseudo-elements are often used to create cosmetic content, which you will see later in this project.
+
+For now, create a CSS selector to target all elements using `*`, and include the pseudo-elements `::before` and `::after`. Set the `box-sizing` property to `inherit`.
+
+# --hints--
+
+You should have a `*, ::before, ::after` selector.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('*, ::before, ::after'));
+```
+
+Your `*, ::before, ::after` selector should have the `box-sizing` property set to `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/english/25-front-end-development/workshop-piano/612e8eebe3a6dc3fcc33a66f.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e8eebe3a6dc3fcc33a66f.md
new file mode 100644
index 00000000000..46f69e2b599
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e8eebe3a6dc3fcc33a66f.md
@@ -0,0 +1,95 @@
+---
+id: 612e8eebe3a6dc3fcc33a66f
+title: Step 9
+challengeType: 0
+dashedName: step-9
+---
+
+# --description--
+
+Now target your `#piano` element with an `id` selector. Set its `background-color` property to `#00471b`, the `width` property to `992px` and the `height` property to `290px`.
+
+# --hints--
+
+You should have a `#piano` selector.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano'));
+```
+
+Your `#piano` selector should have the `background-color` property set to `#00471b`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.backgroundColor === 'rgb(0, 71, 27)');
+```
+
+Your `#piano` selector should have a `width` property set to `992px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('#piano')?.width === '992px');
+```
+
+Your `#piano` selector should have the `height` set to `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/english/25-front-end-development/workshop-piano/612e95ef2e4bdf41f69067f9.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e95ef2e4bdf41f69067f9.md
new file mode 100644
index 00000000000..85c97c29245
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e95ef2e4bdf41f69067f9.md
@@ -0,0 +1,81 @@
+---
+id: 612e95ef2e4bdf41f69067f9
+title: Step 10
+challengeType: 0
+dashedName: step-10
+---
+
+# --description--
+
+Set the `margin` of the `#piano` to `80px auto`.
+
+# --hints--
+
+Your `#piano` selector should have the `margin` property set to `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/english/25-front-end-development/workshop-piano/612e96fc87fe8e44f69f7ec5.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e96fc87fe8e44f69f7ec5.md
new file mode 100644
index 00000000000..26f7c9217a6
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e96fc87fe8e44f69f7ec5.md
@@ -0,0 +1,102 @@
+---
+id: 612e96fc87fe8e44f69f7ec5
+title: Step 11
+challengeType: 0
+dashedName: step-11
+---
+
+# --description--
+
+Time to style the keys. Below the `#piano` rule, target the `.keys` element with a `class` selector. Give the new rule a `background-color` property of `#040404`, a `width` property of `949px` and a `height` property of `180px`.
+
+# --hints--
+
+You should have a `.keys` selector.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys'));
+```
+
+Your `.keys` selector should have a `background-color` property set to `#040404`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys')?.backgroundColor === 'rgb(4, 4, 4)');
+```
+
+Your `.keys` selector should have the `width` property set to `949px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.keys')?.width === '949px');
+```
+
+Your `.keys` selector should have a `height` property set to `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--
+.keys {
+ background-color: #040404;
+ width: 949px;
+ height: 180px;
+}
+--fcc-editable-region--
+```
diff --git a/curriculum/challenges/english/25-front-end-development/workshop-piano/612e9a21381a1949327512e6.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e9a21381a1949327512e6.md
new file mode 100644
index 00000000000..01ea9f27a92
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e9a21381a1949327512e6.md
@@ -0,0 +1,89 @@
+---
+id: 612e9a21381a1949327512e6
+title: Step 13
+challengeType: 0
+dashedName: step-13
+---
+
+# --description--
+
+Move the keys into position by adjusting the `#piano` selector. Set the `padding` property to `90px 20px 0 20px`.
+
+# --hints--
+
+Your `#piano` selector should have the `padding` property set to `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/english/25-front-end-development/workshop-piano/612e9d142affc44a453655db.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e9d142affc44a453655db.md
new file mode 100644
index 00000000000..0f8ca9d6ba3
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e9d142affc44a453655db.md
@@ -0,0 +1,117 @@
+---
+id: 612e9d142affc44a453655db
+title: Step 14
+challengeType: 0
+dashedName: step-14
+---
+
+# --description--
+
+Time to style the keys themselves. Create a `class` selector for the `.key` elements. Set the `background-color` set to the value `#ffffff`, the `position` property to `relative`, the `width` property to `41px`, and the `height` property to `175px`.
+
+# --hints--
+
+You should have a `.key` selector.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key'));
+```
+
+Your `.key` selector should have a `background-color` property set to `#ffffff`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.backgroundColor === 'rgb(255, 255, 255)');
+```
+
+Your `.key` selector should have the `position` property set to `relative`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.position === 'relative');
+```
+
+Your `.key` selector should have a `width` property set to `41px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.width === '41px');
+```
+
+Your `.key` selector should have a `height` property set to `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/english/25-front-end-development/workshop-piano/612e9f1e7e5ccd4fa9ada0be.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e9f1e7e5ccd4fa9ada0be.md
new file mode 100644
index 00000000000..28c5419dac6
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612e9f1e7e5ccd4fa9ada0be.md
@@ -0,0 +1,103 @@
+---
+id: 612e9f1e7e5ccd4fa9ada0be
+title: Step 15
+challengeType: 0
+dashedName: step-15
+---
+
+# --description--
+
+Give the `.key` a `margin` of `2px` and a `float` property set to `left`.
+
+# --hints--
+
+Your `.key` selector should have a `margin` property set to `2px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key')?.margin === '2px');
+```
+
+Your `.key` selector should have a `float` property set to `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/english/25-front-end-development/workshop-piano/612ea4c4993aba52ab4aa32e.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612ea4c4993aba52ab4aa32e.md
new file mode 100644
index 00000000000..f0e8088dd82
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612ea4c4993aba52ab4aa32e.md
@@ -0,0 +1,119 @@
+---
+id: 612ea4c4993aba52ab4aa32e
+title: Step 16
+challengeType: 0
+dashedName: step-16
+---
+
+# --description--
+
+Now it's time to use the pseudo-selectors you set up earlier. To create the black keys, add a new `.key.black--key::after` selector. This targets elements with both `key` and `black--key` classes and selects the pseudo-element created after these elements in the HTML.
+
+In the new selector, set the `background-color` to `#1d1e22`. Also set the `content` property to `""`. This will make the pseudo-elements empty.
+
+The `content` property is used to set or override the content of an element. By default, the pseudo-elements created by the `::before` and `::after` selectors are empty, which means they are not rendered on the page. By setting the `content` property to an empty string `""`, you ensure that the pseudo-elements are rendered, while still appearing empty.
+
+If you would like to experiment, try removing the `background-color` property and setting different values for the `content` property, such as `"♥"`. Remember to undo these changes when you are done so the tests pass.
+
+# --hints--
+
+You should have a `.key.black--key::after` selector.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after'));
+```
+
+Your `.key.black--key::after` selector should have a `background-color` property set to `#1d1e22`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.backgroundColor === 'rgb(29, 30, 34)');
+```
+
+Your `.key.black--key::after` selector should have a `content` property set to `""`.
+
+```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/english/25-front-end-development/workshop-piano/612ea97df5742154772f312e.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612ea97df5742154772f312e.md
new file mode 100644
index 00000000000..a7340d458d2
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612ea97df5742154772f312e.md
@@ -0,0 +1,110 @@
+---
+id: 612ea97df5742154772f312e
+title: Step 17
+challengeType: 0
+dashedName: step-17
+---
+
+# --description--
+
+Give the `.key.black--key::after` a `position` property set to `absolute` and a `left` property set to `-18px`.
+
+# --hints--
+
+Your `.key.black--key::after` selector should have a `position` property set to `absolute`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.position === 'absolute');
+```
+
+Your `.key.black--key::after` selector should have a `left` property set to `-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/english/25-front-end-development/workshop-piano/612ead8788d28655ef8db056.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612ead8788d28655ef8db056.md
new file mode 100644
index 00000000000..72dbf9cc19c
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612ead8788d28655ef8db056.md
@@ -0,0 +1,112 @@
+---
+id: 612ead8788d28655ef8db056
+title: Step 18
+challengeType: 0
+dashedName: step-18
+---
+
+# --description--
+
+For the `.key.black--key::after`, set the `width` to `32px` and the `height` to `100px`.
+
+# --hints--
+
+Your `.key.black--key::after` should have a `width` property set to `32px`.
+
+```js
+assert(new __helpers.CSSHelp(document).getStyle('.key.black--key::after')?.width === '32px');
+```
+
+Your `.key.black--key::after` should have a `height` property set to `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/english/25-front-end-development/workshop-piano/612eaf56b7ba3257fdbfb0db.md b/curriculum/challenges/english/25-front-end-development/workshop-piano/612eaf56b7ba3257fdbfb0db.md
new file mode 100644
index 00000000000..37d6779238a
--- /dev/null
+++ b/curriculum/challenges/english/25-front-end-development/workshop-piano/612eaf56b7ba3257fdbfb0db.md
@@ -0,0 +1,144 @@
+---
+id: 612eaf56b7ba3257fdbfb0db
+title: Step 19
+challengeType: 0
+dashedName: step-19
+---
+
+# --description--
+
+The piano needs the freeCodeCamp logo to make it official.
+
+Add an `img` element before your `.keys` element. Give the `img` a `class` of `logo`, and set the `src` to `https://cdn.freecodecamp.org/platform/universal/fcc_primary.svg`. Give it an `alt` text of `freeCodeCamp Logo`.
+
+# --hints--
+
+You should add a new `img` element.
+
+```js
+assert(document.querySelectorAll('img')?.length === 1);
+```
+
+Your `img` element should come before your first `.keys` element.
+
+```js
+const img = document.querySelector('img');
+assert(img?.nextElementSibling?.className === 'keys');
+assert(img?.previousElementSibling === null);
+```
+
+Your `img` element should have a `class` set to `logo`.
+
+```js
+const img = document.querySelector('img');
+assert(img?.className === 'logo');
+```
+
+Your `img` element should have a `src` set to `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');
+```
+
+Your `img` element should have an `alt` attribute set to `freeCodeCamp Logo`.
+
+```js
+assert(document.querySelector('img')?.getAttribute('alt')?.toLowerCase() === 'freecodecamp logo');
+```
+
+Remember that casing and spelling matter.
+
+```js
+assert(document.querySelector('img')?.getAttribute('alt') === 'freeCodeCamp Logo');
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+ Piano
+
+
+
+
+ --fcc-editable-region--
+