From 84f5d7375b108f9fa01bfe7adedc329ca3fe75f8 Mon Sep 17 00:00:00 2001
From: Ilenia <26656284+ilenia-magoni@users.noreply.github.com>
Date: Fri, 26 Sep 2025 16:10:57 +0200
Subject: [PATCH] feat: add emoji reactor workshop (#61638)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Jessica Wilkins <67210629+jdwilkin4@users.noreply.github.com>
---
client/i18n/locales/english/intro.json | 6 +
.../workshop-emoji-reactor/index.md | 9 +
.../688c90634eb5ae69845ac35d.md | 143 ++++++++
.../6899b0d1825ff24e9fe8d747.md | 137 +++++++
.../6899b1d3bb656e56bd6937e2.md | 162 +++++++++
.../6899b593d232e07617f74055.md | 166 +++++++++
.../6899b7755876b10444ae3bcd.md | 147 ++++++++
.../6899b84e392df30ae370985e.md | 146 ++++++++
.../6899c30b1d26094e11170c92.md | 145 ++++++++
.../689af0bf1c707336ee9a1842.md | 153 ++++++++
.../689b15aacce1ae176ec768dc.md | 173 +++++++++
.../689b17e7e63b8e2c13839e98.md | 176 +++++++++
.../68a9f8378ddba1261a268cce.md | 181 ++++++++++
.../68a9fa161498c3324ac06fe1.md | 234 ++++++++++++
.../68a9fa1787009f3293b7ba7f.md | 209 +++++++++++
.../68a9fa18ad7a8432d0fc8621.md | 336 ++++++++++++++++++
.../68a9fa1976616e330813a96c.md | 218 ++++++++++++
.../blocks/workshop-emoji-reactor.json | 72 ++++
.../superblocks/full-stack-developer.json | 1 +
19 files changed, 2814 insertions(+)
create mode 100644 client/src/pages/learn/full-stack-developer/workshop-emoji-reactor/index.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/688c90634eb5ae69845ac35d.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b0d1825ff24e9fe8d747.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b1d3bb656e56bd6937e2.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b593d232e07617f74055.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b7755876b10444ae3bcd.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b84e392df30ae370985e.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/6899c30b1d26094e11170c92.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/689af0bf1c707336ee9a1842.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/689b15aacce1ae176ec768dc.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/689b17e7e63b8e2c13839e98.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/68a9f8378ddba1261a268cce.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/68a9fa161498c3324ac06fe1.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/68a9fa1787009f3293b7ba7f.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/68a9fa18ad7a8432d0fc8621.md
create mode 100644 curriculum/challenges/english/blocks/workshop-emoji-reactor/68a9fa1976616e330813a96c.md
create mode 100644 curriculum/structure/blocks/workshop-emoji-reactor.json
diff --git a/client/i18n/locales/english/intro.json b/client/i18n/locales/english/intro.json
index a09b6c96069..42b50d409c3 100644
--- a/client/i18n/locales/english/intro.json
+++ b/client/i18n/locales/english/intro.json
@@ -3613,6 +3613,12 @@
"In this workshop, you will build a storytelling app that will allow you to list different stories based on genre."
]
},
+ "workshop-emoji-reactor": {
+ "title": "Build an Emoji Reactor",
+ "intro": [
+ "In this workshop, you will build an emoji reactor to practice querySelector and querySelectorAll."
+ ]
+ },
"lab-favorite-icon-toggler": {
"title": "Build a Favorite Icon Toggler",
"intro": [
diff --git a/client/src/pages/learn/full-stack-developer/workshop-emoji-reactor/index.md b/client/src/pages/learn/full-stack-developer/workshop-emoji-reactor/index.md
new file mode 100644
index 00000000000..9a7c48cdd41
--- /dev/null
+++ b/client/src/pages/learn/full-stack-developer/workshop-emoji-reactor/index.md
@@ -0,0 +1,9 @@
+---
+title: Introduction to the Build an Emoji Reactor
+block: workshop-emoji-reactor
+superBlock: full-stack-developer
+---
+
+## Introduction to the Build an Emoji Reactor
+
+In this workshop, you will build an emoji reactor to practice `querySelector` and `querySelectorAll`.
diff --git a/curriculum/challenges/english/blocks/workshop-emoji-reactor/688c90634eb5ae69845ac35d.md b/curriculum/challenges/english/blocks/workshop-emoji-reactor/688c90634eb5ae69845ac35d.md
new file mode 100644
index 00000000000..d8b37e8e7ef
--- /dev/null
+++ b/curriculum/challenges/english/blocks/workshop-emoji-reactor/688c90634eb5ae69845ac35d.md
@@ -0,0 +1,143 @@
+---
+id: 688c90634eb5ae69845ac35d
+title: Step 1
+challengeType: 0
+dashedName: step-1
+demoType: onLoad
+---
+
+# --description--
+
+In this workshop you will create an Emoji Reactor App. The HTML boilerplate and all of the CSS has been provided for you.
+
+Start by creating a `main` element.
+
+Inside the `main` element create an `h1` element with a `class` of `title` and a text of `How are you feeling today?`.
+
+# --hints--
+
+You should have a `main` element.
+
+```js
+assert.exists(document.querySelector("main"));
+```
+
+You should have a `h1` as child of `main`.
+
+```js
+assert.exists(document.querySelector("main > h1"));
+```
+
+The `h1` element should have a class of `title`.
+
+```js
+assert.equal(document.querySelector("main > h1")?.className, "title");
+```
+
+The `h1` element should contain the text `How are you feeling today?`.
+
+```js
+assert.equal(document.querySelector("main > h1")?.textContent.trim(), "How are you feeling today?");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Emoji Reactor
+
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --light-grey: #efefef;
+ --white: #ffffff;
+ --very-dark-blue: #0a0a23;
+ --light-purple: #a78bfa;
+ --very-light-purple: #c4b5fd;
+ --purple: #8b5cf6;
+}
+
+body {
+ background-color: var(--very-dark-blue);
+ color: var(--light-grey);
+ font-family: sans-serif;
+}
+
+main {
+ text-align: center;
+ padding: 10px;
+}
+
+.btn-container,
+button {
+ display: flex;
+ justify-content: space-evenly;
+ align-items: center;
+}
+
+.btn-container {
+ flex-direction: column;
+}
+
+.emoji-btn {
+ width: 70%;
+ cursor: pointer;
+ color: var(--white);
+ background-color: var(--light-purple);
+ background-image: linear-gradient(
+ to bottom,
+ var(--very-light-purple),
+ var(--light-purple)
+ );
+ border: 3px solid var(--purple);
+ border-radius: 8px;
+ padding: 10px;
+ font-size: 1.5rem;
+ margin: 10px 0;
+ transition: background-color 0.3s ease, transform 0.2s ease;
+}
+
+@media (min-width: 768px) {
+ .emoji-btn {
+ width: 30%;
+ }
+}
+
+.emoji-btn:hover {
+ background-color: var(--purple);
+ background-image: none;
+}
+
+.title {
+ margin-top: 15px;
+ font-size: 2rem;
+}
+
+.description {
+ font-size: 1.4rem;
+ margin: 20px 0;
+}
+```
diff --git a/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b0d1825ff24e9fe8d747.md b/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b0d1825ff24e9fe8d747.md
new file mode 100644
index 00000000000..ed5360fa148
--- /dev/null
+++ b/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b0d1825ff24e9fe8d747.md
@@ -0,0 +1,137 @@
+---
+id: 6899b0d1825ff24e9fe8d747
+title: Step 2
+challengeType: 0
+dashedName: step-2
+---
+
+# --description--
+
+Below the `h1` element, add a `p` element with class `description`.
+
+Inside the `p` element write the text `Click on the buttons below to rate your emotions.`.
+
+# --hints--
+
+You should create a new `p` element below the `h1` element.
+
+```js
+assert.exists(document.querySelector("h1 + p"));
+```
+
+The new `p` element should have a class of `description`.
+
+```js
+assert.equal(document.querySelector("h1 + p")?.className, "description");
+```
+
+The new `p` element should have text of `Click on the buttons below to rate your emotions.`.
+
+```js
+assert.equal(document.querySelector("h1 + p")?.textContent.trim(), "Click on the buttons below to rate your emotions.");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Emoji Reactor
+
+
+
+
+--fcc-editable-region--
+ How are you feeling today?
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --light-grey: #efefef;
+ --white: #ffffff;
+ --very-dark-blue: #0a0a23;
+ --light-purple: #a78bfa;
+ --very-light-purple: #c4b5fd;
+ --purple: #8b5cf6;
+}
+
+body {
+ background-color: var(--very-dark-blue);
+ color: var(--light-grey);
+ font-family: sans-serif;
+}
+
+main {
+ text-align: center;
+ padding: 10px;
+}
+
+.btn-container,
+button {
+ display: flex;
+ justify-content: space-evenly;
+ align-items: center;
+}
+
+.btn-container {
+ flex-direction: column;
+}
+
+.emoji-btn {
+ width: 70%;
+ cursor: pointer;
+ color: var(--white);
+ background-color: var(--light-purple);
+ background-image: linear-gradient(
+ to bottom,
+ var(--very-light-purple),
+ var(--light-purple)
+ );
+ border: 3px solid var(--purple);
+ border-radius: 8px;
+ padding: 10px;
+ font-size: 1.5rem;
+ margin: 10px 0;
+ transition: background-color 0.3s ease, transform 0.2s ease;
+}
+
+@media (min-width: 768px) {
+ .emoji-btn {
+ width: 30%;
+ }
+}
+
+.emoji-btn:hover {
+ background-color: var(--purple);
+ background-image: none;
+}
+
+.title {
+ margin-top: 15px;
+ font-size: 2rem;
+}
+
+.description {
+ font-size: 1.4rem;
+ margin: 20px 0;
+}
+```
diff --git a/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b1d3bb656e56bd6937e2.md b/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b1d3bb656e56bd6937e2.md
new file mode 100644
index 00000000000..f5f6e9b300c
--- /dev/null
+++ b/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b1d3bb656e56bd6937e2.md
@@ -0,0 +1,162 @@
+---
+id: 6899b1d3bb656e56bd6937e2
+title: Step 3
+challengeType: 0
+dashedName: step-3
+---
+
+# --description--
+
+Below the `p` element, create a `div` element with the class `btn-container`.
+
+Inside the `div` element, create a `button` element.
+
+This `button` should have an `id` of `happy-btn`, a class of `emoji-btn` and an `aria-label` of `Happy face emoji`.
+
+# --hints--
+
+Create a new `div` element below the `p` element.
+
+```js
+assert.exists(document.querySelector("p + div"));
+```
+
+The new `div` element should have a class of `btn-container`.
+
+```js
+assert.equal(document.querySelector("p + div")?.className, "btn-container");
+```
+
+There should be a `button` element inside the `div` element.
+
+```js
+assert.exists(document.querySelector("div > button"));
+```
+
+The `button` element should have an `id` of `happy-btn`.
+
+```js
+assert.equal(document.querySelector("div > button")?.id, "happy-btn");
+```
+
+The `button` element should have a `class` of `emoji-btn`.
+
+```js
+assert.equal(document.querySelector("div > button")?.className, "emoji-btn");
+```
+
+The `button` element should have an `aria-label` of `Happy face emoji`.
+
+```js
+assert.equal(document.querySelector("div > button")?.getAttribute("aria-label"), "Happy face emoji");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Emoji Reactor
+
+
+
+
+
+ How are you feeling today?
+
+
+ Click on the buttons below to rate your emotions.
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --light-grey: #efefef;
+ --white: #ffffff;
+ --very-dark-blue: #0a0a23;
+ --light-purple: #a78bfa;
+ --very-light-purple: #c4b5fd;
+ --purple: #8b5cf6;
+}
+
+body {
+ background-color: var(--very-dark-blue);
+ color: var(--light-grey);
+ font-family: sans-serif;
+}
+
+main {
+ text-align: center;
+ padding: 10px;
+}
+
+.btn-container,
+button {
+ display: flex;
+ justify-content: space-evenly;
+ align-items: center;
+}
+
+.btn-container {
+ flex-direction: column;
+}
+
+.emoji-btn {
+ width: 70%;
+ cursor: pointer;
+ color: var(--white);
+ background-color: var(--light-purple);
+ background-image: linear-gradient(
+ to bottom,
+ var(--very-light-purple),
+ var(--light-purple)
+ );
+ border: 3px solid var(--purple);
+ border-radius: 8px;
+ padding: 10px;
+ font-size: 1.5rem;
+ margin: 10px 0;
+ transition: background-color 0.3s ease, transform 0.2s ease;
+}
+
+@media (min-width: 768px) {
+ .emoji-btn {
+ width: 30%;
+ }
+}
+
+.emoji-btn:hover {
+ background-color: var(--purple);
+ background-image: none;
+}
+
+.title {
+ margin-top: 15px;
+ font-size: 2rem;
+}
+
+.description {
+ font-size: 1.4rem;
+ margin: 20px 0;
+}
+```
diff --git a/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b593d232e07617f74055.md b/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b593d232e07617f74055.md
new file mode 100644
index 00000000000..8d84f33737c
--- /dev/null
+++ b/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b593d232e07617f74055.md
@@ -0,0 +1,166 @@
+---
+id: 6899b593d232e07617f74055
+title: Step 4
+challengeType: 0
+dashedName: step-4
+---
+
+# --description--
+
+Inside the `button` element, create a `span` element that contains `😊`
+
+Give to the `span` element a `role` attribute with a value of `img` and an `aria-hidden` attribute with a value of `true`.
+
+Then, create a second `span` element with a `class` of `count` containing the text `0/10`.
+
+# --hints--
+
+Inside the `button` element there should be two `span` elements.
+
+```js
+assert.lengthOf(document.querySelectorAll("button > span"), 2);
+```
+
+The first `span` element should have a text content of `😊`.
+
+```js
+assert.equal(document.querySelectorAll("button > span")[0]?.textContent.trim(), "😊");
+```
+
+The first `span` element should have a `role` attribute with value of `img`.
+
+```js
+assert.equal(document.querySelectorAll("button > span")[0]?.getAttribute("role"), "img");
+```
+
+The first `span` element should have an `aria-hidden` attribute with value of `true`.
+
+```js
+assert.equal(document.querySelectorAll("button > span")[0]?.getAttribute("aria-hidden"), "true");
+```
+
+The second `span` element should have a `class` attribute with value of `count`.
+
+```js
+assert.equal(document.querySelectorAll("button > span")[1]?.className, "count");
+```
+
+The second `span` element should have a text content of `0/10`.
+
+```js
+assert.equal(document.querySelectorAll("button > span")[1]?.textContent.trim(), "0/10");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
+
+
+
+ Emoji Reactor
+
+
+
+
+
+ How are you feeling today?
+
+
+ Click on the buttons below to rate your emotions.
+
+
+--fcc-editable-region--
+
+--fcc-editable-region--
+
+
+
+
+```
+
+```css
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+:root {
+ --light-grey: #efefef;
+ --white: #ffffff;
+ --very-dark-blue: #0a0a23;
+ --light-purple: #a78bfa;
+ --very-light-purple: #c4b5fd;
+ --purple: #8b5cf6;
+}
+
+body {
+ background-color: var(--very-dark-blue);
+ color: var(--light-grey);
+ font-family: sans-serif;
+}
+
+main {
+ text-align: center;
+ padding: 10px;
+}
+
+.btn-container,
+button {
+ display: flex;
+ justify-content: space-evenly;
+ align-items: center;
+}
+
+.btn-container {
+ flex-direction: column;
+}
+
+.emoji-btn {
+ width: 70%;
+ cursor: pointer;
+ color: var(--white);
+ background-color: var(--light-purple);
+ background-image: linear-gradient(
+ to bottom,
+ var(--very-light-purple),
+ var(--light-purple)
+ );
+ border: 3px solid var(--purple);
+ border-radius: 8px;
+ padding: 10px;
+ font-size: 1.5rem;
+ margin: 10px 0;
+ transition: background-color 0.3s ease, transform 0.2s ease;
+}
+
+@media (min-width: 768px) {
+ .emoji-btn {
+ width: 30%;
+ }
+}
+
+.emoji-btn:hover {
+ background-color: var(--purple);
+ background-image: none;
+}
+
+.title {
+ margin-top: 15px;
+ font-size: 2rem;
+}
+
+.description {
+ font-size: 1.4rem;
+ margin: 20px 0;
+}
+```
diff --git a/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b7755876b10444ae3bcd.md b/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b7755876b10444ae3bcd.md
new file mode 100644
index 00000000000..df16eaf7792
--- /dev/null
+++ b/curriculum/challenges/english/blocks/workshop-emoji-reactor/6899b7755876b10444ae3bcd.md
@@ -0,0 +1,147 @@
+---
+id: 6899b7755876b10444ae3bcd
+title: Step 5
+challengeType: 0
+dashedName: step-5
+---
+
+# --description--
+
+Now it's time to link the JavaScript file.
+
+Add a `script` element right before the closing tag of the `body` element with the right attribute and value to link the `script.js` file.
+
+# --hints--
+
+You should have a `script` element.
+
+```js
+assert.match(code, /
+