Feat(Curriculum): Implement Chapter Based Layout to A1 Spanish (#62190)

Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
This commit is contained in:
Nielda Karla
2025-09-15 16:39:48 -03:00
committed by GitHub
parent 954117ce5e
commit 75e825d5fa
24 changed files with 608 additions and 39 deletions

View File

@@ -4849,10 +4849,38 @@
"title": "A1 Professional Spanish Certification (Beta)",
"note": "This certification is currently in active development. While there isn't a claimable certification available for this section at the moment, one will be available soon. In the meantime, you're welcome to explore the courses we have created below.",
"intro": ["Placeholder intro"],
"chapters": {
"es-a1-chapter-greetings-and-introductions": "Greetings and Introductions"
},
"modules": {
"es-a1-module-greetings-and-farewells": "Greetings and Farewells"
},
"module-intros": {
"es-a1-module-greetings-and-farewells": {
"note": "Coming Winter 2025",
"intro": ["PLACEHOLDER: Write the module intro here."]
}
},
"blocks": {
"a1-professional-spanish-placeholder-block": {
"title": "A1 Professional Spanish Placeholder Block",
"intro": ["Placeholder intro text."]
"es-a1-warm-up-greetings-and-farewells-basics": {
"title": "Greetings and Farewells Basics",
"intro": ["Learn the basics of greetings and farewells in Spanish."]
},
"es-a1-learn-greetings-during-the-day": {
"title": "Greetings During the Day",
"intro": ["", ""]
},
"es-a1-practice-greetings-and-farewells": {
"title": "Greetings and Farewells Practice",
"intro": ["", ""]
},
"es-a1-review-greetings-and-farewells": {
"title": "Greetings and Farewells Review",
"intro": ["", ""]
},
"es-a1-quiz-greetings-and-farewells": {
"title": "Greetings and Farewells Quiz",
"intro": ["", ""]
}
}
},

View File

@@ -1,9 +0,0 @@
---
title: Introduction to the A1 Professional Spanish Placeholder Block
block: a1-professional-spanish-placeholder-block
superBlock: a1-professional-spanish
---
## Introduction to the A1 Professional Spanish Placeholder Block
Introduction to the A1 Professional Spanish Placeholder Block

View File

@@ -0,0 +1,9 @@
---
title: Introduction to the Greetings During the Day
block: es-a1-learn-greetings-during-the-day
superBlock: a1-professional-spanish
---
## Introduction to the Greetings During the Day
This page is for the Greetings During the Day

View File

@@ -0,0 +1,9 @@
---
title: Introduction to the Greetings and Farewells Practice
block: es-a1-practice-greetings-and-farewells
superBlock: a1-professional-spanish
---
## Introduction to the Greetings and Farewells Practice
This page is for the Greetings and Farewells Practice

View File

@@ -0,0 +1,9 @@
---
title: Introduction to the Greetings and Farewells Quiz
block: es-a1-quiz-greetings-and-farewells
superBlock: a1-professional-spanish
---
## Introduction to the Greetings and Farewells Quiz
This page is for the Greetings and Farewells Quiz

View File

@@ -0,0 +1,9 @@
---
title: Introduction to the Greetings and Farewells Review
block: es-a1-review-greetings-and-farewells
superBlock: a1-professional-spanish
---
## Introduction to the Greetings and Farewells Review
This page is for the Greetings and Farewells Review

View File

@@ -0,0 +1,9 @@
---
title: Introduction to Greetings and Farewells Basics
block: es-a1-warm-up-greetings-and-farewells-basics
superBlock: a1-professional-spanish
---
## Introduction to Greetings and Farewells Basics
Introduction to Greetings and Farewells Basics

View File

@@ -9,8 +9,10 @@ import DropDown from '../../../assets/icons/dropdown';
// from the curriculum
import fullStackCert from '../../../../../curriculum/structure/superblocks/full-stack-developer.json';
import fullStackOpen from '../../../../../curriculum/structure/superblocks/full-stack-open.json';
import a1Spanish from '../../../../../curriculum/structure/superblocks/a1-professional-spanish.json';
import { ChapterIcon } from '../../../assets/chapter-icon';
import { type Chapter } from '../../../../../shared/config/chapters';
import { BlockLayouts, BlockTypes } from '../../../../../shared/config/blocks';
import { FsdChapters } from '../../../../../shared/config/chapters';
import { type Module } from '../../../../../shared/config/modules';
@@ -174,12 +176,16 @@ export const SuperBlockAccordion = ({
chosenBlock,
completedChallengeIds
}: SuperBlockAccordionProps) => {
function getSuperblockStructure(superBlock: SuperBlocks) {
function getSuperblockStructure(superBlock: SuperBlocks): {
chapters: Chapter[];
} {
switch (superBlock) {
case SuperBlocks.FullStackOpen:
return fullStackOpen;
case SuperBlocks.FullStackDeveloper:
return fullStackCert;
case SuperBlocks.A1Spanish:
return a1Spanish;
default:
throw new Error("The SuperBlock structure hasn't been imported.");
}

View File

@@ -1,10 +0,0 @@
---
id: 68bb001c22f3bcbd1fdf38fa
title: "Dialogue 1: Placeholder Challenge"
challengeType: 21
dashedName: dialogue-1-placeholder-challenge
---
# --description--
Placeholder challenge.

View File

@@ -0,0 +1,58 @@
---
id: 68c84d44d91406c37b3ad73f
title: "Dialogue 1: I'm Tom"
challengeType: 21
dashedName: dialogue-1-im-tom
---
# --description--
Watch the video below to understand the context of the upcoming lessons.
# --assignment--
Watch the video.
# --scene--
```json
{
"setup": {
"background": "chaos.png",
"characters": [
{
"character": "David",
"position": {"x":50,"y":80,"z":8},
"opacity": 0
}
],
"audio": {
"filename": "1.1-1.mp3",
"startTime": 1,
"startTimestamp": 5.7,
"finishTimestamp": 6.48
}
},
"commands": [
{
"character": "David",
"opacity": 1,
"startTime": 0
},
{
"character": "David",
"startTime": 1,
"finishTime": 0.78,
"dialogue": {
"text": "I'm Tom.",
"align": "center"
}
},
{
"character": "Tom",
"opacity": 0,
"startTime": 1.28
}
]
}
```

View File

@@ -0,0 +1,58 @@
---
id: 68c850c5eb642cc96ed86544
title: "Dialogue 1: I'm Tom"
challengeType: 21
dashedName: dialogue-1-im-tom
---
# --description--
Watch the video below to understand the context of the upcoming lessons.
# --assignment--
Watch the video.
# --scene--
```json
{
"setup": {
"background": "chaos.png",
"characters": [
{
"character": "David",
"position": {"x":50,"y":80,"z":8},
"opacity": 0
}
],
"audio": {
"filename": "1.1-1.mp3",
"startTime": 1,
"startTimestamp": 5.7,
"finishTimestamp": 6.48
}
},
"commands": [
{
"character": "David",
"opacity": 1,
"startTime": 0
},
{
"character": "David",
"startTime": 1,
"finishTime": 0.78,
"dialogue": {
"text": "I'm Tom.",
"align": "center"
}
},
{
"character": "Tom",
"opacity": 0,
"startTime": 1.28
}
]
}
```

View File

@@ -0,0 +1,58 @@
---
id: 68c8510f4a9c00ca2a67160c
title: "Dialogue 1: I'm Tom"
challengeType: 21
dashedName: dialogue-1-im-tom
---
# --description--
Watch the video below to understand the context of the upcoming lessons.
# --assignment--
Watch the video.
# --scene--
```json
{
"setup": {
"background": "chaos.png",
"characters": [
{
"character": "David",
"position": {"x":50,"y":80,"z":8},
"opacity": 0
}
],
"audio": {
"filename": "1.1-1.mp3",
"startTime": 1,
"startTimestamp": 5.7,
"finishTimestamp": 6.48
}
},
"commands": [
{
"character": "David",
"opacity": 1,
"startTime": 0
},
{
"character": "David",
"startTime": 1,
"finishTime": 0.78,
"dialogue": {
"text": "I'm Tom.",
"align": "center"
}
},
{
"character": "Tom",
"opacity": 0,
"startTime": 1.28
}
]
}
```

View File

@@ -0,0 +1,58 @@
---
id: 68c850ed23d494c9be5cb22a
title: "Dialogue 1: I'm Tom"
challengeType: 21
dashedName: dialogue-1-im-tom
---
# --description--
Watch the video below to understand the context of the upcoming lessons.
# --assignment--
Watch the video.
# --scene--
```json
{
"setup": {
"background": "chaos.png",
"characters": [
{
"character": "David",
"position": {"x":50,"y":80,"z":8},
"opacity": 0
}
],
"audio": {
"filename": "1.1-1.mp3",
"startTime": 1,
"startTimestamp": 5.7,
"finishTimestamp": 6.48
}
},
"commands": [
{
"character": "David",
"opacity": 1,
"startTime": 0
},
{
"character": "David",
"startTime": 1,
"finishTime": 0.78,
"dialogue": {
"text": "I'm Tom.",
"align": "center"
}
},
{
"character": "Tom",
"opacity": 0,
"startTime": 1.28
}
]
}
```

View File

@@ -0,0 +1,116 @@
---
id: 68bb001c22f3bcbd1fdf38fa
title: "Task 1"
challengeType: 19
dashedName: task-1
---
<!-- (Audio) Elena: Hola -->
# --description--
`¡Bienvenidos!`
Welcome to the A1 Professional Spanish course!
This is an **elementary course** focused on teaching you the very basics of the Spanish language.
The section you're in now is called `warm-up`. This is where you'll be introduced to new words before they appear in longer sentences or conversations.
Let's start by practicing your first word in Spanish.
# --instructions--
Listen to the audio and answer the question below.
There's just **one** correct answer. If you need help, click on the `explanation` at the bottom of the lesson.
# --questions--
## --text--
What does the speaker say?
## --answers--
`Hola`
---
`Adiós`
### --feedback--
This means the opposite of what the speaker says. Open the explanation section if you need further help.
---
`Chao`
### --feedback--
This means the opposite of what the speaker says. Open the explanation section if you need further help.
---
`Gracias`
### --feedback--
This is a polite word, but it's not what you hear in the audio.
## --video-solution--
1
# --explanation--
The word `Hola` is a greeting. It is used when you meet someone, similar to "Hello" or "Hi" in English. For example:
`Hola, Buenos Días` Hi, Good morning!
# --scene--
```json
{
"setup": {
"background": "interview-room3.png",
"characters": [
{
"character": "Elena",
"position": {
"x": 50,
"y": 15,
"z": 1.2
},
"opacity": 0
}
],
"audio": {
"filename": "ES_A1_1.1.mp3",
"startTime": 1,
"startTimestamp": 0.35,
"finishTimestamp": 1.0
}
},
"commands": [
{
"character": "Elena",
"opacity": 1,
"startTime": 0
},
{
"character": "Elena",
"startTime": 1,
"finishTime": 1.65,
"dialogue": {
"text": "Hola",
"align": "center"
}
},
{
"character": "Elena",
"opacity": 0,
"startTime": 2.15
}
]
}
```

View File

@@ -0,0 +1,88 @@
---
id: 68c488abd71a3e27190965e0
title: Task 2
challengeType: 22
dashedName: task-2
---
<!-- (Audio) Elena: Hola -->
# --description--
`¡Hola!`
In this type of task, you need to listen to the audio and fill in the missing word.
This is great practice for your listening skills!
If you're having trouble hearing the audio, click on the `transcript` to read it, or use the `CC` button inside the animation to follow along with subtitles as the characters speak.
# --instructions--
Listen to the audio and complete the sentence below.
# --fillInTheBlank--
## --sentence--
`BLANK .`
## --blanks--
`Hola`
### --feedback--
This is the greeting you just learned.
# --explanation--
`Hola` is a greeting. It's used to say "Hello" at the beginning of a conversation. For example:
`Hola, buenos días` Hello, good morning!
# --scene--
```json
{
"setup": {
"background": "interview-room3.png",
"characters": [
{
"character": "Elena",
"position": {
"x": 50,
"y": 15,
"z": 1.2
},
"opacity": 0
}
],
"audio": {
"filename": "ES_A1_1.1.mp3",
"startTime": 1,
"startTimestamp": 0.35,
"finishTimestamp": 1.0
}
},
"commands": [
{
"character": "Elena",
"opacity": 1,
"startTime": 0
},
{
"character": "Elena",
"startTime": 1,
"finishTime": 1.65,
"dialogue": {
"text": "Hola",
"align": "center"
}
},
{
"character": "Elena",
"opacity": 0,
"startTime": 2.15
}
]
}
```

View File

@@ -259,7 +259,17 @@ const availableAudios = [
'B1_23-3.mp3',
'B1_24-1.mp3',
'B1_24-2.mp3',
'B1_24-3.mp3'
'B1_24-3.mp3',
'ES_A1_1.1.mp3',
'ES_A1_1.2.mp3',
'ES_A1_1.3.mp3',
'ES_A1_1.4.mp3',
'ES_A1_2.1.mp3',
'ES_A1_2.2.mp3',
'ES_A1_2.3.mp3',
'ES_A1_2.4.mp3',
'ES_A1_3.1.mp3',
'ES_A1_3.2.mp3'
];
const availableAlignments = ['left', 'center', 'right'];

View File

@@ -1,13 +0,0 @@
{
"name": "A1 Professional Spanish Placeholder Block",
"isUpcomingChange": true,
"dashedName": "a1-professional-spanish-placeholder-block",
"helpCategory": "English",
"challengeOrder": [
{
"id": "68bb001c22f3bcbd1fdf38fa",
"title": "Dialogue 1: Placeholder Challenge"
}
],
"blockLayout": "project-list"
}

View File

@@ -0,0 +1,11 @@
{
"name": "Greetings During the Day",
"isUpcomingChange": true,
"dashedName": "es-a1-learn-greetings-during-the-day",
"helpCategory": "English",
"blockLayout": "dialogue-grid",
"blockType": "learn",
"challengeOrder": [
{ "id": "68c84d44d91406c37b3ad73f", "title": "Dialogue 1: I'm Tom" }
]
}

View File

@@ -0,0 +1,11 @@
{
"name": "Greetings and Farewells Practice",
"isUpcomingChange": true,
"dashedName": "es-a1-practice-greetings-and-farewells",
"helpCategory": "English",
"blockLayout": "dialogue-grid",
"blockType": "practice",
"challengeOrder": [
{ "id": "68c850c5eb642cc96ed86544", "title": "Dialogue 1: I'm Tom" }
]
}

View File

@@ -0,0 +1,11 @@
{
"name": "Greetings and Farewells Quiz",
"isUpcomingChange": true,
"dashedName": "es-a1-quiz-greetings-and-farewells",
"helpCategory": "English",
"blockLayout": "dialogue-grid",
"blockType": "quiz",
"challengeOrder": [
{ "id": "68c8510f4a9c00ca2a67160c", "title": "Dialogue 1: I'm Tom" }
]
}

View File

@@ -0,0 +1,11 @@
{
"name": "Greetings and Farewells Review",
"isUpcomingChange": true,
"dashedName": "es-a1-review-greetings-and-farewells",
"helpCategory": "English",
"blockLayout": "dialogue-grid",
"blockType": "review",
"challengeOrder": [
{ "id": "68c850ed23d494c9be5cb22a", "title": "Dialogue 1: I'm Tom" }
]
}

View File

@@ -0,0 +1,15 @@
{
"name": "Greetings and Farewells Basics",
"dashedName": "es-a1-warm-up-greetings-and-farewells-basics",
"isUpcomingChange": true,
"blockType": "warm-up",
"blockLayout": "dialogue-grid",
"helpCategory": "English",
"challengeOrder": [
{
"id": "68bb001c22f3bcbd1fdf38fa",
"title": "Task 1"
},
{ "id": "68c488abd71a3e27190965e0", "title": "Task 2" }
]
}

View File

@@ -1,3 +1,19 @@
{
"blocks": ["a1-professional-spanish-placeholder-block"]
"chapters": [
{
"dashedName": "es-a1-chapter-greetings-and-introductions",
"modules": [
{
"dashedName": "es-a1-module-greetings-and-farewells",
"blocks": [
"es-a1-warm-up-greetings-and-farewells-basics",
"es-a1-learn-greetings-during-the-day",
"es-a1-practice-greetings-and-farewells",
"es-a1-review-greetings-and-farewells",
"es-a1-quiz-greetings-and-farewells"
]
}
]
}
]
}

View File

@@ -343,7 +343,8 @@ Object.freeze(notAuditedSuperBlocks);
export const chapterBasedSuperBlocks = [
SuperBlocks.FullStackDeveloper,
SuperBlocks.FullStackOpen
SuperBlocks.FullStackOpen,
SuperBlocks.A1Spanish
];
Object.freeze(chapterBasedSuperBlocks);