`.
-
-```js
-assert.exists(document.querySelector('p'));
-```
-
-Your `p` tags should be in lowercase. By convention, all HTML tags are written in lowercase.
-
-```js
-assert.notMatch(code, /<\/?P>/);
-```
-
-Your `p` element should have a closing tag. Closing tags have a `/` just after the `<` character.
-
-```js
-assert.match(code, /<\/p\>/);
-```
-
-Your `p` element's text should be `Everyone loves cute cats online!` You have either omitted the text or have a typo.
-
-```js
-const extraSpacesRemoved = document
- .querySelector('p')
- ?.innerText.replace(/\s+/g, ' ');
-assert.match(extraSpacesRemoved, /everyone loves cute cats online!$/i);
-```
-
-Your `p` element should be below the `h2` element. You have them in the wrong order.
-
-```js
-const collection = [...document.querySelectorAll('h2,p')].map(
- (node) => node.nodeName
-);
-assert.isBelow(collection.indexOf('H2'), collection.indexOf('P'));
-```
-
-# --seed--
-
-## --seed-contents--
-
-```html
-
-
- CatPhotoApp
---fcc-editable-region--
- Cat Photos
-
---fcc-editable-region--
-
-
-```
diff --git a/curriculum/challenges/english/blocks/cat-photo-app/5dc17dc8f86c76b9248c6eb5.md b/curriculum/challenges/english/blocks/cat-photo-app/5dc17dc8f86c76b9248c6eb5.md
deleted file mode 100644
index 224bba20d8d..00000000000
--- a/curriculum/challenges/english/blocks/cat-photo-app/5dc17dc8f86c76b9248c6eb5.md
+++ /dev/null
@@ -1,88 +0,0 @@
----
-id: 5dc17dc8f86c76b9248c6eb5
-title: Step 4
-challengeType: 0
-dashedName: step-4
----
-
-# --description--
-
-Commenting allows you to leave messages without affecting the browser display. It also allows you to make code inactive. A comment in HTML starts with ``.
-
-Here is an example of a comment with the `TODO: Remove h1`:
-
-```html
-
-```
-
-Add a comment above the `p` element with this text:
-
-`TODO: Add link to cat photos`
-
-# --hints--
-
-Your comment should start with ``. You are missing one or more of the characters that define the end of a comment.
-
-```js
-assert.match(code, /-->/);
-```
-
-Your code should not have extra opening/closing comment characters. You have an extra `` displaying in the browser.
-
-```js
-const noSpaces = code.replace(/\s/g, '');
-assert.isBelow(noSpaces.match(//g)?.length, 2);
-```
-
-Your comment should be above the `p` element. You have them in the wrong order.
-
-```js
-assert.match(
- code.replace(/\s/g, ''),
- /everyonelovescutecatsonline!<\/p>/i
-);
-```
-
-Your comment should contain the text `TODO: Add link to cat photos`.
-
-```js
-assert.match(code, //i);
-```
-
-# --seed--
-
-## --seed-contents--
-
-```html
-
-
- CatPhotoApp
- Cat Photos
---fcc-editable-region--
-
- Everyone loves cute cats online!
-
---fcc-editable-region--
-
-
-```
-
-# --solutions--
-
-```html
-
-
- CatPhotoApp
- Cat Photos
-
- Everyone loves cute cats online!
-
-
-```
diff --git a/curriculum/challenges/english/blocks/event-hub/66ebd4ae2812430bb883c787.md b/curriculum/challenges/english/blocks/event-hub/66ebd4ae2812430bb883c787.md
deleted file mode 100644
index daebc74e2ac..00000000000
--- a/curriculum/challenges/english/blocks/event-hub/66ebd4ae2812430bb883c787.md
+++ /dev/null
@@ -1,335 +0,0 @@
----
-id: 66ebd4ae2812430bb883c787
-title: Build an Event Hub
-challengeType: 25
-dashedName: lab-event-hub
-demoType: onClick
----
-
-# --description--
-
-In this lab you will utilize the semantic HTML elements to create the structure of a web page. You'll add content and images to make it look like a real event hub.
-
-Fulfill the user stories below and get all the tests to pass to complete the lab.
-
-**User Stories:**
-
-1. You should have a `header` element.
-1. Inside the `header` element, you should have an `h1` element that contains the text `Event Hub`, and a `nav` element.
-1. Inside the `nav` element, you should have an unordered list of two items containing links to different sections of the page. The first item should have the text `Upcoming Events`, and the second item should have the text `Past Events`.
-1. Each link should be represented by an `a` element with an `href` attribute that links to the corresponding section of the page, `#upcoming-events` and `#past-events` respectively.
-1. You should have a `main` element that contains the different sections of the page.
-1. Inside the `main` element, you should have two `section` elements.
-1. The first `section` element should have an `id` attribute with the value `upcoming-events`
-1. Inside the `#upcoming-events` section, you should have:
-
- - An `h2` element with the text `Upcoming Events`.
- - Two `article` elements. Each article should represent an event, and it should have :
- - An `h3` element for the event title.
- - A `p` element for the event description. You can add a date at the bottom if you like.
-
-1. The second `section` element should have an `id` attribute with the value `past-events`.
-1. Inside the `#past-events` section, you should have:
-
- - An `h2` element with the text `Past Events`.
- - Two `article` elements. Each article element should represent a past event, and it should have:
- - An `h3` element for the event title,
- - A `p` element for the event description. You can add a date at the bottom if you like.
- - An image element with the `src` attribute pointing to an image file and the `alt` attribute with a description of the image.
-
-**Note:** You can use any text for the event descriptions and dates. You can use the following image URLs for the images if you like:
-
-- `https://cdn.freecodecamp.org/curriculum/labs/past-event1.jpg`.
-- `https://cdn.freecodecamp.org/curriculum/labs/past-event2.jpg`.
-
-# --hints--
-
-You should have a `header` element.
-
-```js
-assert.isNotNull(document.querySelector("header"));
-```
-
-Your `header` element should come after the opening `body` tag.
-
-```js
-assert.equal(document.querySelector("body")?.firstElementChild?.tagName, "HEADER");
-```
-
-Inside the `header` element, you should have an `h1` element that contains the text `Event Hub`.
-
-```js
-const h1Element = document.querySelector('header h1');
-assert.strictEqual(h1Element?.innerText, "Event Hub");
-```
-
-Inside the `header` element, after the `h1` element, you should have a `nav` element.
-
-```js
-assert.isNotNull(document.querySelector("header>h1+nav"));
-```
-
-Your `nav` element should contain an unordered list of two items.
-
-```js
-const liElements = document.querySelectorAll('header nav>ul>li');
-
-assert.isNotNull('header nav>ul');
-assert.strictEqual(liElements.length, 2);
-```
-
-The first item in the unordered list should be a link.
-
-```js
-const firstLink = document.querySelectorAll('header nav ul li a')[0];
-assert.exists(firstLink);
-```
-
-The second item in the unordered list should be a link.
-
-```js
-const secondLink = document.querySelectorAll('header nav ul li a')[1];
-assert.exists(secondLink);
-```
-
-The text of the first item in the unordered list should be `Upcoming Events`.
-
-```js
-const firstLink = document.querySelectorAll('header nav>ul>li>a')[0];
-assert.strictEqual(firstLink.innerText, "Upcoming Events");
-```
-
-The first item in the unordered list should have the `href` set to `#upcoming-events`.
-
-```js
-const anchorElement = document.querySelectorAll("header nav>ul>li>a")[0];
-const hrefAttribute = anchorElement?.getAttribute("href");
-assert.strictEqual(hrefAttribute, "#upcoming-events");
-```
-
-The text of the second item in the unordered list should be `Past Events`.
-
-```js
-const secondLink = document.querySelectorAll('header nav>ul>li>a')[1];
-assert.strictEqual(secondLink.innerText, "Past Events");
-```
-
-The second item in the unordered list should have the `href` set to `#past-events`.
-
-```js
-const anchorElement = document.querySelectorAll("header nav>ul>li>a")[1];
-const hrefAttribute = anchorElement?.getAttribute("href");
-assert.strictEqual(hrefAttribute, "#past-events");
-```
-
-You should have a `main` element after the `header` element closing tag.
-
-```js
-const mainElement = document.querySelector("body>header+main");
-assert.isNotNull(mainElement);
-```
-
-Inside the `main` element, you should have two `section` elements.
-
-```js
-const sectionElements = document.querySelectorAll('body>header+main>section');
-assert.strictEqual(sectionElements.length, 2);
-```
-
-Your first `section` element should have an `id` attribute with the value `upcoming-events`.
-
-```js
-const firstSection = document.querySelectorAll('body>header+main>section')[0];
-const idAttribute = firstSection?.getAttribute("id");
-assert.strictEqual(idAttribute, "upcoming-events");
-```
-
-Your second `section` element should have an `id` attribute with the value `past-events`.
-
-```js
-const secondSection = document.querySelectorAll('body>header+main>section')[1];
-const idAttribute = secondSection?.getAttribute("id");
-assert.strictEqual(idAttribute, "past-events");
-```
-
-Inside the `#upcoming-events` section, you should have an `h2` element with the text `Upcoming Events`.
-
-```js
-const h2Element = document.querySelector('#upcoming-events h2');
-assert.strictEqual(h2Element?.innerText, "Upcoming Events");
-```
-
-Inside the `#upcoming-events` section, you should have two `article` elements below the `h2` element.
-
-```js
-const articleElements = document.querySelectorAll('#upcoming-events h2 ~ article');
-assert.strictEqual(articleElements.length, 2);
-```
-
-Both of the `article` elements inside the `#upcoming-events` section should have an `h3` element for the event title.
-
-```js
-const h3Elements = document.querySelectorAll('#upcoming-events article h3');
-assert.strictEqual(h3Elements.length, 2);
-```
-
-Both of the `article` elements inside the `#upcoming-events` section should have a paragraph element for the event description.
-
-```js
-const articles = document.querySelectorAll('#upcoming-events article');
-assert.isNotEmpty(articles);
-articles.forEach(article => {
- assert.isAtLeast(article.querySelectorAll('h3 ~ p').length, 1);
-});
-```
-
-Inside the `#past-events` section, you should have an `h2` element with the text `Past Events`.
-
-```js
-const h2Element = document.querySelector('#past-events h2');
-assert.strictEqual(h2Element?.innerText, "Past Events");
-```
-
-Inside the `#past-events` section, you should have two `article` elements below the `h2` element.
-
-```js
-const articleElements = document.querySelectorAll('#past-events h2 ~ article');
-assert.strictEqual(articleElements.length, 2);
-```
-
-Both of the `article` elements inside the `#past-events` section should have an `h3` element for the event title.
-
-```js
-const h3Elements = document.querySelectorAll('#past-events article h3');
-assert.strictEqual(h3Elements.length, 2);
-```
-
-Both of the `article` elements inside the `#past-events` section should have a paragraph element for the event description.
-
-```js
-const articles = document.querySelectorAll('#past-events article');
-assert.isNotEmpty(articles);
-articles.forEach(article => {
- assert.isAtLeast(article.querySelectorAll('h3 ~ p').length, 1);
-});
-```
-
-Both of the `article` elements inside the `#past-events` section should have an image element.
-
-```js
-const imgElements = document.querySelectorAll('#past-events article img');
-assert.strictEqual(imgElements.length, 2);
-```
-
-Both of the image elements inside the `#past-events` section should have the `src` attribute pointing to an image file.
-
-```js
-const imgElements = document.querySelectorAll('#past-events article img');
-assert.strictEqual(imgElements.length, 2);
-
-for (let img of imgElements) {
- assert.exists(img.getAttribute("src"));
-}
-```
-
-Both of the image elements inside the `#past-events` section should have the `alt` attribute with a description of the image.
-
-```js
-const imgElements = document.querySelectorAll('#past-events article img');
-assert.strictEqual(imgElements.length, 2);
-
-for (let img of imgElements) {
- assert.exists(img.getAttribute("alt"));
-}
-```
-
-Each `h3` element should have the event title.
-
-```js
-const eventTitles = document.querySelectorAll('h3');
-assert.isNotEmpty(eventTitles);
-eventTitles.forEach((eventTitle => assert.isNotEmpty(eventTitle.innerText)));
-```
-
-Each `p` element should have the event description.
-
-```js
-const eventDescriptions = document.querySelectorAll('p');
-assert.isNotEmpty(eventDescriptions);
-eventDescriptions.forEach((eventDescription => assert.isNotEmpty(eventDescription.innerText)));
-```
-
-# --seed--
-
-## --seed-contents--
-
-```html
-
-
-
-
-
- Event Hub
-
-
-
-
-
-
-
-```
-
-# --solutions--
-
-```html
-
-
-
-
-
- Event Hub
-
-
-
-
-
- Upcoming Events
-
- AI & Machine Learning Conference 2024
- Join us for a deep dive into the latest advancements in artificial intelligence and machine learning. Industry leaders will share insights and case studies on how AI is transforming various sectors.
- Date: August 10, 2024
-
-
- Web Development Bootcamp
- A hands-on workshop designed for developers looking to enhance their skills in modern web technologies including React, Node.js, and GraphQL. Perfect for both beginners and experienced developers.
- Date: September 5, 2024
-
-
-
- Past Events
-
- Cybersecurity Summit 2024
- An event focusing on the latest trends and threats in cybersecurity. Experts discussed strategies for protecting data and ensuring privacy in an increasingly digital world.
- Date: June 15, 2024
-
-
-
- Blockchain Expo 2024
- A comprehensive event covering the future of blockchain technology. Topics included decentralized finance (DeFi), smart contracts, and the impact of blockchain on various industries.
- Date: July 20, 2024
-
-
-
-
-
-
-```
-
diff --git a/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-better-calculator-video.md b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-better-calculator-video.md
new file mode 100644
index 00000000000..2e969e83611
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-better-calculator-video.md
@@ -0,0 +1,37 @@
+---
+id: a9f9c5bf295034800d6c77ad
+title: Building a Better Calculator
+challengeType: 11
+videoId: lOltMrA6kuY
+dashedName: building-a-better-calculator-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to build an improved calculator program using if statements.
+
+# --questions--
+
+## --text--
+
+Which of the following built-in functions is used to convert a string to a float?
+
+## --answers--
+
+`floats()`
+
+---
+
+`floating_point()`
+
+---
+
+`float()`
+
+---
+
+`fl()`
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-functions-video.md b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-functions-video.md
new file mode 100644
index 00000000000..f73f9d1c5e5
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-functions-video.md
@@ -0,0 +1,57 @@
+---
+id: 58d5d031e969765037c1bebb
+title: Functions
+challengeType: 11
+videoId: QN3UNoJVS9g
+dashedName: functions-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to define and call a function.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to call a function?
+
+## --answers--
+
+```python
+def sayhi():
+ print("Hello World")
+
+sayhi()()
+```
+
+---
+
+```python
+def sayhi():
+ print("Hello World")
+
+()sayhi()
+```
+
+---
+
+```python
+def sayhi():
+ print("Hello World")
+
+sayhi
+```
+
+---
+
+```python
+def sayhi():
+ print("Hello World")
+
+sayhi()
+```
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-if-comparisons-video.md b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-if-comparisons-video.md
new file mode 100644
index 00000000000..c09c70427de
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-if-comparisons-video.md
@@ -0,0 +1,37 @@
+---
+id: 8314d0bbddb0aa027a144705
+title: If Statements and Comparisons
+challengeType: 11
+videoId: frb0CCrS9X8
+dashedName: if-statements-and-comparisons-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn about comparison operators.
+
+# --questions--
+
+## --text--
+
+Which of the following operators is used to check if one number is greater than or equal to another number?
+
+## --answers--
+
+`<`
+
+---
+
+`<=`
+
+---
+
+`>`
+
+---
+
+`>=`
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-if-statements-video.md b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-if-statements-video.md
new file mode 100644
index 00000000000..cc568e7a40b
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-if-statements-video.md
@@ -0,0 +1,47 @@
+---
+id: 08854a2c6f052efa1e5270d2
+title: If Statements
+challengeType: 11
+videoId: lruoyNlItfg
+dashedName: if-statements-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to use if statements to control the flow of your Python programs based on conditions.
+
+# --questions--
+
+## --text--
+
+What will be the output for the following code?
+
+```python
+is_male = True
+is_tall = True
+
+if is_male or is_tall:
+ print("You are a male")
+else:
+ print("You are not a male")
+```
+
+## --answers--
+
+`"You are not a male"`
+
+---
+
+`"You are a male"`
+
+---
+
+`"You are not a male" and "You are a male"`
+
+---
+
+`None`
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-return-statement-video.md b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-return-statement-video.md
new file mode 100644
index 00000000000..46ce119f28c
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-control-flow-functions/learn-python-return-statement-video.md
@@ -0,0 +1,44 @@
+---
+id: c6c9dae4017830e187eeaf42
+title: Return Statement
+challengeType: 11
+videoId: Gx3VTsaMCHU
+dashedName: return-statement-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to use the return statement in functions.
+
+# --questions--
+
+## --text--
+
+What will be the output for the following code?
+
+```python
+def cube(num):
+ num*num*num
+
+print(cube(3))
+```
+
+## --answers--
+
+`None`
+
+---
+
+`Undefined`
+
+---
+
+`3`
+
+---
+
+`27`
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-drawing-shape-video.md b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-drawing-shape-video.md
new file mode 100644
index 00000000000..fc3ad498a20
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-drawing-shape-video.md
@@ -0,0 +1,54 @@
+---
+id: 62baa9d28e8723f635a0093e
+title: Drawing a Shape
+challengeType: 11
+videoId: vcNZZSeyZkY
+dashedName: drawing-a-shape-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to print a basic shape to the console using `print` statements.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to print a triangle to the console?
+
+## --answers--
+
+```python
+print(" /| / | / | /___|")
+```
+
+---
+
+```python
+print( /|)
+print( / |)
+print( / |)
+print(/___|)
+```
+
+---
+
+```python
+print(" /|")
+print(" / |")
+print(" / |")
+print("/___|")
+```
+
+---
+
+```python
+print(" /|")
+print(" / |")
+print(" / |")
+print("/___|")
+```
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-numbers-video.md b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-numbers-video.md
new file mode 100644
index 00000000000..10705f09d0a
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-numbers-video.md
@@ -0,0 +1,37 @@
+---
+id: 8ad37ddb7a23050f71cc9cc9
+title: Working with Numbers
+challengeType: 11
+videoId: C7sxe5GAArQ
+dashedName: working-with-numbers-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to work with basic arithmetic operations and built-in number functions.
+
+# --questions--
+
+## --text--
+
+Which of the following built-in functions is used to return the base number raised to a power?
+
+## --answers--
+
+`base()`
+
+---
+
+`power()`
+
+---
+
+`pow()`
+
+---
+
+`exp()`
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-strings-video.md b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-strings-video.md
new file mode 100644
index 00000000000..ba673dd565a
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-strings-video.md
@@ -0,0 +1,49 @@
+---
+id: 0e2f4bd857b1edc70bfcd1f9
+title: Working with Strings
+challengeType: 11
+videoId: OrejgL7kP3M
+dashedName: working-with-strings-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn about string concatenation, indexing, and useful string methods.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to access the first character of a string?
+
+## --answers--
+
+```python
+phrase = "Giraffe Academy"
+print(phrase[1])
+```
+
+---
+
+```python
+phrase = "Giraffe Academy"
+print(phrase[0])
+```
+
+---
+
+```python
+phrase = "Giraffe Academy"
+print(phrase[-1])
+```
+
+---
+
+```python
+phrase = "Giraffe Academy"
+print(phrase[2])
+```
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-user-input-video.md b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-user-input-video.md
new file mode 100644
index 00000000000..1d11cc532d5
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-user-input-video.md
@@ -0,0 +1,37 @@
+---
+id: 155ca30775751b78a860a79b
+title: Getting Input from Users
+challengeType: 11
+videoId: C0L4cnqKqDw
+dashedName: getting-input-from-users-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to get input from the user.
+
+# --questions--
+
+## --text--
+
+Which of the following built-in functions is used to get input from the user?
+
+## --answers--
+
+`input()`
+
+---
+
+`os.stdin()`
+
+---
+
+`stdin()`
+
+---
+
+`prompt()`
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-variables-types-video.md b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-variables-types-video.md
new file mode 100644
index 00000000000..b4ab786b781
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-core-primitives/learn-python-variables-types-video.md
@@ -0,0 +1,37 @@
+---
+id: 315017f4457c19d45c2be034
+title: Variables and Data Types
+challengeType: 11
+videoId: sIw317W39X0
+dashedName: variables-and-data-types-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn about the different data types in Python including integers, strings and booleans.
+
+# --questions--
+
+## --text--
+
+What is a boolean?
+
+## --answers--
+
+It is a data type that represents an `undefined` value.
+
+---
+
+It is a data type that represents a sequence of characters.
+
+---
+
+It is a data type that represents `True` or `False`.
+
+---
+
+It is a data type that represents a float.
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-list-functions-video.md b/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-list-functions-video.md
new file mode 100644
index 00000000000..4fa4b8c590d
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-list-functions-video.md
@@ -0,0 +1,43 @@
+---
+id: 24a45b3960b3aa68dff2cd9e
+title: List Functions
+challengeType: 11
+videoId: _5FQ5f3RW5U
+dashedName: list-functions-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to work with useful methods including the `append()`, `index()`, `clear()`, `sort()`, and `reverse()` methods.
+
+# --questions--
+
+## --text--
+
+What will be the output for the following code?
+
+```python
+friends = ["Kevin", "Karen", "Jim", "Oscar", "Toby"]
+
+print(friends.index("Oscar"))
+```
+
+## --answers--
+
+4
+
+---
+
+1
+
+---
+
+2
+
+---
+
+3
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-lists-video.md b/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-lists-video.md
new file mode 100644
index 00000000000..76e34304e1c
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-lists-video.md
@@ -0,0 +1,42 @@
+---
+id: 39a400e9163c5a0b33587e18
+title: Lists
+challengeType: 11
+videoId: DtMPzGOHZ2M
+dashedName: lists-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn about lists, list indexing, slicing, and basic list operations.
+
+# --questions--
+
+## --text--
+
+What will be the output for the following code?
+
+```python
+friends = ["Kevin", "Karen", "Jim"]
+print(friends[-1])
+```
+
+## --answers--
+
+`"Kevin"`
+
+---
+
+`"Jim"`
+
+---
+
+`"Karen"`
+
+---
+
+`Error`
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-tuples-video.md b/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-tuples-video.md
new file mode 100644
index 00000000000..11bf35913f1
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-data-structures/learn-python-tuples-video.md
@@ -0,0 +1,45 @@
+---
+id: 5ed596ba3306cf2c1a94bb92
+title: Tuples
+challengeType: 11
+videoId: g6fwjiEFG-Y
+dashedName: tuples-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn about tuples in Python and how they differ from lists.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to create a tuple?
+
+## --answers--
+
+```python
+coordinates = [4, 5]
+```
+
+---
+
+```python
+coordinates = (4, 5)
+```
+
+---
+
+```python
+coordinates = <4, 5>
+```
+
+---
+
+```python
+coordinates = /4, 5/
+```
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/english/blocks/learn-python-oop/learn-python-classes-objects-video.md b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-classes-objects-video.md
new file mode 100644
index 00000000000..21582bd38b2
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-classes-objects-video.md
@@ -0,0 +1,37 @@
+---
+id: a0339c4075344cbfc2cd939c
+title: Classes and Objects
+challengeType: 11
+videoId: fR3dh5_MPJs
+dashedName: classes-and-objects-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to create classes and objects in Python to write object-oriented programs.
+
+# --questions--
+
+## --text--
+
+What is the role of `def __init__(self):` inside of a class?
+
+## --answers--
+
+It represents a function for calling the method.
+
+---
+
+It specifies the type of the class.
+
+---
+
+It allows a class to inherit methods from another class.
+
+---
+
+It represents an initializer method.
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-oop/learn-python-inheritance-video.md b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-inheritance-video.md
new file mode 100644
index 00000000000..a30dea1cd53
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-inheritance-video.md
@@ -0,0 +1,37 @@
+---
+id: 697fe5c032baa3841ab62a64
+title: Inheritance
+challengeType: 11
+videoId: uHdNSULVpgY
+dashedName: inheritance-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn about inheritance in object oriented programming.
+
+# --questions--
+
+## --text--
+
+What is inheritance in object oriented programming?
+
+## --answers--
+
+This is when a class reuses code from a function.
+
+---
+
+This is when a class creates a copy of another class.
+
+---
+
+This is when a class inherits properties and behaviors from another class.
+
+---
+
+This is when a class hides its methods and variables from other classes.
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-oop/learn-python-interpreter-video.md b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-interpreter-video.md
new file mode 100644
index 00000000000..8199a37c840
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-interpreter-video.md
@@ -0,0 +1,37 @@
+---
+id: 697fe6c932baa3841ab62a65
+title: Python Interpreter
+challengeType: 11
+videoId: -c1vFEsIod4
+dashedName: python-interpreter-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to work with the Python interpreter.
+
+# --questions--
+
+## --text--
+
+What is the Python interpreter?
+
+## --answers--
+
+This is a program that writes Python code for you.
+
+---
+
+This is a tool that compiles Python into Java or C++.
+
+---
+
+This is a library that stores Python functions.
+
+---
+
+This is a program that reads and executes Python code.
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-oop/learn-python-object-functions-video.md b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-object-functions-video.md
new file mode 100644
index 00000000000..3441b78b980
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-object-functions-video.md
@@ -0,0 +1,69 @@
+---
+id: 697fe3cb32baa3841ab62a63
+title: Object Functions
+challengeType: 11
+videoId: 3Mla2uUDSu8
+dashedName: object-functions-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to work with functions inside of classes.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to create a function inside of a class?
+
+## --answers--
+
+```python
+class Student:
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+ def greet(self.function):
+ return f"Hello, my name is {self.name} and I am {self.age} years old."
+```
+
+---
+
+```python
+class Student:
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+ def greet(self):
+ return f"Hello, my name is {self.name} and I am {self.age} years old."
+```
+
+---
+
+```python
+class Student:
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+ def greet(self):
+ self.pass
+```
+
+---
+
+```python
+class Student:
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+ greet = (self):
+ return f"Hello, my name is {self.name} and I am {self.age} years old."
+```
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/english/blocks/learn-python-oop/learn-python-quiz-project-video.md b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-quiz-project-video.md
new file mode 100644
index 00000000000..9860638d339
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-oop/learn-python-quiz-project-video.md
@@ -0,0 +1,37 @@
+---
+id: 9afe5e8141b13e9f1d59d46e
+title: Building a Multiple Choice Quiz
+challengeType: 11
+videoId: GJMmSaB8RN0
+dashedName: building-a-multiple-choice-quiz-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will practice what you have learned about classes and objects by building a multiple choice quiz.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to import the `Question` class from the `Question` module?
+
+## --answers--
+
+`Question import`
+
+---
+
+`from Question`
+
+---
+
+`from Question import Question`
+
+---
+
+`import Question.py`
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-comments-video.md b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-comments-video.md
new file mode 100644
index 00000000000..5870c469035
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-comments-video.md
@@ -0,0 +1,37 @@
+---
+id: 71ac60e6488b40e997219f15
+title: Comments
+challengeType: 11
+videoId: CY-CMJIt1z8
+dashedName: comments-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to write comments in Python to document your code and make it more readable.
+
+# --questions--
+
+## --text--
+
+Which of the following is a single line comment in Python?
+
+## --answers--
+
+`# This program is cool`
+
+---
+
+`> This program is cool`
+
+---
+
+`''' This program is cool`
+
+---
+
+`// This program is cool`
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-modules-pip-video.md b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-modules-pip-video.md
new file mode 100644
index 00000000000..37a0b424419
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-modules-pip-video.md
@@ -0,0 +1,37 @@
+---
+id: 2ccc34bd3f7bb4ae97a67ea3
+title: Modules and pip
+challengeType: 11
+videoId: HJ-dHUXmpcg
+dashedName: modules-and-pip-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to use modules and pip to extend Python's functionality with external packages.
+
+# --questions--
+
+## --text--
+
+What is pip used for?
+
+## --answers--
+
+It is used to sort python modules.
+
+---
+
+It is used to explain python modules.
+
+---
+
+It is used to install python modules.
+
+---
+
+It is used to lint Python programs.
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-reading-files-video.md b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-reading-files-video.md
new file mode 100644
index 00000000000..bf3f975c78e
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-reading-files-video.md
@@ -0,0 +1,37 @@
+---
+id: 04e25c4fdc9ee0e71a844fd6
+title: Reading Files
+challengeType: 11
+videoId: enOW7u6LWyg
+dashedName: reading-files-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to read files in Python and process their contents.
+
+# --questions--
+
+## --text--
+
+What is the role of the `"r"` in the `open()` function?
+
+## --answers--
+
+It specifies the range mode.
+
+---
+
+It specifies the rename mode.
+
+---
+
+It specifies the random access mode.
+
+---
+
+It specifies the read mode.
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-try-except-video.md b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-try-except-video.md
new file mode 100644
index 00000000000..3d4a8fba423
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-try-except-video.md
@@ -0,0 +1,45 @@
+---
+id: 2a486e3e521b79b874fb5e9a
+title: Try/Except
+challengeType: 11
+videoId: 1tkhMom_SZw
+dashedName: try-except-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to handle exceptions using try/except blocks to make your programs more robust.
+
+# --questions--
+
+## --text--
+
+What will be the result for the following code if the user provides the string `"random"`?
+
+```python
+try:
+ number = int(input("Enter a number: "))
+ print(number)
+except:
+ print("Invalid Input")
+```
+
+## --answers--
+
+Nothing will be output to the console.
+
+---
+
+The string `"random"` will be output to the console.
+
+---
+
+The string `"Invalid Input"` will be output to the console.
+
+---
+
+The program will crash.
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-writing-files-video.md b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-writing-files-video.md
new file mode 100644
index 00000000000..df16829392e
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-practical-errors-files/learn-python-writing-files-video.md
@@ -0,0 +1,37 @@
+---
+id: bfab38e6a6c1165f7774514d
+title: Writing to Files
+challengeType: 11
+videoId: QR95sRxsehY
+dashedName: writing-to-files-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to write data to files in Python.
+
+# --questions--
+
+## --text--
+
+What is the role of the `"a"` in the `open()` function?
+
+## --answers--
+
+It specifies the append mode.
+
+---
+
+It specifies the alternate mode.
+
+---
+
+It specifies the access mode.
+
+---
+
+It specifies the apply mode.
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-2d-lists-video.md b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-2d-lists-video.md
new file mode 100644
index 00000000000..d28c58b017b
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-2d-lists-video.md
@@ -0,0 +1,47 @@
+---
+id: 28119f9dc5f93e3ac5d7c58a
+title: 2D Lists and Nested Loops
+challengeType: 11
+videoId: 2lKgjX3gzmM
+dashedName: 2d-lists-and-nested-loops-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to create 2D lists and use nested loops to work with multi-dimensional data structures.
+
+# --questions--
+
+## --text--
+
+What will be the output for the following code?
+
+```python
+number_grid = [
+ [1, 2, 3],
+ [4, 5, 6],
+ [7, 8, 9]
+]
+
+print(number_grid[2][1])
+```
+
+## --answers--
+
+8
+
+---
+
+7
+
+---
+
+9
+
+---
+
+1
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-dictionaries-video.md b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-dictionaries-video.md
new file mode 100644
index 00000000000..03f4a783d10
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-dictionaries-video.md
@@ -0,0 +1,105 @@
+---
+id: 3625fbc38b9428ae98d98f23
+title: Dictionaries
+challengeType: 11
+videoId: FBfYADu3CIo
+dashedName: dictionaries-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to work with dictionaries in Python to store key-value pairs.
+
+# --questions--
+
+## --text--
+
+Which of the following will correctly output the string `"March"` to the console?
+
+## --answers--
+
+```python
+month_conversions = {
+ "Jan": "January",
+ "Feb": "February",
+ "Mar": "March",
+ "Apr": "April",
+ "May": "May",
+ "Jun": "June",
+ "Jul": "July",
+ "Aug": "August",
+ "Sep": "September",
+ "Oct": "October",
+ "Nov": "November",
+ "Dec": "December"
+}
+
+print(month_conversions<"Mar">)
+```
+
+---
+
+```python
+month_conversions = {
+ "Jan": "January",
+ "Feb": "February",
+ "Mar": "March",
+ "Apr": "April",
+ "May": "May",
+ "Jun": "June",
+ "Jul": "July",
+ "Aug": "August",
+ "Sep": "September",
+ "Oct": "October",
+ "Nov": "November",
+ "Dec": "December"
+}
+
+print(month_conversions("Mar"))
+```
+
+---
+
+```python
+month_conversions = {
+ "Jan": "January",
+ "Feb": "February",
+ "Mar": "March",
+ "Apr": "April",
+ "May": "May",
+ "Jun": "June",
+ "Jul": "July",
+ "Aug": "August",
+ "Sep": "September",
+ "Oct": "October",
+ "Nov": "November",
+ "Dec": "December"
+}
+
+print(month_conversions["March"])
+```
+
+---
+
+```python
+month_conversions = {
+ "Jan": "January",
+ "Feb": "February",
+ "Mar": "March",
+ "Apr": "April",
+ "May": "May",
+ "Jun": "June",
+ "Jul": "July",
+ "Aug": "August",
+ "Sep": "September",
+ "Oct": "October",
+ "Nov": "November",
+ "Dec": "December"
+}
+
+print(month_conversions["Mar"])
+```
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-exponent-functions-video.md b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-exponent-functions-video.md
new file mode 100644
index 00000000000..66b05d51f70
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-exponent-functions-video.md
@@ -0,0 +1,37 @@
+---
+id: a4cfb218d22efcfa7cc49d80
+title: Exponent Functions
+challengeType: 11
+videoId: KLDvy0wFFX4
+dashedName: exponent-functions-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to write a function that calculates exponents and powers in Python.
+
+# --questions--
+
+## --text--
+
+What does the `range()` function in Python do?
+
+## --answers--
+
+It returns a number from a list.
+
+---
+
+It creates a list of random numbers.
+
+---
+
+It generates a sequence of integers between a starting and stopping point.
+
+---
+
+It generates a sequence of floats between a starting and stopping point.
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-for-loops-video.md b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-for-loops-video.md
new file mode 100644
index 00000000000..dabbc03c283
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-for-loops-video.md
@@ -0,0 +1,49 @@
+---
+id: 030401977064585ddd4c7746
+title: For Loops
+challengeType: 11
+videoId: x13V1UMMQeI
+dashedName: for-loops-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to use for loops to iterate over sequences like lists and ranges.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to iterate over each letter in the string `"Giraffe Academy"`?
+
+## --answers--
+
+```python
+for (letter) in "Giraffe Academy":
+ print(letter)
+```
+
+---
+
+```python
+for key, letter in "Giraffe Academy":
+ print(letter)
+```
+
+---
+
+```python
+for letter in "Giraffe Academy":
+ print(letter)
+```
+
+---
+
+```python
+for letter, value in "Giraffe Academy":
+ print(letter)
+```
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-guessing-game-video.md b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-guessing-game-video.md
new file mode 100644
index 00000000000..492943844fc
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-guessing-game-video.md
@@ -0,0 +1,45 @@
+---
+id: d4876f74547b26d5c330423e
+title: Building a Guessing Game
+challengeType: 11
+videoId: sHyQCBFRoug
+dashedName: building-a-guessing-game-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will build a guessing game that uses loops and conditionals.
+
+# --questions--
+
+## --text--
+
+What does the condition `guess != secret_word` mean in this code?
+
+```python
+secret_word = "giraffe"
+guess = ""
+
+while guess != secret_word:
+ guess = input("Enter guess: ")
+```
+
+## --answers--
+
+If `guess` is not equal to `secret_word`.
+
+---
+
+If `guess` is equal to `secret_word`.
+
+---
+
+If `guess` is greater than `secret_word`.
+
+---
+
+If `guess` is less than `secret_word`.
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-translator-video.md b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-translator-video.md
new file mode 100644
index 00000000000..a12c2e4e2f2
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-translator-video.md
@@ -0,0 +1,37 @@
+---
+id: 703bcd12c0edae7773eeec64
+title: Building a Translator
+challengeType: 11
+videoId: 3Sa5rwlKdGQ
+dashedName: building-a-translator-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will build a simple translator program using dictionaries and user input.
+
+# --questions--
+
+## --text--
+
+Which of the following methods is used to check if all characters in a string are uppercase?
+
+## --answers--
+
+`upper()`
+
+---
+
+`isupper()`
+
+---
+
+`toupper()`
+
+---
+
+`hasupper()`
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-while-loop-video.md b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-while-loop-video.md
new file mode 100644
index 00000000000..741ebdaf9e1
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-projects-loops/learn-python-while-loop-video.md
@@ -0,0 +1,83 @@
+---
+id: 474c23ec0df6e7af920e0526
+title: While Loop
+challengeType: 11
+videoId: s6yz4Ew8dwQ
+dashedName: while-loop-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to work with while loops to repeat code blocks as long as a condition is `True`.
+
+# --questions--
+
+## --text--
+
+What will be the output for the following code?
+
+```python
+i = 1
+
+while i <= 10:
+ print(i)
+ i += 1
+print("Done with loop")
+```
+
+## --answers--
+
+```md
+1
+3
+5
+7
+9
+Done with loop
+```
+
+---
+
+```md
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+Done with loop
+```
+
+---
+
+```md
+2
+4
+6
+8
+10
+Done with loop
+```
+
+---
+
+```md
+1
+2
+3
+4
+5
+6
+7
+8
+9
+Done with loop
+```
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-hello-world-video.md b/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-hello-world-video.md
new file mode 100644
index 00000000000..4fe69046597
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-hello-world-video.md
@@ -0,0 +1,37 @@
+---
+id: 8ca3a380a75d00443d9e09bd
+title: Hello World Program
+challengeType: 11
+videoId: H2WnzGCeydQ
+dashedName: hello-world-program-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to write your first program in Python.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to print `"Hello World"` to the console?
+
+## --answers--
+
+`print("Hello World")`
+
+---
+
+`printf("Hello World")`
+
+---
+
+`prints("Hello World")`
+
+---
+
+`printing("Hello World")`
+
+## --video-solution--
+
+1
diff --git a/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-install-video.md b/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-install-video.md
new file mode 100644
index 00000000000..e2994f44085
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-install-video.md
@@ -0,0 +1,37 @@
+---
+id: edeae16d4bf9505165740c75
+title: Installing Python and PyCharm
+challengeType: 11
+videoId: RgGQJDOms1M
+dashedName: installing-python-and-pycharm-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will learn how to install Python and PyCharm onto your computer.
+
+# --questions--
+
+## --text--
+
+What is PyCharm used for?
+
+## --answers--
+
+It is a programming language similar to Python used for developing mobile apps.
+
+---
+
+It is a Python library used for data analysis.
+
+---
+
+It is an IDE used to run Python programs.
+
+---
+
+It is an operating system designed for developers.
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-intro-video.md b/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-intro-video.md
new file mode 100644
index 00000000000..02d840742e7
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-setup-first-steps/learn-python-intro-video.md
@@ -0,0 +1,37 @@
+---
+id: 05b8c9b04c6df84636956fab
+title: Introduction
+challengeType: 11
+videoId: EgQZWE8in68
+dashedName: introduction-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, instructor Mike Dane explains why you should learn Python.
+
+# --questions--
+
+## --text--
+
+What is one reason to learn Python?
+
+## --answers--
+
+It is required to be learned before any other programming language.
+
+---
+
+It is one of the most popular programming languages used in the industry.
+
+---
+
+It is the fastest programming language for all types of applications.
+
+---
+
+It is only useful for complex gaming applications.
+
+## --video-solution--
+
+2
diff --git a/curriculum/challenges/english/blocks/learn-python-small-projects-basics/learn-python-basic-calculator-video.md b/curriculum/challenges/english/blocks/learn-python-small-projects-basics/learn-python-basic-calculator-video.md
new file mode 100644
index 00000000000..cd7fa9c87ab
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-small-projects-basics/learn-python-basic-calculator-video.md
@@ -0,0 +1,37 @@
+---
+id: 6ec8578710ffa3471b74888e
+title: Building a Basic Calculator
+challengeType: 11
+videoId: vA10XU1O3QQ
+dashedName: building-a-basic-calculator-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will build a basic calculator program that can perform addition, subtraction, multiplication, and division operations.
+
+# --questions--
+
+## --text--
+
+Which function is used to convert a string to an integer?
+
+## --answers--
+
+`convert()`
+
+---
+
+`str()`
+
+---
+
+`integer()`
+
+---
+
+`int()`
+
+## --video-solution--
+
+4
diff --git a/curriculum/challenges/english/blocks/learn-python-small-projects-basics/learn-python-mad-libs-video.md b/curriculum/challenges/english/blocks/learn-python-small-projects-basics/learn-python-mad-libs-video.md
new file mode 100644
index 00000000000..46908197309
--- /dev/null
+++ b/curriculum/challenges/english/blocks/learn-python-small-projects-basics/learn-python-mad-libs-video.md
@@ -0,0 +1,49 @@
+---
+id: 024ffa91a50a44335be33ee7
+title: Mad Libs Game
+challengeType: 11
+videoId: XRmMTKa-xlc
+dashedName: mad-libs-game-learn-python-full-course-for-beginners
+---
+
+# --description--
+
+In this video, you will create a Mad Libs game that takes user input and creates funny stories.
+
+# --questions--
+
+## --text--
+
+Which of the following is the correct way to get input from a user and print the result to the console?
+
+## --answers--
+
+```python
+color = input("Enter a color: ")
+print(Roses are + color)
+```
+
+---
+
+```python
+color = input("Enter a color: ")
+print("Roses are " + "color")
+```
+
+---
+
+```python
+color = input("Enter a color: ")
+print("Roses are " + color)
+```
+
+---
+
+```python
+color = prompt("Enter a color: ")
+print("Roses are " + color)
+```
+
+## --video-solution--
+
+3
diff --git a/curriculum/challenges/english/blocks/recipe-page/668f08ea07b99b1f4a91acab.md b/curriculum/challenges/english/blocks/recipe-page/668f08ea07b99b1f4a91acab.md
deleted file mode 100644
index a84e101e1a7..00000000000
--- a/curriculum/challenges/english/blocks/recipe-page/668f08ea07b99b1f4a91acab.md
+++ /dev/null
@@ -1,224 +0,0 @@
----
-id: 668f08ea07b99b1f4a91acab
-title: Build a Recipe Page
-challengeType: 25
-dashedName: build-a-recipe-page
-demoType: onClick
----
-
-# --description--
-
-Fulfill the user stories below and get all the tests to pass to complete the lab.
-
-**User Stories:**
-
-1. You should have a `!DOCTYPE html` declaration.
-1. You should have an `html` element with `lang` set to `en`.
-1. You should have a `head` element containing a `title` element with the name of your recipe, and a `meta` element with a `charset` attribute set to `UTF-8`.
-1. You should have a `body` element.
-1. You should have an `h1` element with the name of your recipe.
-1. You should have a `p` element that introduces the recipe below the `h1`.
-1. You should have one `h2` element with the text `Ingredients` for the ingredients section.
-1. You should have an unordered list (`ul` element) with at least four list items (`li` elements) that lists your ingredients below the first `h2` element.
-1. You should have a second `h2` element with the text `Instructions` for the instructions section.
-1. You should have an ordered list (`ol` element) with at least four list items that lists the recipe steps in order, below the second `h2`.
-1. You should have one `img` element with a `src` attribute set to a valid image, you can use `https://cdn.freecodecamp.org/curriculum/labs/recipe.jpg` if you would like, and an `alt` attribute describing the image.
-
-# --hints--
-
-Your recipe page should have a `!DOCTYPE html` declaration.
-
-```js
-assert.match(code, //i);
-```
-
-You should have an `html` element with `lang` set to `en`.
-
-```js
-assert.match(code, /[\s\S]*<\/\s*html\s*>/gi);
-```
-
-You should have a `head` element within the `html` element.
-
-```js
-assert.match(code, /[\s\S]*<\s*head\s*>[\s\S]*<\/\s*head\s*>[\s\S]*<\/\s*html\s*>/i);
-```
-
-You should have `title` element within your `head` element.
-
-```js
-assert.match(code, /<\s*head\s*>[\s\S]*<\s*title\s*>[\s\S]*<\/\s*title\s*>[\s\S]*<\/\s*head\s*>/i);
-```
-
-Your `title` element should have your recipe title.
-
-```js
-assert.isAbove(document.querySelector('title')?.innerText.trim().length, 0);
-```
-
-You should have a `meta` element within your `head` element.
-
-```js
-assert.match(code, /<\s*head\s*>[\s\S]*<\s*meta[\s\S]*>[\s\S]*<\/\s*head\s*>/i);
-```
-
-Your `meta` element should have its `charset` attribute set to `UTF-8`.
-
-```js
-assert.match(code, /<\s*meta[\s\S]+?charset\s*=\s*('|")UTF-8\1/i);
-```
-
-You should have a `body` element within your `html` element.
-
-```js
-assert.match(code, /<\s*html[\s\S]*>[\s\S]*<\s*head\s*>[\s\S]*<\/\s*head\s*>[\s\S]*<\s*body\s*>[\s\S]*<\/\s*body\s*>[\s\S]*<\/\s*html\s*>/i);
-```
-
-You should have an `h1` element with the name of your recipe.
-
-```js
-assert.isAbove(document.querySelector('h1')?.innerText.length, 0);
-```
-
-You should only have one `h1` element.
-
-```js
-assert.lengthOf(document.querySelectorAll('h1'), 1);
-```
-
-You should have a `p` element below your `h1` element.
-
-```js
-assert.strictEqual(document.querySelector('h1')?.nextElementSibling, document.querySelector('p'));
-```
-
-Your first `p` element should describe your recipe.
-
-```js
-assert.isNotEmpty(document.querySelector('p')?.textContent?.trim());
-```
-
-Your first `h2` element should have the text `Ingredients`.
-
-```js
-assert.equal(document.querySelectorAll('h2')[0]?.innerText, 'Ingredients');
-```
-
-You should have an unordered list element below your first `h2` element.
-
-```js
-assert.strictEqual(document.querySelector('ul')?.previousElementSibling.tagName, 'H2');
-```
-
-You should have at least four list item elements in your unordered list with the ingredients.
-
-```js
-const els = document.querySelectorAll('ul > li');
-assert.isAbove(els.length, 3);
-els.forEach(el => assert.isAbove(el.innerText.trim().length, 0))
-```
-
-Your second `h2` element should have the text `Instructions`.
-
-```js
-assert.equal(document.querySelectorAll('h2')[1]?.innerText, 'Instructions');
-```
-
-You should have an ordered list element below your second `h2` element.
-
-```js
-assert.strictEqual(document.querySelectorAll('h2')?.[1]?.nextElementSibling?.tagName, "OL");
-```
-
-You should have at least four list item elements in your ordered list with the instructions.
-
-```js
-const els = document.querySelectorAll('ol > li');
-assert.isAbove(els.length, 3);
-els.forEach(el => assert.isAbove(el.innerText.trim().length, 0))
-```
-
-You should have at least one `img` element.
-
-```js
-assert.exists(document.querySelector('img'));
-```
-
-All your `img` elements should have a valid `src` attribute and value.
-
-```js
-const img = document.querySelector('img');
-const rawSrc = img?.getAttribute('src');
-const resolvedSrc = img?.src;
-const re = new RegExp(window.location.href, "ig");
-
-assert.isAbove(rawSrc?.trim().length, 0, "The 'src' attribute must be explicitly set.");
-assert.notMatch(resolvedSrc, re, "The 'src' should not start with the current page URL");
-
-img.onload = () => {
- console.log('Image loaded successfully.');
-};
-
-img.onerror = (error) => {
- console.error('Image failed to load:', error);
- assert.fail("Your image's URL should be valid."); // Make the test instafail
-};
-
-if (img.complete) {
- img.onload && img.onload();
-};
-```
-
-All your `img` elements should have an `alt` attribute to describe the image.
-
-```js
-assert.isAbove(document.querySelector('img')?.alt.length, 0);
-```
-
-# --seed--
-
-## --seed-contents--
-
-```html
-
-```
-
-# --solutions--
-
-```html
-
-
-
-
-
- Chocolate chip cookies recipe
-
-
-
- Chocolate Chip Cookies
- Welcome to the ultimate guide for making mini chocolate chip cookies! These bite-sized treats are perfect for
- satisfying your sweet tooth without overindulging. Follow this simple recipe to create delicious,
- crispy-on-the-outside, chewy-on-the-inside mini chocolate chip cookies that everyone will love.
-
- Ingredients
-
- - 1 cup all-purpose flour
- - 1/2 teaspoon baking soda
- - 1/4 cup unsalted butter, softened
- - 1/4 cup granulated sugar
- - 1/2 teaspoon vanilla extract
- - 1/2 cup mini chocolate chips
-
- Instructions
-
- - Preheat your oven to 350°F (175°C) and line a baking sheet with parchment paper.
- - In a bowl, whisk together the flour and baking soda.
- - In another bowl, beat the butter, sugar, and vanilla extract until creamy.
- - Gradually add the dry ingredients to the wet mixture, then fold in the mini chocolate chips.
- - Drop small spoonfuls of dough onto the baking sheet.
- - Bake for 8-10 minutes, then let cool before enjoying!
-
-
-
-
-```
diff --git a/curriculum/schema/challenge-schema.js b/curriculum/schema/challenge-schema.js
index 8c0f1f3178e..df08bbb9187 100644
--- a/curriculum/schema/challenge-schema.js
+++ b/curriculum/schema/challenge-schema.js
@@ -6,7 +6,6 @@ const {
} = require('@freecodecamp/shared/config/challenge-types');
const {
chapterBasedSuperBlocks,
- catalogSuperBlocks,
languageSuperBlocks,
SuperBlocks
} = require('@freecodecamp/shared/config/curriculum');
@@ -135,7 +134,7 @@ const schema = Joi.object().keys({
block: Joi.string().regex(slugRE).required(),
blockId: Joi.objectId(),
blockLabel: Joi.when('superBlock', {
- is: [...chapterBasedSuperBlocks, ...catalogSuperBlocks],
+ is: [...chapterBasedSuperBlocks],
then: Joi.valid(
'workshop',
'lab',
diff --git a/curriculum/schema/curriculum-schema.js b/curriculum/schema/curriculum-schema.js
index 6ae0993fd14..f102f106192 100644
--- a/curriculum/schema/curriculum-schema.js
+++ b/curriculum/schema/curriculum-schema.js
@@ -33,7 +33,30 @@ const superblocks = [
'college-algebra-with-python',
'project-euler',
'2022/responsive-web-design',
- 'the-odin-project'
+ 'the-odin-project',
+ 'lab-survey-form',
+ 'html-and-accessibility',
+ 'computer-basics',
+ 'basic-css',
+ 'design-for-developers',
+ 'absolute-and-relative-units',
+ 'pseudo-classes-and-elements',
+ 'css-colors',
+ 'styling-forms',
+ 'css-box-model',
+ 'css-flexbox',
+ 'lab-page-of-playing-cards',
+ 'css-typography',
+ 'css-and-accessibility',
+ 'css-positioning',
+ 'attribute-selectors',
+ 'lab-book-inventory-app',
+ 'responsive-design',
+ 'lab-technical-documentation-page',
+ 'css-variables',
+ 'css-grid',
+ 'lab-product-landing-page',
+ 'css-animations'
];
const schema = Joi.object().keys(
diff --git a/curriculum/src/build-curriculum.ts b/curriculum/src/build-curriculum.ts
index 8deaa6631e2..38d178f356f 100644
--- a/curriculum/src/build-curriculum.ts
+++ b/curriculum/src/build-curriculum.ts
@@ -202,7 +202,32 @@ export const superBlockNames = {
'python-v9': SuperBlocks.PythonV9,
'relational-databases-v9': SuperBlocks.RelationalDbV9,
'back-end-development-and-apis-v9': SuperBlocks.BackEndDevApisV9,
- 'full-stack-developer-v9': SuperBlocks.FullStackDeveloperV9
+ 'full-stack-developer-v9': SuperBlocks.FullStackDeveloperV9,
+ 'html-forms-and-tables': SuperBlocks.HtmlFormsAndTables,
+ 'learn-python-for-beginners': SuperBlocks.LearnPythonForBeginners,
+ 'lab-survey-form': SuperBlocks.LabSurveyForm,
+ 'html-and-accessibility': SuperBlocks.HtmlAndAccessibility,
+ 'computer-basics': SuperBlocks.ComputerBasics,
+ 'basic-css': SuperBlocks.BasicCss,
+ 'design-for-developers': SuperBlocks.DesignForDevelopers,
+ 'absolute-and-relative-units': SuperBlocks.AbsoluteAndRelativeUnits,
+ 'pseudo-classes-and-elements': SuperBlocks.PseudoClassesAndElements,
+ 'css-colors': SuperBlocks.CssColors,
+ 'styling-forms': SuperBlocks.StylingForms,
+ 'css-box-model': SuperBlocks.CssBoxModel,
+ 'css-flexbox': SuperBlocks.CssFlexbox,
+ 'lab-page-of-playing-cards': SuperBlocks.LabPageOfPlayingCards,
+ 'css-typography': SuperBlocks.CssTypography,
+ 'css-and-accessibility': SuperBlocks.CssAndAccessibility,
+ 'css-positioning': SuperBlocks.CssPositioning,
+ 'attribute-selectors': SuperBlocks.AttributeSelectors,
+ 'lab-book-inventory-app': SuperBlocks.LabBookInventoryApp,
+ 'responsive-design': SuperBlocks.ResponsiveDesign,
+ 'lab-technical-documentation-page': SuperBlocks.LabTechnicalDocumentationPage,
+ 'css-variables': SuperBlocks.CssVariables,
+ 'css-grid': SuperBlocks.CssGrid,
+ 'lab-product-landing-page': SuperBlocks.LabProductLandingPage,
+ 'css-animations': SuperBlocks.CssAnimations
};
export const superBlockToFilename = Object.entries(superBlockNames).reduce(
diff --git a/curriculum/structure/blocks/cat-blog-page.json b/curriculum/structure/blocks/cat-blog-page.json
deleted file mode 100644
index afb71c1be8a..00000000000
--- a/curriculum/structure/blocks/cat-blog-page.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "Build a Cat Blog Page",
- "blockLabel": "workshop",
- "blockLayout": "challenge-grid",
- "isUpcomingChange": true,
- "usesMultifileEditor": true,
- "hasEditableBoundaries": true,
- "dashedName": "cat-blog-page",
- "challengeOrder": [
- {
- "id": "669aff9f5488f1bea056416d",
- "title": "Step 1"
- },
- {
- "id": "669fc7e141e4703748c558bf",
- "title": "Step 2"
- },
- {
- "id": "669fc938d38e6e38ace9251e",
- "title": "Step 3"
- },
- {
- "id": "669fcb06c3034a39f5431a38",
- "title": "Step 4"
- }
- ],
- "helpCategory": "HTML-CSS"
-}
diff --git a/curriculum/structure/blocks/cat-photo-app.json b/curriculum/structure/blocks/cat-photo-app.json
deleted file mode 100644
index 795c898f6e6..00000000000
--- a/curriculum/structure/blocks/cat-photo-app.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "Build a Cat Photo App",
- "blockLabel": "workshop",
- "blockLayout": "challenge-grid",
- "isUpcomingChange": true,
- "usesMultifileEditor": true,
- "hasEditableBoundaries": true,
- "dashedName": "cat-photo-app",
- "challengeOrder": [
- {
- "id": "5dc174fcf86c76b9248c6eb2",
- "title": "Step 1"
- },
- {
- "id": "5dc1798ff86c76b9248c6eb3",
- "title": "Step 2"
- },
- {
- "id": "5dc17d3bf86c76b9248c6eb4",
- "title": "Step 3"
- },
- {
- "id": "5dc17dc8f86c76b9248c6eb5",
- "title": "Step 4"
- }
- ],
- "helpCategory": "HTML-CSS"
-}
diff --git a/curriculum/structure/blocks/event-hub.json b/curriculum/structure/blocks/event-hub.json
deleted file mode 100644
index a6e71ee340f..00000000000
--- a/curriculum/structure/blocks/event-hub.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "name": "Build an Event Hub",
- "blockLabel": "lab",
- "blockLayout": "link",
- "isUpcomingChange": true,
- "usesMultifileEditor": true,
- "dashedName": "event-hub",
- "challengeOrder": [
- { "id": "66ebd4ae2812430bb883c787", "title": "Build an Event Hub" }
- ],
- "helpCategory": "HTML-CSS"
-}
diff --git a/curriculum/structure/blocks/learn-python-control-flow-functions.json b/curriculum/structure/blocks/learn-python-control-flow-functions.json
new file mode 100644
index 00000000000..a490663e698
--- /dev/null
+++ b/curriculum/structure/blocks/learn-python-control-flow-functions.json
@@ -0,0 +1,30 @@
+{
+ "name": "Control Flow and Functions",
+ "blockLabel": "lecture",
+ "blockLayout": "challenge-list",
+ "isUpcomingChange": false,
+ "dashedName": "learn-python-control-flow-functions",
+ "helpCategory": "Python",
+ "challengeOrder": [
+ {
+ "id": "58d5d031e969765037c1bebb",
+ "title": "Functions"
+ },
+ {
+ "id": "c6c9dae4017830e187eeaf42",
+ "title": "Return Statement"
+ },
+ {
+ "id": "08854a2c6f052efa1e5270d2",
+ "title": "If Statements"
+ },
+ {
+ "id": "8314d0bbddb0aa027a144705",
+ "title": "If Statements and Comparisons"
+ },
+ {
+ "id": "a9f9c5bf295034800d6c77ad",
+ "title": "Building a Better Calculator"
+ }
+ ]
+}
diff --git a/curriculum/structure/blocks/learn-python-core-primitives.json b/curriculum/structure/blocks/learn-python-core-primitives.json
new file mode 100644
index 00000000000..cfded85ae6d
--- /dev/null
+++ b/curriculum/structure/blocks/learn-python-core-primitives.json
@@ -0,0 +1,30 @@
+{
+ "name": "Core Primitives: Variables, Types, Basic I/O",
+ "blockLabel": "lecture",
+ "blockLayout": "challenge-list",
+ "isUpcomingChange": false,
+ "dashedName": "learn-python-core-primitives",
+ "helpCategory": "Python",
+ "challengeOrder": [
+ {
+ "id": "62baa9d28e8723f635a0093e",
+ "title": "Drawing a Shape"
+ },
+ {
+ "id": "315017f4457c19d45c2be034",
+ "title": "Variables and Data Types"
+ },
+ {
+ "id": "0e2f4bd857b1edc70bfcd1f9",
+ "title": "Working with Strings"
+ },
+ {
+ "id": "8ad37ddb7a23050f71cc9cc9",
+ "title": "Working with Numbers"
+ },
+ {
+ "id": "155ca30775751b78a860a79b",
+ "title": "Getting Input from Users"
+ }
+ ]
+}
diff --git a/curriculum/structure/blocks/learn-python-data-structures.json b/curriculum/structure/blocks/learn-python-data-structures.json
new file mode 100644
index 00000000000..1b103c351c9
--- /dev/null
+++ b/curriculum/structure/blocks/learn-python-data-structures.json
@@ -0,0 +1,22 @@
+{
+ "name": "Data Structures: Lists and Tuples",
+ "blockLabel": "lecture",
+ "blockLayout": "challenge-list",
+ "isUpcomingChange": false,
+ "dashedName": "learn-python-data-structures",
+ "helpCategory": "Python",
+ "challengeOrder": [
+ {
+ "id": "39a400e9163c5a0b33587e18",
+ "title": "Lists"
+ },
+ {
+ "id": "24a45b3960b3aa68dff2cd9e",
+ "title": "List Functions"
+ },
+ {
+ "id": "5ed596ba3306cf2c1a94bb92",
+ "title": "Tuples"
+ }
+ ]
+}
diff --git a/curriculum/structure/blocks/learn-python-oop.json b/curriculum/structure/blocks/learn-python-oop.json
new file mode 100644
index 00000000000..1b2b15f9646
--- /dev/null
+++ b/curriculum/structure/blocks/learn-python-oop.json
@@ -0,0 +1,30 @@
+{
+ "name": "Object Oriented Programming",
+ "blockLabel": "lecture",
+ "blockLayout": "challenge-list",
+ "isUpcomingChange": false,
+ "dashedName": "learn-python-oop",
+ "helpCategory": "Python",
+ "challengeOrder": [
+ {
+ "id": "a0339c4075344cbfc2cd939c",
+ "title": "Classes and Objects"
+ },
+ {
+ "id": "9afe5e8141b13e9f1d59d46e",
+ "title": "Building a Multiple Choice Quiz"
+ },
+ {
+ "id": "697fe3cb32baa3841ab62a63",
+ "title": "Object Functions"
+ },
+ {
+ "id": "697fe5c032baa3841ab62a64",
+ "title": "Inheritance"
+ },
+ {
+ "id": "697fe6c932baa3841ab62a65",
+ "title": "Python Interpreter"
+ }
+ ]
+}
diff --git a/curriculum/structure/blocks/learn-python-practical-errors-files.json b/curriculum/structure/blocks/learn-python-practical-errors-files.json
new file mode 100644
index 00000000000..47a966d696a
--- /dev/null
+++ b/curriculum/structure/blocks/learn-python-practical-errors-files.json
@@ -0,0 +1,30 @@
+{
+ "name": "Practical Python: Errors, Files and Modules",
+ "blockLabel": "lecture",
+ "blockLayout": "challenge-list",
+ "isUpcomingChange": false,
+ "dashedName": "learn-python-practical-errors-files",
+ "helpCategory": "Python",
+ "challengeOrder": [
+ {
+ "id": "71ac60e6488b40e997219f15",
+ "title": "Comments"
+ },
+ {
+ "id": "2a486e3e521b79b874fb5e9a",
+ "title": "Try/Except"
+ },
+ {
+ "id": "04e25c4fdc9ee0e71a844fd6",
+ "title": "Reading Files"
+ },
+ {
+ "id": "bfab38e6a6c1165f7774514d",
+ "title": "Writing to Files"
+ },
+ {
+ "id": "2ccc34bd3f7bb4ae97a67ea3",
+ "title": "Modules and pip"
+ }
+ ]
+}
diff --git a/curriculum/structure/blocks/learn-python-projects-loops.json b/curriculum/structure/blocks/learn-python-projects-loops.json
new file mode 100644
index 00000000000..05b8c406acc
--- /dev/null
+++ b/curriculum/structure/blocks/learn-python-projects-loops.json
@@ -0,0 +1,38 @@
+{
+ "name": "Dictionaries and Loops",
+ "blockLabel": "lecture",
+ "blockLayout": "challenge-list",
+ "isUpcomingChange": false,
+ "dashedName": "learn-python-projects-loops",
+ "helpCategory": "Python",
+ "challengeOrder": [
+ {
+ "id": "3625fbc38b9428ae98d98f23",
+ "title": "Dictionaries"
+ },
+ {
+ "id": "474c23ec0df6e7af920e0526",
+ "title": "While Loop"
+ },
+ {
+ "id": "d4876f74547b26d5c330423e",
+ "title": "Building a Guessing Game"
+ },
+ {
+ "id": "030401977064585ddd4c7746",
+ "title": "For Loops"
+ },
+ {
+ "id": "a4cfb218d22efcfa7cc49d80",
+ "title": "Exponent Functions"
+ },
+ {
+ "id": "28119f9dc5f93e3ac5d7c58a",
+ "title": "2D Lists and Nested Loops"
+ },
+ {
+ "id": "703bcd12c0edae7773eeec64",
+ "title": "Building a Translator"
+ }
+ ]
+}
diff --git a/curriculum/structure/blocks/learn-python-setup-first-steps.json b/curriculum/structure/blocks/learn-python-setup-first-steps.json
new file mode 100644
index 00000000000..8b5f28662e6
--- /dev/null
+++ b/curriculum/structure/blocks/learn-python-setup-first-steps.json
@@ -0,0 +1,22 @@
+{
+ "name": "Setup & First Steps",
+ "blockLabel": "lecture",
+ "blockLayout": "challenge-list",
+ "isUpcomingChange": false,
+ "dashedName": "learn-python-setup-first-steps",
+ "helpCategory": "Python",
+ "challengeOrder": [
+ {
+ "id": "05b8c9b04c6df84636956fab",
+ "title": "Introduction"
+ },
+ {
+ "id": "edeae16d4bf9505165740c75",
+ "title": "Installing Python and PyCharm"
+ },
+ {
+ "id": "8ca3a380a75d00443d9e09bd",
+ "title": "Hello World Program"
+ }
+ ]
+}
diff --git a/curriculum/structure/blocks/learn-python-small-projects-basics.json b/curriculum/structure/blocks/learn-python-small-projects-basics.json
new file mode 100644
index 00000000000..b2d5dd265ee
--- /dev/null
+++ b/curriculum/structure/blocks/learn-python-small-projects-basics.json
@@ -0,0 +1,18 @@
+{
+ "name": "Small Projects: Using Basics",
+ "blockLabel": "lecture",
+ "blockLayout": "challenge-list",
+ "isUpcomingChange": false,
+ "dashedName": "learn-python-small-projects-basics",
+ "helpCategory": "Python",
+ "challengeOrder": [
+ {
+ "id": "6ec8578710ffa3471b74888e",
+ "title": "Building a Basic Calculator"
+ },
+ {
+ "id": "024ffa91a50a44335be33ee7",
+ "title": "Mad Libs Game"
+ }
+ ]
+}
diff --git a/curriculum/structure/blocks/recipe-page.json b/curriculum/structure/blocks/recipe-page.json
deleted file mode 100644
index e05cb601f7f..00000000000
--- a/curriculum/structure/blocks/recipe-page.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": "Build a Recipe Page",
- "blockLabel": "lab",
- "blockLayout": "link",
- "isUpcomingChange": true,
- "usesMultifileEditor": true,
- "dashedName": "recipe-page",
- "challengeOrder": [
- {
- "id": "668f08ea07b99b1f4a91acab",
- "title": "Build a Recipe Page"
- }
- ],
- "helpCategory": "HTML-CSS"
-}
diff --git a/curriculum/structure/curriculum.json b/curriculum/structure/curriculum.json
index a75435360ee..6bcc4334473 100644
--- a/curriculum/structure/curriculum.json
+++ b/curriculum/structure/curriculum.json
@@ -36,7 +36,32 @@
"python-v9",
"relational-databases-v9",
"back-end-development-and-apis-v9",
- "full-stack-developer-v9"
+ "full-stack-developer-v9",
+ "html-forms-and-tables",
+ "learn-python-for-beginners",
+ "lab-survey-form",
+ "html-and-accessibility",
+ "computer-basics",
+ "basic-css",
+ "design-for-developers",
+ "absolute-and-relative-units",
+ "pseudo-classes-and-elements",
+ "css-colors",
+ "styling-forms",
+ "css-box-model",
+ "css-flexbox",
+ "lab-page-of-playing-cards",
+ "css-typography",
+ "css-and-accessibility",
+ "css-positioning",
+ "attribute-selectors",
+ "lab-book-inventory-app",
+ "responsive-design",
+ "lab-technical-documentation-page",
+ "css-variables",
+ "css-grid",
+ "lab-product-landing-page",
+ "css-animations"
],
"certifications": [
"a2-english-for-developers",
diff --git a/curriculum/structure/superblocks/absolute-and-relative-units.json b/curriculum/structure/superblocks/absolute-and-relative-units.json
new file mode 100644
index 00000000000..a393a2e90bb
--- /dev/null
+++ b/curriculum/structure/superblocks/absolute-and-relative-units.json
@@ -0,0 +1,8 @@
+{
+ "blocks": [
+ "lecture-working-with-relative-and-absolute-units",
+ "lab-event-flyer-page",
+ "review-css-relative-and-absolute-units",
+ "quiz-css-relative-and-absolute-units"
+ ]
+}
diff --git a/curriculum/structure/superblocks/attribute-selectors.json b/curriculum/structure/superblocks/attribute-selectors.json
new file mode 100644
index 00000000000..a06000d5fd3
--- /dev/null
+++ b/curriculum/structure/superblocks/attribute-selectors.json
@@ -0,0 +1,8 @@
+{
+ "blocks": [
+ "lecture-working-with-attribute-selectors",
+ "workshop-balance-sheet",
+ "review-css-attribute-selectors",
+ "quiz-css-attribute-selectors"
+ ]
+}
diff --git a/curriculum/structure/superblocks/basic-css.json b/curriculum/structure/superblocks/basic-css.json
new file mode 100644
index 00000000000..de5bd8f6aab
--- /dev/null
+++ b/curriculum/structure/superblocks/basic-css.json
@@ -0,0 +1,16 @@
+{
+ "blocks": [
+ "lecture-what-is-css",
+ "workshop-cafe-menu",
+ "lab-business-card",
+ "lecture-css-specificity-the-cascade-algorithm-and-inheritance",
+ "review-basic-css",
+ "quiz-basic-css",
+ "lecture-styling-lists-and-links",
+ "lab-stylized-to-do-list",
+ "lecture-working-with-backgrounds-and-borders",
+ "lab-blog-post-card",
+ "review-css-backgrounds-and-borders",
+ "quiz-css-backgrounds-and-borders"
+ ]
+}
diff --git a/curriculum/structure/superblocks/basic-html.json b/curriculum/structure/superblocks/basic-html.json
index a9fba358bdf..97b925d204f 100644
--- a/curriculum/structure/superblocks/basic-html.json
+++ b/curriculum/structure/superblocks/basic-html.json
@@ -1,3 +1,26 @@
{
- "blocks": ["cat-photo-app", "recipe-page"]
+ "blocks": [
+ "workshop-curriculum-outline",
+ "lab-debug-camperbots-profile-page",
+ "lecture-understanding-html-attributes",
+ "lab-debug-pet-adoption-page",
+ "lecture-understanding-the-html-boilerplate",
+ "workshop-cat-photo-app",
+ "lab-recipe-page",
+ "lecture-html-fundamentals",
+ "workshop-bookstore-page",
+ "lecture-understanding-how-html-affects-seo",
+ "lab-travel-agency-page",
+ "lecture-working-with-audio-and-video-elements",
+ "workshop-html-video-player",
+ "lab-html-audio-and-video-player",
+ "lecture-working-with-images-and-svgs",
+ "workshop-build-a-heart-icon",
+ "lecture-working-with-media",
+ "workshop-build-a-video-display-using-iframe",
+ "lab-video-compilation-page",
+ "lecture-working-with-links",
+ "review-basic-html",
+ "quiz-basic-html"
+ ]
}
diff --git a/curriculum/structure/superblocks/computer-basics.json b/curriculum/structure/superblocks/computer-basics.json
new file mode 100644
index 00000000000..a7bab0cb767
--- /dev/null
+++ b/curriculum/structure/superblocks/computer-basics.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-understanding-computer-internet-and-tooling-basics",
+ "lecture-working-with-file-systems",
+ "lecture-browsing-the-web-effectively",
+ "review-computer-basics",
+ "quiz-computer-basics"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-and-accessibility.json b/curriculum/structure/superblocks/css-and-accessibility.json
new file mode 100644
index 00000000000..b353d45e7cd
--- /dev/null
+++ b/curriculum/structure/superblocks/css-and-accessibility.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-best-practices-for-accessibility-and-css",
+ "workshop-accessibility-quiz",
+ "lab-tribute-page",
+ "review-css-accessibility",
+ "quiz-css-accessibility"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-animations.json b/curriculum/structure/superblocks/css-animations.json
new file mode 100644
index 00000000000..5b8b2bcea75
--- /dev/null
+++ b/curriculum/structure/superblocks/css-animations.json
@@ -0,0 +1,11 @@
+{
+ "blocks": [
+ "lecture-animations-and-accessibility",
+ "workshop-ferris-wheel",
+ "lab-moon-orbit",
+ "workshop-flappy-penguin",
+ "lab-personal-portfolio",
+ "review-css-animations",
+ "quiz-css-animations"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-box-model.json b/curriculum/structure/superblocks/css-box-model.json
new file mode 100644
index 00000000000..003a03f3605
--- /dev/null
+++ b/curriculum/structure/superblocks/css-box-model.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-working-with-css-transforms-overflow-and-filters",
+ "workshop-rothko-painting",
+ "lab-confidential-email-page",
+ "review-css-layout-and-effects",
+ "quiz-css-layout-and-effects"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-colors.json b/curriculum/structure/superblocks/css-colors.json
new file mode 100644
index 00000000000..71dab1e8d27
--- /dev/null
+++ b/curriculum/structure/superblocks/css-colors.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-working-with-colors-in-css",
+ "workshop-colored-markers",
+ "lab-colored-boxes",
+ "review-css-colors",
+ "quiz-css-colors"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-flexbox.json b/curriculum/structure/superblocks/css-flexbox.json
new file mode 100644
index 00000000000..893a37acf43
--- /dev/null
+++ b/curriculum/structure/superblocks/css-flexbox.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-working-with-css-flexbox",
+ "workshop-flexbox-photo-gallery",
+ "lab-pricing-plans-layout",
+ "review-css-flexbox",
+ "quiz-css-flexbox"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-grid.json b/curriculum/structure/superblocks/css-grid.json
new file mode 100644
index 00000000000..c438fee675b
--- /dev/null
+++ b/curriculum/structure/superblocks/css-grid.json
@@ -0,0 +1,10 @@
+{
+ "blocks": [
+ "lecture-working-with-css-grid",
+ "workshop-magazine",
+ "lab-newspaper-layout",
+ "lecture-debugging-css",
+ "review-css-grid",
+ "quiz-css-grid"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-positioning.json b/curriculum/structure/superblocks/css-positioning.json
new file mode 100644
index 00000000000..f58d9c28c89
--- /dev/null
+++ b/curriculum/structure/superblocks/css-positioning.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-understanding-how-to-work-with-floats-and-positioning-in-css",
+ "workshop-cat-painting",
+ "lab-house-painting",
+ "review-css-positioning",
+ "quiz-css-positioning"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-typography.json b/curriculum/structure/superblocks/css-typography.json
new file mode 100644
index 00000000000..9d0553c28e2
--- /dev/null
+++ b/curriculum/structure/superblocks/css-typography.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-working-with-css-fonts",
+ "workshop-nutritional-label",
+ "lab-newspaper-article",
+ "review-css-typography",
+ "quiz-css-typography"
+ ]
+}
diff --git a/curriculum/structure/superblocks/css-variables.json b/curriculum/structure/superblocks/css-variables.json
new file mode 100644
index 00000000000..28b897dfa17
--- /dev/null
+++ b/curriculum/structure/superblocks/css-variables.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-working-with-css-variables",
+ "workshop-city-skyline",
+ "lab-availability-table",
+ "review-css-variables",
+ "quiz-css-variables"
+ ]
+}
diff --git a/curriculum/structure/superblocks/design-for-developers.json b/curriculum/structure/superblocks/design-for-developers.json
new file mode 100644
index 00000000000..9f00d2f0fb4
--- /dev/null
+++ b/curriculum/structure/superblocks/design-for-developers.json
@@ -0,0 +1,9 @@
+{
+ "blocks": [
+ "lecture-user-interface-design-fundamentals",
+ "lecture-user-centered-design",
+ "lecture-common-design-tools",
+ "review-design-fundamentals",
+ "quiz-design-fundamentals"
+ ]
+}
diff --git a/curriculum/structure/superblocks/full-stack-open.json b/curriculum/structure/superblocks/full-stack-open.json
index 145f372985f..a85114629b1 100644
--- a/curriculum/structure/superblocks/full-stack-open.json
+++ b/curriculum/structure/superblocks/full-stack-open.json
@@ -5,7 +5,7 @@
"modules": [
{
"dashedName": "basic-html",
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -14,7 +14,7 @@
"modules": [
{
"dashedName": "basic-html",
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -25,7 +25,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -36,7 +36,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -47,7 +47,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -58,7 +58,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -69,7 +69,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -80,7 +80,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -91,7 +91,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -102,7 +102,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -113,7 +113,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -124,7 +124,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -135,7 +135,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
},
@@ -146,7 +146,7 @@
{
"dashedName": "basic-html",
"comingSoon": true,
- "blocks": ["cat-blog-page"]
+ "blocks": ["workshop-blog-page"]
}
]
}
diff --git a/curriculum/structure/superblocks/html-and-accessibility.json b/curriculum/structure/superblocks/html-and-accessibility.json
new file mode 100644
index 00000000000..011c2eeb280
--- /dev/null
+++ b/curriculum/structure/superblocks/html-and-accessibility.json
@@ -0,0 +1,17 @@
+{
+ "blocks": [
+ "lecture-importance-of-accessibility-and-good-html-structure",
+ "workshop-debug-coding-journey-blog-page",
+ "lecture-accessible-tables-forms",
+ "workshop-tech-conference-schedule",
+ "lab-debug-donation-form",
+ "lecture-introduction-to-aria",
+ "workshop-accessible-audio-controller",
+ "lecture-accessible-media-elements",
+ "lab-checkout-page",
+ "lab-movie-review-page",
+ "lab-multimedia-player",
+ "review-html-accessibility",
+ "quiz-html-accessibility"
+ ]
+}
diff --git a/curriculum/structure/superblocks/html-forms-and-tables.json b/curriculum/structure/superblocks/html-forms-and-tables.json
new file mode 100644
index 00000000000..75eb16dfed7
--- /dev/null
+++ b/curriculum/structure/superblocks/html-forms-and-tables.json
@@ -0,0 +1,12 @@
+{
+ "blocks": [
+ "lecture-working-with-forms",
+ "workshop-hotel-feedback-form",
+ "lecture-working-with-tables",
+ "workshop-final-exams-table",
+ "lab-book-catalog-table",
+ "lecture-working-with-html-tools",
+ "review-html-tables-and-forms",
+ "quiz-html-tables-and-forms"
+ ]
+}
diff --git a/curriculum/structure/superblocks/lab-book-inventory-app.json b/curriculum/structure/superblocks/lab-book-inventory-app.json
new file mode 100644
index 00000000000..3c4f61572c6
--- /dev/null
+++ b/curriculum/structure/superblocks/lab-book-inventory-app.json
@@ -0,0 +1,3 @@
+{
+ "blocks": ["lab-book-inventory-app"]
+}
diff --git a/curriculum/structure/superblocks/lab-page-of-playing-cards.json b/curriculum/structure/superblocks/lab-page-of-playing-cards.json
new file mode 100644
index 00000000000..b1512d8db03
--- /dev/null
+++ b/curriculum/structure/superblocks/lab-page-of-playing-cards.json
@@ -0,0 +1,3 @@
+{
+ "blocks": ["lab-page-of-playing-cards"]
+}
diff --git a/curriculum/structure/superblocks/lab-product-landing-page.json b/curriculum/structure/superblocks/lab-product-landing-page.json
new file mode 100644
index 00000000000..d0059eb7668
--- /dev/null
+++ b/curriculum/structure/superblocks/lab-product-landing-page.json
@@ -0,0 +1,3 @@
+{
+ "blocks": ["lab-product-landing-page"]
+}
diff --git a/curriculum/structure/superblocks/lab-survey-form.json b/curriculum/structure/superblocks/lab-survey-form.json
new file mode 100644
index 00000000000..26dd4a84325
--- /dev/null
+++ b/curriculum/structure/superblocks/lab-survey-form.json
@@ -0,0 +1,3 @@
+{
+ "blocks": ["lab-survey-form"]
+}
diff --git a/curriculum/structure/superblocks/lab-technical-documentation-page.json b/curriculum/structure/superblocks/lab-technical-documentation-page.json
new file mode 100644
index 00000000000..a006015d050
--- /dev/null
+++ b/curriculum/structure/superblocks/lab-technical-documentation-page.json
@@ -0,0 +1,3 @@
+{
+ "blocks": ["lab-technical-documentation-page"]
+}
diff --git a/curriculum/structure/superblocks/learn-python-for-beginners.json b/curriculum/structure/superblocks/learn-python-for-beginners.json
new file mode 100644
index 00000000000..bdb717eae1b
--- /dev/null
+++ b/curriculum/structure/superblocks/learn-python-for-beginners.json
@@ -0,0 +1,12 @@
+{
+ "blocks": [
+ "learn-python-setup-first-steps",
+ "learn-python-core-primitives",
+ "learn-python-small-projects-basics",
+ "learn-python-data-structures",
+ "learn-python-control-flow-functions",
+ "learn-python-projects-loops",
+ "learn-python-practical-errors-files",
+ "learn-python-oop"
+ ]
+}
diff --git a/curriculum/structure/superblocks/pseudo-classes-and-elements.json b/curriculum/structure/superblocks/pseudo-classes-and-elements.json
new file mode 100644
index 00000000000..3d62341b2f4
--- /dev/null
+++ b/curriculum/structure/superblocks/pseudo-classes-and-elements.json
@@ -0,0 +1,10 @@
+{
+ "blocks": [
+ "lecture-working-with-pseudo-classes-and-pseudo-elements-in-css",
+ "workshop-greeting-card",
+ "workshop-parent-teacher-conference-form",
+ "lab-job-application-form",
+ "review-css-pseudo-classes",
+ "quiz-css-pseudo-classes"
+ ]
+}
diff --git a/curriculum/structure/superblocks/responsive-design.json b/curriculum/structure/superblocks/responsive-design.json
new file mode 100644
index 00000000000..bc6457820b1
--- /dev/null
+++ b/curriculum/structure/superblocks/responsive-design.json
@@ -0,0 +1,8 @@
+{
+ "blocks": [
+ "lecture-best-practices-for-responsive-web-design",
+ "workshop-piano",
+ "review-responsive-web-design",
+ "quiz-responsive-web-design"
+ ]
+}
diff --git a/curriculum/structure/superblocks/semantic-html.json b/curriculum/structure/superblocks/semantic-html.json
index cbcffd1f7e2..068340f6689 100644
--- a/curriculum/structure/superblocks/semantic-html.json
+++ b/curriculum/structure/superblocks/semantic-html.json
@@ -1,3 +1,14 @@
{
- "blocks": ["cat-blog-page", "event-hub"]
+ "blocks": [
+ "lecture-importance-of-semantic-html",
+ "lecture-understanding-nuanced-semantic-elements",
+ "workshop-major-browsers-list",
+ "lecture-working-with-text-and-time-semantic-elements",
+ "workshop-quincys-job-tips",
+ "lecture-working-with-specialized-semantic-elements",
+ "workshop-blog-page",
+ "lab-event-hub",
+ "review-semantic-html",
+ "quiz-semantic-html"
+ ]
}
diff --git a/curriculum/structure/superblocks/styling-forms.json b/curriculum/structure/superblocks/styling-forms.json
new file mode 100644
index 00000000000..a2ef0305dc6
--- /dev/null
+++ b/curriculum/structure/superblocks/styling-forms.json
@@ -0,0 +1,11 @@
+{
+ "blocks": [
+ "lecture-best-practices-for-styling-forms",
+ "workshop-registration-form",
+ "lab-contact-form",
+ "workshop-game-settings-panel",
+ "lab-feature-selection",
+ "review-styling-forms",
+ "quiz-styling-forms"
+ ]
+}
diff --git a/packages/shared/src/config/catalog.test.ts b/packages/shared/src/config/catalog.test.ts
index 012e72a93ca..96c210b72f8 100644
--- a/packages/shared/src/config/catalog.test.ts
+++ b/packages/shared/src/config/catalog.test.ts
@@ -1,9 +1,11 @@
import { describe, it, expect } from 'vitest';
-import { catalogSuperBlocks } from './curriculum';
import { catalog } from './catalog';
+import { superBlockStages, SuperBlockStage } from './curriculum';
describe('catalog', () => {
it('should have exactly one entry for each superblock in SuperBlockStage.Catalog', () => {
+ const catalogSuperBlocks = superBlockStages[SuperBlockStage.Catalog];
+
expect(catalog.map(course => course.superBlock.toString()).sort()).toEqual(
catalogSuperBlocks.map(sb => sb.toString()).sort()
);
diff --git a/packages/shared/src/config/catalog.ts b/packages/shared/src/config/catalog.ts
index 0caf294f18c..f9b96be9fca 100644
--- a/packages/shared/src/config/catalog.ts
+++ b/packages/shared/src/config/catalog.ts
@@ -6,21 +6,188 @@ enum Levels {
Advanced = 'advanced'
}
+enum Topic {
+ Html = 'html',
+ CSS = 'css',
+ Js = 'js',
+ React = 'react',
+ Python = 'python',
+ DataAnalysis = 'data-analysis',
+ MachineLearning = 'machine-learning',
+ D3 = 'd3',
+ Api = 'api',
+ InformationSecurity = 'information-security',
+ ComputerFundamentals = 'computer-fundamentals'
+}
+
interface Catalog {
superBlock: SuperBlocks;
level: Levels;
hours: number;
+ topic: Topic;
}
export const catalog: Catalog[] = [
{
- superBlock: SuperBlocks.BasicHtml,
+ superBlock: SuperBlocks.HtmlFormsAndTables,
level: Levels.Beginner,
- hours: 2
+ hours: 2,
+ topic: Topic.Html
},
{
superBlock: SuperBlocks.SemanticHtml,
level: Levels.Beginner,
- hours: 2
+ hours: 2,
+ topic: Topic.Html
+ },
+ {
+ superBlock: SuperBlocks.BasicHtml,
+ level: Levels.Beginner,
+ hours: 3,
+ topic: Topic.Html
+ },
+ {
+ superBlock: SuperBlocks.LearnPythonForBeginners,
+ level: Levels.Beginner,
+ hours: 5,
+ topic: Topic.Python
+ },
+ {
+ superBlock: SuperBlocks.LabSurveyForm,
+ level: Levels.Beginner,
+ hours: 2,
+ topic: Topic.Html
+ },
+ {
+ superBlock: SuperBlocks.HtmlAndAccessibility,
+ level: Levels.Beginner,
+ hours: 2,
+ topic: Topic.Html
+ },
+ {
+ superBlock: SuperBlocks.ComputerBasics,
+ level: Levels.Beginner,
+ hours: 2,
+ topic: Topic.ComputerFundamentals
+ },
+ {
+ superBlock: SuperBlocks.BasicCss,
+ level: Levels.Beginner,
+ hours: 3,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.DesignForDevelopers,
+ level: Levels.Beginner,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.AbsoluteAndRelativeUnits,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.PseudoClassesAndElements,
+ level: Levels.Intermediate,
+ hours: 1,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssColors,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.StylingForms,
+ level: Levels.Intermediate,
+ hours: 1,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssBoxModel,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssFlexbox,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.LabPageOfPlayingCards,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssTypography,
+ level: Levels.Intermediate,
+ hours: 1,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssAndAccessibility,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssPositioning,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.AttributeSelectors,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.LabBookInventoryApp,
+ level: Levels.Beginner,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.ResponsiveDesign,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.LabTechnicalDocumentationPage,
+ level: Levels.Advanced,
+ hours: 1,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssVariables,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssGrid,
+ level: Levels.Intermediate,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.LabProductLandingPage,
+ level: Levels.Beginner,
+ hours: 2,
+ topic: Topic.CSS
+ },
+ {
+ superBlock: SuperBlocks.CssAnimations,
+ level: Levels.Advanced,
+ hours: 2,
+ topic: Topic.CSS
}
];
diff --git a/packages/shared/src/config/certification-settings.ts b/packages/shared/src/config/certification-settings.ts
index a45211d1cb9..ae6bab197a0 100644
--- a/packages/shared/src/config/certification-settings.ts
+++ b/packages/shared/src/config/certification-settings.ts
@@ -341,7 +341,32 @@ export const superBlockToCertMap: {
[SuperBlocks.BasicHtml]: null,
[SuperBlocks.SemanticHtml]: null,
[SuperBlocks.DevPlayground]: null,
- [SuperBlocks.FullStackOpen]: null
+ [SuperBlocks.FullStackOpen]: null,
+ [SuperBlocks.HtmlFormsAndTables]: null,
+ [SuperBlocks.LabSurveyForm]: null,
+ [SuperBlocks.HtmlAndAccessibility]: null,
+ [SuperBlocks.ComputerBasics]: null,
+ [SuperBlocks.BasicCss]: null,
+ [SuperBlocks.DesignForDevelopers]: null,
+ [SuperBlocks.AbsoluteAndRelativeUnits]: null,
+ [SuperBlocks.PseudoClassesAndElements]: null,
+ [SuperBlocks.CssColors]: null,
+ [SuperBlocks.StylingForms]: null,
+ [SuperBlocks.CssBoxModel]: null,
+ [SuperBlocks.CssFlexbox]: null,
+ [SuperBlocks.LabPageOfPlayingCards]: null,
+ [SuperBlocks.CssTypography]: null,
+ [SuperBlocks.CssAndAccessibility]: null,
+ [SuperBlocks.CssPositioning]: null,
+ [SuperBlocks.AttributeSelectors]: null,
+ [SuperBlocks.LabBookInventoryApp]: null,
+ [SuperBlocks.ResponsiveDesign]: null,
+ [SuperBlocks.LabTechnicalDocumentationPage]: null,
+ [SuperBlocks.CssVariables]: null,
+ [SuperBlocks.CssGrid]: null,
+ [SuperBlocks.LabProductLandingPage]: null,
+ [SuperBlocks.CssAnimations]: null,
+ [SuperBlocks.LearnPythonForBeginners]: null
};
export const certificationRequirements: Partial<
diff --git a/packages/shared/src/config/curriculum.ts b/packages/shared/src/config/curriculum.ts
index 1df3a2b7fd2..2b45a0ac1fc 100644
--- a/packages/shared/src/config/curriculum.ts
+++ b/packages/shared/src/config/curriculum.ts
@@ -40,7 +40,32 @@ export enum SuperBlocks {
PythonV9 = 'python-v9',
RelationalDbV9 = 'relational-databases-v9',
BackEndDevApisV9 = 'back-end-development-and-apis-v9',
- FullStackDeveloperV9 = 'full-stack-developer-v9'
+ FullStackDeveloperV9 = 'full-stack-developer-v9',
+ HtmlFormsAndTables = 'html-forms-and-tables',
+ LabSurveyForm = 'lab-survey-form',
+ HtmlAndAccessibility = 'html-and-accessibility',
+ ComputerBasics = 'computer-basics',
+ BasicCss = 'basic-css',
+ DesignForDevelopers = 'design-for-developers',
+ AbsoluteAndRelativeUnits = 'absolute-and-relative-units',
+ PseudoClassesAndElements = 'pseudo-classes-and-elements',
+ CssColors = 'css-colors',
+ StylingForms = 'styling-forms',
+ CssBoxModel = 'css-box-model',
+ CssFlexbox = 'css-flexbox',
+ LabPageOfPlayingCards = 'lab-page-of-playing-cards',
+ CssTypography = 'css-typography',
+ CssAndAccessibility = 'css-and-accessibility',
+ CssPositioning = 'css-positioning',
+ AttributeSelectors = 'attribute-selectors',
+ LabBookInventoryApp = 'lab-book-inventory-app',
+ ResponsiveDesign = 'responsive-design',
+ LabTechnicalDocumentationPage = 'lab-technical-documentation-page',
+ CssVariables = 'css-variables',
+ CssGrid = 'css-grid',
+ LabProductLandingPage = 'lab-product-landing-page',
+ CssAnimations = 'css-animations',
+ LearnPythonForBeginners = 'learn-python-for-beginners'
}
export const languageSuperBlocks = [
@@ -164,15 +189,41 @@ export const superBlockStages: StageMap = {
],
// Catalog is treated like upcoming for now
// Add catalog superBlocks to catalog.ts when adding new superBlocks
- [SuperBlockStage.Catalog]: [SuperBlocks.BasicHtml, SuperBlocks.SemanticHtml]
+ [SuperBlockStage.Catalog]: [
+ SuperBlocks.HtmlFormsAndTables,
+ SuperBlocks.BasicHtml,
+ SuperBlocks.SemanticHtml,
+ SuperBlocks.LabSurveyForm,
+ SuperBlocks.HtmlAndAccessibility,
+ SuperBlocks.ComputerBasics,
+ SuperBlocks.BasicCss,
+ SuperBlocks.DesignForDevelopers,
+ SuperBlocks.AbsoluteAndRelativeUnits,
+ SuperBlocks.PseudoClassesAndElements,
+ SuperBlocks.CssColors,
+ SuperBlocks.StylingForms,
+ SuperBlocks.CssBoxModel,
+ SuperBlocks.CssFlexbox,
+ SuperBlocks.LabPageOfPlayingCards,
+ SuperBlocks.CssTypography,
+ SuperBlocks.CssAndAccessibility,
+ SuperBlocks.CssPositioning,
+ SuperBlocks.AttributeSelectors,
+ SuperBlocks.LabBookInventoryApp,
+ SuperBlocks.ResponsiveDesign,
+ SuperBlocks.LabTechnicalDocumentationPage,
+ SuperBlocks.CssVariables,
+ SuperBlocks.CssGrid,
+ SuperBlocks.LabProductLandingPage,
+ SuperBlocks.CssAnimations,
+ SuperBlocks.LearnPythonForBeginners
+ ]
};
Object.freeze(superBlockStages);
export const archivedSuperBlocks = superBlockStages[SuperBlockStage.Legacy];
-export const catalogSuperBlocks = superBlockStages[SuperBlockStage.Catalog];
-
type NotAuditedSuperBlocks = {
[key in Languages]: SuperBlocks[];
};