this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add section structure and expand Section 1 to 30 topics

Introduce sections concept (Section 1-4 planned) with section banners
on the home page. Expand Section 1 (Foundations) from 6 to 30 topics
covering CEFR A1 material: greetings, basics, introductions, courtesy,
numbers, colors, family, emotions, adjectives, body parts, clothing,
animals, home, nature, time, days, weather, verbs, daily routine, food,
shopping, market, restaurant, school, jobs, sports, health, directions,
travel, and common phrases.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+1868 -18
+64
content/adjectives/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "adjectives", 4 + "title": "Describing Things", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Malaki' mean?", 10 + "promptAudio": true, 11 + "choices": ["Big", "Small", "Tall", "Short"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog adjectives with their English translations", 17 + "pairs": [ 18 + { "left": "Malaki", "right": "Big" }, 19 + { "left": "Maliit", "right": "Small" }, 20 + { "left": "Matangkad", "right": "Tall" }, 21 + { "left": "Mabait", "right": "Kind" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Ang bahay ay malaki'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["The house is big", "the house is big", "The house is large", "the house is large"], 29 + "hint": "'Bahay' means 'house'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "The flower is beautiful", 34 + "sentence": "Ang bulaklak ay ___.", 35 + "blank": "maganda", 36 + "hint": "An adjective meaning 'beautiful'", 37 + "wordBank": ["maganda", "pangit", "malaki", "maliit"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match opposite adjectives", 42 + "pairs": [ 43 + { "left": "Maganda", "right": "Beautiful" }, 44 + { "left": "Pangit", "right": "Ugly" }, 45 + { "left": "Mabilis", "right": "Fast" }, 46 + { "left": "Mabagal", "right": "Slow" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'new'?", 52 + "promptAudio": false, 53 + "choices": ["Bago", "Luma", "Malaki", "Mabait"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'The dog is small' in Tagalog", 59 + "phrase": "Ang aso ay maliit", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["ang aso ay maliit"] 62 + } 63 + ] 64 + }
+64
content/animals/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "animals", 4 + "title": "Animals", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Aso' mean?", 10 + "promptAudio": true, 11 + "choices": ["Dog", "Cat", "Bird", "Fish"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog animal names", 17 + "pairs": [ 18 + { "left": "Aso", "right": "Dog" }, 19 + { "left": "Pusa", "right": "Cat" }, 20 + { "left": "Ibon", "right": "Bird" }, 21 + { "left": "Isda", "right": "Fish" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Ang pusa ko ay maliit'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["My cat is small", "my cat is small"], 29 + "hint": "'Pusa' means 'cat' and 'maliit' means 'small'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "The bird is flying", 34 + "sentence": "Ang ___ ay lumilipad.", 35 + "blank": "ibon", 36 + "hint": "An animal with wings", 37 + "wordBank": ["ibon", "aso", "pusa", "isda"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more animals", 42 + "pairs": [ 43 + { "left": "Manok", "right": "Chicken" }, 44 + { "left": "Baboy", "right": "Pig" }, 45 + { "left": "Baka", "right": "Cow" }, 46 + { "left": "Kalabaw", "right": "Carabao / Water buffalo" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'horse'?", 52 + "promptAudio": false, 53 + "choices": ["Kabayo", "Kalabaw", "Kambing", "Baka"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I have a dog' in Tagalog", 59 + "phrase": "May aso ako", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["may aso ako", "mayroon akong aso"] 62 + } 63 + ] 64 + }
+64
content/body/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "body", 4 + "title": "Body Parts", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Ulo' mean?", 10 + "promptAudio": true, 11 + "choices": ["Head", "Hand", "Foot", "Eye"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog body parts with their English translations", 17 + "pairs": [ 18 + { "left": "Ulo", "right": "Head" }, 19 + { "left": "Kamay", "right": "Hand" }, 20 + { "left": "Paa", "right": "Foot" }, 21 + { "left": "Mata", "right": "Eye" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Masakit ang ulo ko'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["My head hurts", "my head hurts", "My head is painful", "I have a headache"], 29 + "hint": "'Masakit' means 'painful' or 'hurts'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I have two hands", 34 + "sentence": "Mayroon akong dalawang ___.", 35 + "blank": "kamay", 36 + "hint": "The body part you use to hold things", 37 + "wordBank": ["kamay", "paa", "mata", "tainga"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more body parts", 42 + "pairs": [ 43 + { "left": "Ilong", "right": "Nose" }, 44 + { "left": "Bibig", "right": "Mouth" }, 45 + { "left": "Tainga", "right": "Ear" }, 46 + { "left": "Buhok", "right": "Hair" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'finger'?", 52 + "promptAudio": false, 53 + "choices": ["Daliri", "Kamay", "Paa", "Braso"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'My eyes are brown' in Tagalog", 59 + "phrase": "Ang mga mata ko ay kayumanggi", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["ang mga mata ko ay kayumanggi"] 62 + } 63 + ] 64 + }
+64
content/clothing/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "clothing", 4 + "title": "Clothing & Accessories", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Damit' mean?", 10 + "promptAudio": true, 11 + "choices": ["Clothes", "Shoes", "Hat", "Bag"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog clothing words", 17 + "pairs": [ 18 + { "left": "Damit", "right": "Clothes" }, 19 + { "left": "Sapatos", "right": "Shoes" }, 20 + { "left": "Sombrero", "right": "Hat" }, 21 + { "left": "Palda", "right": "Skirt" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Maganda ang damit mo'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["Your clothes are beautiful", "your clothes are beautiful", "Your outfit is beautiful", "Your dress is beautiful"], 29 + "hint": "'Maganda' means 'beautiful'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I'm wearing a red shirt", 34 + "sentence": "Nagsusuot ako ng pulang ___.", 35 + "blank": "kamiseta", 36 + "hint": "A word for 'shirt'", 37 + "wordBank": ["kamiseta", "palda", "sapatos", "sombrero"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more clothing items", 42 + "pairs": [ 43 + { "left": "Kamiseta", "right": "T-shirt" }, 44 + { "left": "Pantalon", "right": "Pants" }, 45 + { "left": "Tsinelas", "right": "Slippers" }, 46 + { "left": "Bag", "right": "Bag" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What does 'Nagsusuot' mean?", 52 + "promptAudio": false, 53 + "choices": ["Wearing", "Buying", "Washing", "Sewing"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I like your shoes' in Tagalog", 59 + "phrase": "Gusto ko ang sapatos mo", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["gusto ko ang sapatos mo"] 62 + } 63 + ] 64 + }
+64
content/colors/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "colors", 4 + "title": "Colors", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Pula' mean?", 10 + "promptAudio": true, 11 + "choices": ["Red", "Blue", "Green", "Yellow"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog colors with their English translations", 17 + "pairs": [ 18 + { "left": "Pula", "right": "Red" }, 19 + { "left": "Asul", "right": "Blue" }, 20 + { "left": "Dilaw", "right": "Yellow" }, 21 + { "left": "Berde", "right": "Green" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Ang paborito kong kulay ay asul'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["My favorite color is blue", "my favorite color is blue"], 29 + "hint": "'Paborito' means 'favorite' and 'kulay' means 'color'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "The sky is blue", 34 + "sentence": "Ang langit ay ___.", 35 + "blank": "asul", 36 + "hint": "The color of the sky", 37 + "wordBank": ["asul", "pula", "dilaw", "puti"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more Tagalog colors", 42 + "pairs": [ 43 + { "left": "Puti", "right": "White" }, 44 + { "left": "Itim", "right": "Black" }, 45 + { "left": "Kahel", "right": "Orange" }, 46 + { "left": "Rosas", "right": "Pink" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'white'?", 52 + "promptAudio": false, 53 + "choices": ["Puti", "Itim", "Dilaw", "Berde"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'My favorite color is red' in Tagalog", 59 + "phrase": "Ang paborito kong kulay ay pula", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["ang paborito kong kulay ay pula"] 62 + } 63 + ] 64 + }
+61
content/courtesy/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "courtesy", 4 + "title": "Being Polite", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Po' add to a sentence?", 10 + "promptAudio": false, 11 + "choices": ["Politeness / respect", "A question", "Emphasis", "Negation"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "translation", 16 + "prompt": "Translate to English: 'Salamat po'", 17 + "promptAudio": true, 18 + "acceptedAnswers": ["Thank you (polite)", "Thank you, sir", "Thank you, ma'am", "Thank you po", "thank you"], 19 + "hint": "'Salamat' means 'thank you' and 'po' adds respect" 20 + }, 21 + { 22 + "type": "matching-pairs", 23 + "prompt": "Match the polite phrases with their meanings", 24 + "pairs": [ 25 + { "left": "Salamat po", "right": "Thank you (polite)" }, 26 + { "left": "Opo", "right": "Yes (polite)" }, 27 + { "left": "Pasensya na po", "right": "I'm sorry (polite)" }, 28 + { "left": "Pakisuyo po", "right": "Please (polite)" } 29 + ] 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "Say 'excuse me' politely", 34 + "sentence": "___ po.", 35 + "blank": "Paumanhin", 36 + "hint": "A word meaning 'excuse me'", 37 + "wordBank": ["Paumanhin", "Salamat", "Kamusta", "Paalam"] 38 + }, 39 + { 40 + "type": "multiple-choice", 41 + "prompt": "What is the polite way to say 'yes' in Tagalog?", 42 + "promptAudio": false, 43 + "choices": ["Opo", "Oo", "Hindi", "Sige"], 44 + "correctIndex": 0 45 + }, 46 + { 47 + "type": "speak", 48 + "prompt": "Say 'thank you very much' politely", 49 + "phrase": "Maraming salamat po", 50 + "promptAudio": true, 51 + "acceptedAnswers": ["maraming salamat po"] 52 + }, 53 + { 54 + "type": "translation", 55 + "prompt": "Translate to Tagalog: 'You're welcome'", 56 + "promptAudio": false, 57 + "acceptedAnswers": ["Walang anuman", "walang anuman", "Walang anuman po", "walang anuman po"], 58 + "hint": "Literally means 'it's nothing'" 59 + } 60 + ] 61 + }
+64
content/daily/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "daily", 4 + "title": "Daily Routine", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Gumising' mean?", 10 + "promptAudio": true, 11 + "choices": ["To wake up", "To sleep", "To eat", "To leave"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the daily routine phrases", 17 + "pairs": [ 18 + { "left": "Gumising", "right": "Wake up" }, 19 + { "left": "Maligo", "right": "Take a bath" }, 20 + { "left": "Mag-almusal", "right": "Eat breakfast" }, 21 + { "left": "Pumunta sa trabaho", "right": "Go to work" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Gumigising ako ng maaga'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["I wake up early", "i wake up early"], 29 + "hint": "'Maaga' means 'early'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I take a bath every day", 34 + "sentence": "___ ako araw-araw.", 35 + "blank": "Naliligo", 36 + "hint": "What you do to get clean", 37 + "wordBank": ["Naliligo", "Kumakain", "Natutulog", "Naglalakad"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more routine actions", 42 + "pairs": [ 43 + { "left": "Magsipilyo", "right": "Brush teeth" }, 44 + { "left": "Maghapunan", "right": "Eat dinner" }, 45 + { "left": "Mag-aral", "right": "Study" }, 46 + { "left": "Manood ng TV", "right": "Watch TV" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "How do you say 'every day' in Tagalog?", 52 + "promptAudio": false, 53 + "choices": ["Araw-araw", "Minsan", "Palagi", "Kahapon"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I study every day' in Tagalog", 59 + "phrase": "Nag-aaral ako araw-araw", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["nag-aaral ako araw-araw", "nag aaral ako araw araw"] 62 + } 63 + ] 64 + }
+64
content/days/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "days", 4 + "title": "Days & Months", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Lunes' mean?", 10 + "promptAudio": true, 11 + "choices": ["Monday", "Tuesday", "Wednesday", "Sunday"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the days of the week", 17 + "pairs": [ 18 + { "left": "Lunes", "right": "Monday" }, 19 + { "left": "Martes", "right": "Tuesday" }, 20 + { "left": "Miyerkules", "right": "Wednesday" }, 21 + { "left": "Linggo", "right": "Sunday" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Anong araw ngayon?'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["What day is today?", "what day is today?", "What day is it today?", "what day is it today?"], 29 + "hint": "'Araw' means 'day' and 'ngayon' means 'today'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "Today is Friday", 34 + "sentence": "Ngayon ay ___.", 35 + "blank": "Biyernes", 36 + "hint": "The day before Saturday", 37 + "wordBank": ["Biyernes", "Sabado", "Lunes", "Huwebes"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match the months", 42 + "pairs": [ 43 + { "left": "Enero", "right": "January" }, 44 + { "left": "Pebrero", "right": "February" }, 45 + { "left": "Marso", "right": "March" }, 46 + { "left": "Disyembre", "right": "December" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'Saturday'?", 52 + "promptAudio": false, 53 + "choices": ["Sabado", "Linggo", "Biyernes", "Huwebes"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Ask 'What day is today?' in Tagalog", 59 + "phrase": "Anong araw ngayon?", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["anong araw ngayon"] 62 + } 63 + ] 64 + }
+64
content/directions/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "directions", 4 + "title": "Asking Directions", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Saan?' mean?", 10 + "promptAudio": true, 11 + "choices": ["Where?", "When?", "What?", "Who?"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the direction words", 17 + "pairs": [ 18 + { "left": "Kanan", "right": "Right" }, 19 + { "left": "Kaliwa", "right": "Left" }, 20 + { "left": "Diretso", "right": "Straight" }, 21 + { "left": "Malapit", "right": "Near" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Saan ang banyo?'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["Where is the bathroom?", "where is the bathroom?", "Where's the bathroom?"], 29 + "hint": "'Banyo' means 'bathroom'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "Turn right", 34 + "sentence": "Kumanan ka. / Lumiko ka sa ___.", 35 + "blank": "kanan", 36 + "hint": "The opposite of left", 37 + "wordBank": ["kanan", "kaliwa", "diretso", "likod"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more direction words", 42 + "pairs": [ 43 + { "left": "Malayo", "right": "Far" }, 44 + { "left": "Sa harap", "right": "In front" }, 45 + { "left": "Sa likod", "right": "Behind" }, 46 + { "left": "Sa tabi", "right": "Beside" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "How do you say 'Go straight' in Tagalog?", 52 + "promptAudio": false, 53 + "choices": ["Diretso lang", "Kumaliwa ka", "Kumanan ka", "Bumalik ka"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Ask 'Where is the market?' in Tagalog", 59 + "phrase": "Saan ang palengke?", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["saan ang palengke"] 62 + } 63 + ] 64 + }
+64
content/emotions/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "emotions", 4 + "title": "Feelings & Emotions", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Masaya' mean?", 10 + "promptAudio": true, 11 + "choices": ["Happy", "Sad", "Angry", "Scared"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog emotions with their English translations", 17 + "pairs": [ 18 + { "left": "Masaya", "right": "Happy" }, 19 + { "left": "Malungkot", "right": "Sad" }, 20 + { "left": "Galit", "right": "Angry" }, 21 + { "left": "Takot", "right": "Scared" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Masaya ako ngayon'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["I am happy now", "I'm happy now", "i am happy now", "i'm happy now", "I am happy today"], 29 + "hint": "'Ngayon' means 'now' or 'today'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I am tired", 34 + "sentence": "___ ako.", 35 + "blank": "Pagod", 36 + "hint": "A feeling when you need rest", 37 + "wordBank": ["Pagod", "Masaya", "Galit", "Takot"] 38 + }, 39 + { 40 + "type": "multiple-choice", 41 + "prompt": "How do you say 'I am sad' in Tagalog?", 42 + "promptAudio": false, 43 + "choices": ["Malungkot ako", "Masaya ako", "Galit ako", "Pagod ako"], 44 + "correctIndex": 0 45 + }, 46 + { 47 + "type": "matching-pairs", 48 + "prompt": "Match more feelings", 49 + "pairs": [ 50 + { "left": "Pagod", "right": "Tired" }, 51 + { "left": "Sabik", "right": "Excited" }, 52 + { "left": "Nahihiya", "right": "Shy / Embarrassed" }, 53 + { "left": "Naiinip", "right": "Bored" } 54 + ] 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I am happy' in Tagalog", 59 + "phrase": "Masaya ako", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["masaya ako"] 62 + } 63 + ] 64 + }
+64
content/health/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "health", 4 + "title": "Health & Wellness", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'May sakit ako' mean?", 10 + "promptAudio": true, 11 + "choices": ["I am sick", "I am hungry", "I am tired", "I am happy"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the health vocabulary", 17 + "pairs": [ 18 + { "left": "May sakit", "right": "Sick" }, 19 + { "left": "Ospital", "right": "Hospital" }, 20 + { "left": "Gamot", "right": "Medicine" }, 21 + { "left": "Doktor", "right": "Doctor" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Masakit ang tiyan ko'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["My stomach hurts", "my stomach hurts", "My stomach is painful", "I have a stomachache"], 29 + "hint": "'Tiyan' means 'stomach'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I need medicine", 34 + "sentence": "Kailangan ko ng ___.", 35 + "blank": "gamot", 36 + "hint": "What you take when you're sick", 37 + "wordBank": ["gamot", "pagkain", "tubig", "tulog"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more health words", 42 + "pairs": [ 43 + { "left": "Lagnat", "right": "Fever" }, 44 + { "left": "Ubo", "right": "Cough" }, 45 + { "left": "Sipon", "right": "Cold / Runny nose" }, 46 + { "left": "Sugat", "right": "Wound" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "How do you say 'I have a fever' in Tagalog?", 52 + "promptAudio": false, 53 + "choices": ["May lagnat ako", "May ubo ako", "May sipon ako", "May sugat ako"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I need to go to the hospital' in Tagalog", 59 + "phrase": "Kailangan kong pumunta sa ospital", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["kailangan kong pumunta sa ospital"] 62 + } 63 + ] 64 + }
+64
content/home/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "home", 4 + "title": "Around the House", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Bahay' mean?", 10 + "promptAudio": true, 11 + "choices": ["House", "Room", "Door", "Window"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog home words", 17 + "pairs": [ 18 + { "left": "Bahay", "right": "House" }, 19 + { "left": "Silid", "right": "Room" }, 20 + { "left": "Pinto", "right": "Door" }, 21 + { "left": "Bintana", "right": "Window" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Malaki ang bahay namin'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["Our house is big", "our house is big", "Our house is large"], 29 + "hint": "'Namin' means 'our'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "The kitchen is clean", 34 + "sentence": "Malinis ang ___.", 35 + "blank": "kusina", 36 + "hint": "The room where you cook", 37 + "wordBank": ["kusina", "silid", "banyo", "sala"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more rooms and items", 42 + "pairs": [ 43 + { "left": "Kusina", "right": "Kitchen" }, 44 + { "left": "Banyo", "right": "Bathroom" }, 45 + { "left": "Sala", "right": "Living room" }, 46 + { "left": "Silid-tulugan", "right": "Bedroom" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'table'?", 52 + "promptAudio": false, 53 + "choices": ["Mesa", "Upuan", "Kama", "Pinto"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I am at home' in Tagalog", 59 + "phrase": "Nasa bahay ako", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["nasa bahay ako"] 62 + } 63 + ] 64 + }
+61
content/intro/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "intro", 4 + "title": "Introducing Yourself", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Ako si...' mean?", 10 + "promptAudio": true, 11 + "choices": ["I am...", "You are...", "He is...", "They are..."], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "translation", 16 + "prompt": "Translate to English: 'Ano ang pangalan mo?'", 17 + "promptAudio": true, 18 + "acceptedAnswers": ["What is your name?", "what is your name?", "What's your name?", "what's your name?"], 19 + "hint": "'Pangalan' means 'name'" 20 + }, 21 + { 22 + "type": "fill-in-the-blank", 23 + "prompt": "Introduce yourself: 'I am Maria'", 24 + "sentence": "___ si Maria.", 25 + "blank": "Ako", 26 + "hint": "The pronoun for 'I'", 27 + "wordBank": ["Ako", "Ikaw", "Siya", "Tayo"] 28 + }, 29 + { 30 + "type": "matching-pairs", 31 + "prompt": "Match the introductions with their meanings", 32 + "pairs": [ 33 + { "left": "Ako si...", "right": "I am..." }, 34 + { "left": "Pangalan ko...", "right": "My name is..." }, 35 + { "left": "Taga-saan ka?", "right": "Where are you from?" }, 36 + { "left": "Taga-Maynila ako", "right": "I'm from Manila" } 37 + ] 38 + }, 39 + { 40 + "type": "multiple-choice", 41 + "prompt": "How do you ask someone's name in Tagalog?", 42 + "promptAudio": false, 43 + "choices": ["Ano ang pangalan mo?", "Kamusta ka?", "Saan ka pupunta?", "Ilang taon ka na?"], 44 + "correctIndex": 0 45 + }, 46 + { 47 + "type": "speak", 48 + "prompt": "Introduce yourself in Tagalog", 49 + "phrase": "Ako si Maria. Taga-Maynila ako.", 50 + "promptAudio": true, 51 + "acceptedAnswers": ["ako si maria taga maynila ako", "ako si maria. taga-maynila ako."] 52 + }, 53 + { 54 + "type": "translation", 55 + "prompt": "Translate to Tagalog: 'What is your name?'", 56 + "promptAudio": false, 57 + "acceptedAnswers": ["Ano ang pangalan mo?", "ano ang pangalan mo?", "Ano ang pangalan mo", "ano ang pangalan mo"], 58 + "hint": "'Name' in Tagalog is 'pangalan'" 59 + } 60 + ] 61 + }
+64
content/jobs/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "jobs", 4 + "title": "Occupations", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Doktor' mean?", 10 + "promptAudio": true, 11 + "choices": ["Doctor", "Teacher", "Engineer", "Nurse"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the occupations", 17 + "pairs": [ 18 + { "left": "Doktor", "right": "Doctor" }, 19 + { "left": "Guro", "right": "Teacher" }, 20 + { "left": "Nars", "right": "Nurse" }, 21 + { "left": "Pulis", "right": "Police officer" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Ano ang trabaho mo?'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["What is your job?", "what is your job?", "What do you do?", "What's your job?", "What is your work?"], 29 + "hint": "'Trabaho' means 'job' or 'work'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I am an engineer", 34 + "sentence": "___ ako.", 35 + "blank": "Inhinyero", 36 + "hint": "A person who designs and builds things", 37 + "wordBank": ["Inhinyero", "Doktor", "Guro", "Pulis"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more occupations", 42 + "pairs": [ 43 + { "left": "Magsasaka", "right": "Farmer" }, 44 + { "left": "Kusinero", "right": "Cook / Chef" }, 45 + { "left": "Abogado", "right": "Lawyer" }, 46 + { "left": "Bombero", "right": "Firefighter" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'driver'?", 52 + "promptAudio": false, 53 + "choices": ["Tsuper", "Piloto", "Barko", "Mekaniko"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Ask 'What is your job?' in Tagalog", 59 + "phrase": "Ano ang trabaho mo?", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["ano ang trabaho mo"] 62 + } 63 + ] 64 + }
+64
content/market/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "market", 4 + "title": "At the Market", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Palengke' mean?", 10 + "promptAudio": true, 11 + "choices": ["Market", "Store", "Restaurant", "Mall"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the market vocabulary", 17 + "pairs": [ 18 + { "left": "Palengke", "right": "Market" }, 19 + { "left": "Gulay", "right": "Vegetables" }, 20 + { "left": "Prutas", "right": "Fruits" }, 21 + { "left": "Karne", "right": "Meat" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Pupunta ako sa palengke'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["I will go to the market", "I'm going to the market", "i will go to the market"], 29 + "hint": "'Pupunta' means 'will go' and 'palengke' means 'market'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I want to buy fruits", 34 + "sentence": "Gusto kong bumili ng ___.", 35 + "blank": "prutas", 36 + "hint": "Sweet, natural food that grows on trees", 37 + "wordBank": ["prutas", "gulay", "karne", "isda"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more market words", 42 + "pairs": [ 43 + { "left": "Sariwang isda", "right": "Fresh fish" }, 44 + { "left": "Bigas", "right": "Rice (uncooked)" }, 45 + { "left": "Itlog", "right": "Eggs" }, 46 + { "left": "Tumawad", "right": "To bargain" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What does 'Sariwa' mean?", 52 + "promptAudio": false, 53 + "choices": ["Fresh", "Old", "Expensive", "Cheap"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I'm going to the market' in Tagalog", 59 + "phrase": "Pupunta ako sa palengke", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["pupunta ako sa palengke"] 62 + } 63 + ] 64 + }
+64
content/nature/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "nature", 4 + "title": "Nature & Environment", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Dagat' mean?", 10 + "promptAudio": true, 11 + "choices": ["Sea / Ocean", "Mountain", "River", "Forest"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog nature words", 17 + "pairs": [ 18 + { "left": "Dagat", "right": "Sea" }, 19 + { "left": "Bundok", "right": "Mountain" }, 20 + { "left": "Ilog", "right": "River" }, 21 + { "left": "Puno", "right": "Tree" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Maganda ang bundok'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["The mountain is beautiful", "the mountain is beautiful"], 29 + "hint": "'Bundok' means 'mountain'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "The flower is red", 34 + "sentence": "Ang ___ ay pula.", 35 + "blank": "bulaklak", 36 + "hint": "A plant that blooms", 37 + "wordBank": ["bulaklak", "puno", "damo", "dahon"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more nature words", 42 + "pairs": [ 43 + { "left": "Bulaklak", "right": "Flower" }, 44 + { "left": "Dahon", "right": "Leaf" }, 45 + { "left": "Langit", "right": "Sky" }, 46 + { "left": "Lupa", "right": "Earth / Soil" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'rain'?", 52 + "promptAudio": false, 53 + "choices": ["Ulan", "Araw", "Hangin", "Ulap"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'The sea is beautiful' in Tagalog", 59 + "phrase": "Maganda ang dagat", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["maganda ang dagat"] 62 + } 63 + ] 64 + }
+64
content/phrases/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "phrases", 4 + "title": "Common Phrases", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Sige' mean?", 10 + "promptAudio": true, 11 + "choices": ["Okay / Sure / Go ahead", "No", "Maybe", "Please"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match common Tagalog phrases", 17 + "pairs": [ 18 + { "left": "Sige", "right": "Okay / Sure" }, 19 + { "left": "Bahala na", "right": "Come what may" }, 20 + { "left": "Hindi bale", "right": "Never mind" }, 21 + { "left": "Ingat", "right": "Take care" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Pwede ba?'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["Can I?", "Is it okay?", "May I?", "Is it possible?", "can i?"], 29 + "hint": "'Pwede' means 'can' or 'possible'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I don't know", 34 + "sentence": "___ ko.", 35 + "blank": "Hindi ko alam", 36 + "hint": "A phrase for when you lack information", 37 + "wordBank": ["Hindi ko alam", "Alam", "Gusto", "Kailangan"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more useful phrases", 42 + "pairs": [ 43 + { "left": "Teka muna", "right": "Wait a moment" }, 44 + { "left": "Ano ba yan?", "right": "What is that?" }, 45 + { "left": "Talaga?", "right": "Really?" }, 46 + { "left": "Siyempre", "right": "Of course" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What does 'Ingat ka' mean?", 52 + "promptAudio": false, 53 + "choices": ["Take care", "Goodbye", "See you", "I'm sorry"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'Take care!' in Tagalog", 59 + "phrase": "Ingat ka!", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["ingat ka", "ingat"] 62 + } 63 + ] 64 + }
+64
content/restaurant/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "restaurant", 4 + "title": "Eating Out", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Kainan' mean?", 10 + "promptAudio": true, 11 + "choices": ["Restaurant / Eatery", "Kitchen", "Market", "House"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the restaurant vocabulary", 17 + "pairs": [ 18 + { "left": "Menu", "right": "Menu" }, 19 + { "left": "Order", "right": "Order" }, 20 + { "left": "Kubyertos", "right": "Utensils" }, 21 + { "left": "Baso", "right": "Glass" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Ano ang masarap dito?'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["What is delicious here?", "what is delicious here?", "What's good here?", "What tastes good here?"], 29 + "hint": "'Masarap' means 'delicious' and 'dito' means 'here'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "Can I have the bill please?", 34 + "sentence": "Paki-abot ng ___ po.", 35 + "blank": "kuwenta", 36 + "hint": "What you ask for before paying", 37 + "wordBank": ["kuwenta", "menu", "tubig", "kubyertos"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more restaurant phrases", 42 + "pairs": [ 43 + { "left": "Pang-ilang tao?", "right": "For how many people?" }, 44 + { "left": "Isang order ng...", "right": "One order of..." }, 45 + { "left": "May inirerekomenda ba kayo?", "right": "Do you have recommendations?" }, 46 + { "left": "Busog na ako", "right": "I'm full" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "How do you say 'I'm full' in Tagalog?", 52 + "promptAudio": false, 53 + "choices": ["Busog na ako", "Gutom na ako", "Uhaw na ako", "Pagod na ako"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'The food is delicious' in Tagalog", 59 + "phrase": "Masarap ang pagkain", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["masarap ang pagkain"] 62 + } 63 + ] 64 + }
+64
content/school/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "school", 4 + "title": "At School", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Paaralan' mean?", 10 + "promptAudio": true, 11 + "choices": ["School", "Library", "Office", "Park"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the school vocabulary", 17 + "pairs": [ 18 + { "left": "Paaralan", "right": "School" }, 19 + { "left": "Guro", "right": "Teacher" }, 20 + { "left": "Mag-aaral", "right": "Student" }, 21 + { "left": "Silid-aralan", "right": "Classroom" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Nag-aaral ako ng Tagalog'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["I am studying Tagalog", "I'm studying Tagalog", "i am studying tagalog", "I study Tagalog"], 29 + "hint": "'Nag-aaral' means 'studying'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "The teacher is kind", 34 + "sentence": "Mabait ang ___.", 35 + "blank": "guro", 36 + "hint": "The person who teaches", 37 + "wordBank": ["guro", "mag-aaral", "libro", "paaralan"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match school supplies", 42 + "pairs": [ 43 + { "left": "Libro", "right": "Book" }, 44 + { "left": "Lapis", "right": "Pencil" }, 45 + { "left": "Papel", "right": "Paper" }, 46 + { "left": "Bag", "right": "Bag" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'homework'?", 52 + "promptAudio": false, 53 + "choices": ["Takdang-aralin", "Pagsusulit", "Aklat", "Klase"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I go to school' in Tagalog", 59 + "phrase": "Pumupunta ako sa paaralan", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["pumupunta ako sa paaralan"] 62 + } 63 + ] 64 + }
+64
content/shopping/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "shopping", 4 + "title": "Shopping & Money", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Magkano?' mean?", 10 + "promptAudio": true, 11 + "choices": ["How much?", "What is it?", "Where is it?", "Who is it?"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the shopping phrases", 17 + "pairs": [ 18 + { "left": "Magkano ito?", "right": "How much is this?" }, 19 + { "left": "Mahal", "right": "Expensive" }, 20 + { "left": "Mura", "right": "Cheap" }, 21 + { "left": "Bibilhin ko", "right": "I'll buy it" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Mahal ang presyo'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["The price is expensive", "the price is expensive", "The price is high"], 29 + "hint": "'Presyo' means 'price'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "How much is this shirt?", 34 + "sentence": "Magkano ang ___ na ito?", 35 + "blank": "kamiseta", 36 + "hint": "A type of clothing for the upper body", 37 + "wordBank": ["kamiseta", "sapatos", "pagkain", "libro"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more shopping words", 42 + "pairs": [ 43 + { "left": "Pera", "right": "Money" }, 44 + { "left": "Sukli", "right": "Change (coins)" }, 45 + { "left": "Tindahan", "right": "Store / Shop" }, 46 + { "left": "Bayad", "right": "Payment" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "How do you say 'Can you give me a discount?' in Tagalog?", 52 + "promptAudio": false, 53 + "choices": ["Pwede bang tumawad?", "Magkano ito?", "Saan ang tindahan?", "Ano ang gusto mo?"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Ask 'How much is this?' in Tagalog", 59 + "phrase": "Magkano ito?", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["magkano ito"] 62 + } 63 + ] 64 + }
+64
content/sports/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "sports", 4 + "title": "Sports & Hobbies", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Basketball' mean in Tagalog?", 10 + "promptAudio": false, 11 + "choices": ["Basketball (same word)", "Football", "Baseball", "Tennis"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the sports and hobbies", 17 + "pairs": [ 18 + { "left": "Basketball", "right": "Basketball" }, 19 + { "left": "Paglangoy", "right": "Swimming" }, 20 + { "left": "Pagtakbo", "right": "Running" }, 21 + { "left": "Pagbibisikleta", "right": "Cycling" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Mahilig akong maglaro ng basketball'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["I like to play basketball", "i like to play basketball", "I like playing basketball", "I enjoy playing basketball"], 29 + "hint": "'Mahilig' means 'to like/enjoy' and 'maglaro' means 'to play'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I like swimming", 34 + "sentence": "Mahilig akong ___.", 35 + "blank": "lumangoy", 36 + "hint": "An activity you do in water", 37 + "wordBank": ["lumangoy", "tumakbo", "maglaro", "magluto"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more hobbies", 42 + "pairs": [ 43 + { "left": "Magluto", "right": "To cook" }, 44 + { "left": "Magbasa", "right": "To read" }, 45 + { "left": "Kumanta", "right": "To sing" }, 46 + { "left": "Sumayaw", "right": "To dance" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "How do you say 'hobby' in Tagalog?", 52 + "promptAudio": false, 53 + "choices": ["Libangan", "Trabaho", "Laro", "Araw"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I like to play' in Tagalog", 59 + "phrase": "Mahilig akong maglaro", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["mahilig akong maglaro"] 62 + } 63 + ] 64 + }
+64
content/time/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "time", 4 + "title": "Telling Time", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Anong oras na?' mean?", 10 + "promptAudio": true, 11 + "choices": ["What time is it?", "What day is it?", "How old are you?", "Where are you?"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the time expressions", 17 + "pairs": [ 18 + { "left": "Umaga", "right": "Morning" }, 19 + { "left": "Tanghali", "right": "Noon" }, 20 + { "left": "Hapon", "right": "Afternoon" }, 21 + { "left": "Gabi", "right": "Night" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Alas-otso na ng umaga'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["It's eight in the morning", "It is eight in the morning", "It's 8 in the morning", "8 o'clock in the morning"], 29 + "hint": "'Alas-otso' means 'eight o'clock'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "It is already noon", 34 + "sentence": "___ na.", 35 + "blank": "Tanghali", 36 + "hint": "The time of day around 12 PM", 37 + "wordBank": ["Tanghali", "Umaga", "Hapon", "Gabi"] 38 + }, 39 + { 40 + "type": "multiple-choice", 41 + "prompt": "How do you say 'early' in Tagalog?", 42 + "promptAudio": false, 43 + "choices": ["Maaga", "Huli", "Ngayon", "Mamaya"], 44 + "correctIndex": 0 45 + }, 46 + { 47 + "type": "matching-pairs", 48 + "prompt": "Match time-related words", 49 + "pairs": [ 50 + { "left": "Maaga", "right": "Early" }, 51 + { "left": "Huli", "right": "Late" }, 52 + { "left": "Ngayon", "right": "Now" }, 53 + { "left": "Mamaya", "right": "Later" } 54 + ] 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Ask 'What time is it?' in Tagalog", 59 + "phrase": "Anong oras na?", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["anong oras na"] 62 + } 63 + ] 64 + }
+239 -11
content/topics.json
··· 1 1 { 2 + "sections": [ 3 + { "id": 1, "name": "Foundations", "description": "Build your Tagalog base" }, 4 + { "id": 2, "name": "Expanding", "description": "Grow your vocabulary and grammar" }, 5 + { "id": 3, "name": "Practical", "description": "Real-world conversations" }, 6 + { "id": 4, "name": "Further Learning", "description": "Advanced topics and culture" } 7 + ], 2 8 "topics": [ 3 9 { 4 10 "id": "greetings", 5 11 "name": "Greetings", 6 12 "icon": "👋", 7 13 "description": "Learn basic Tagalog greetings and introductions", 14 + "section": 1, 8 15 "prerequisites": [], 9 16 "lessons": ["lesson-01", "lesson-02"] 10 17 }, ··· 13 20 "name": "Basics", 14 21 "icon": "📚", 15 22 "description": "Essential words and phrases", 23 + "section": 1, 16 24 "prerequisites": ["greetings"], 17 25 "lessons": ["lesson-01", "lesson-02"] 18 26 }, 19 27 { 20 - "id": "food", 21 - "name": "Food", 22 - "icon": "🍜", 23 - "description": "Food, drinks, and dining vocabulary", 28 + "id": "intro", 29 + "name": "Introductions", 30 + "icon": "🙋", 31 + "description": "Introduce yourself and meet others", 32 + "section": 1, 24 33 "prerequisites": ["basics"], 25 34 "lessons": ["lesson-01"] 26 35 }, 27 36 { 37 + "id": "courtesy", 38 + "name": "Being Polite", 39 + "icon": "🙏", 40 + "description": "Polite expressions and respect words", 41 + "section": 1, 42 + "prerequisites": ["intro"], 43 + "lessons": ["lesson-01"] 44 + }, 45 + { 46 + "id": "numbers", 47 + "name": "Numbers", 48 + "icon": "🔢", 49 + "description": "Counting and numbers in Tagalog", 50 + "section": 1, 51 + "prerequisites": ["courtesy"], 52 + "lessons": ["lesson-01"] 53 + }, 54 + { 55 + "id": "colors", 56 + "name": "Colors", 57 + "icon": "🎨", 58 + "description": "Learn the colors in Tagalog", 59 + "section": 1, 60 + "prerequisites": ["numbers"], 61 + "lessons": ["lesson-01"] 62 + }, 63 + { 28 64 "id": "family", 29 65 "name": "Family", 30 66 "icon": "👨‍👩‍👧‍👦", 31 67 "description": "Family members and relationships", 32 - "prerequisites": ["basics"], 68 + "section": 1, 69 + "prerequisites": ["colors"], 70 + "lessons": ["lesson-01"] 71 + }, 72 + { 73 + "id": "emotions", 74 + "name": "Feelings", 75 + "icon": "😊", 76 + "description": "Express your feelings and emotions", 77 + "section": 1, 78 + "prerequisites": ["family"], 79 + "lessons": ["lesson-01"] 80 + }, 81 + { 82 + "id": "adjectives", 83 + "name": "Describing", 84 + "icon": "📝", 85 + "description": "Describe things with adjectives", 86 + "section": 1, 87 + "prerequisites": ["emotions"], 88 + "lessons": ["lesson-01"] 89 + }, 90 + { 91 + "id": "body", 92 + "name": "Body Parts", 93 + "icon": "🦴", 94 + "description": "Learn the parts of the body", 95 + "section": 1, 96 + "prerequisites": ["adjectives"], 97 + "lessons": ["lesson-01"] 98 + }, 99 + { 100 + "id": "clothing", 101 + "name": "Clothing", 102 + "icon": "👕", 103 + "description": "Clothing and what you wear", 104 + "section": 1, 105 + "prerequisites": ["body"], 33 106 "lessons": ["lesson-01"] 34 107 }, 35 108 { 36 - "id": "numbers", 37 - "name": "Numbers", 38 - "icon": "🔢", 39 - "description": "Counting and numbers in Tagalog", 40 - "prerequisites": ["basics"], 109 + "id": "animals", 110 + "name": "Animals", 111 + "icon": "🐕", 112 + "description": "Common animals in Tagalog", 113 + "section": 1, 114 + "prerequisites": ["clothing"], 115 + "lessons": ["lesson-01"] 116 + }, 117 + { 118 + "id": "home", 119 + "name": "Home", 120 + "icon": "🏠", 121 + "description": "Around the house", 122 + "section": 1, 123 + "prerequisites": ["animals"], 124 + "lessons": ["lesson-01"] 125 + }, 126 + { 127 + "id": "nature", 128 + "name": "Nature", 129 + "icon": "🌿", 130 + "description": "Nature and the environment", 131 + "section": 1, 132 + "prerequisites": ["home"], 133 + "lessons": ["lesson-01"] 134 + }, 135 + { 136 + "id": "time", 137 + "name": "Time", 138 + "icon": "⏰", 139 + "description": "Telling time in Tagalog", 140 + "section": 1, 141 + "prerequisites": ["nature"], 142 + "lessons": ["lesson-01"] 143 + }, 144 + { 145 + "id": "days", 146 + "name": "Days & Months", 147 + "icon": "📅", 148 + "description": "Days of the week and months", 149 + "section": 1, 150 + "prerequisites": ["time"], 151 + "lessons": ["lesson-01"] 152 + }, 153 + { 154 + "id": "weather", 155 + "name": "Weather", 156 + "icon": "⛅", 157 + "description": "Talk about the weather", 158 + "section": 1, 159 + "prerequisites": ["days"], 160 + "lessons": ["lesson-01"] 161 + }, 162 + { 163 + "id": "verbs1", 164 + "name": "Actions", 165 + "icon": "🏃", 166 + "description": "Common everyday verbs", 167 + "section": 1, 168 + "prerequisites": ["weather"], 169 + "lessons": ["lesson-01"] 170 + }, 171 + { 172 + "id": "daily", 173 + "name": "Daily Routine", 174 + "icon": "📋", 175 + "description": "Talk about your daily activities", 176 + "section": 1, 177 + "prerequisites": ["verbs1"], 178 + "lessons": ["lesson-01"] 179 + }, 180 + { 181 + "id": "food", 182 + "name": "Food", 183 + "icon": "🍜", 184 + "description": "Food, drinks, and dining vocabulary", 185 + "section": 1, 186 + "prerequisites": ["daily"], 187 + "lessons": ["lesson-01"] 188 + }, 189 + { 190 + "id": "shopping", 191 + "name": "Shopping", 192 + "icon": "🛒", 193 + "description": "Shopping and money vocabulary", 194 + "section": 1, 195 + "prerequisites": ["food"], 196 + "lessons": ["lesson-01"] 197 + }, 198 + { 199 + "id": "market", 200 + "name": "At the Market", 201 + "icon": "🏪", 202 + "description": "Buying and selling at the market", 203 + "section": 1, 204 + "prerequisites": ["shopping"], 205 + "lessons": ["lesson-01"] 206 + }, 207 + { 208 + "id": "restaurant", 209 + "name": "Eating Out", 210 + "icon": "🍽️", 211 + "description": "Ordering food at restaurants", 212 + "section": 1, 213 + "prerequisites": ["market"], 214 + "lessons": ["lesson-01"] 215 + }, 216 + { 217 + "id": "school", 218 + "name": "School", 219 + "icon": "🏫", 220 + "description": "School and education vocabulary", 221 + "section": 1, 222 + "prerequisites": ["restaurant"], 223 + "lessons": ["lesson-01"] 224 + }, 225 + { 226 + "id": "jobs", 227 + "name": "Jobs", 228 + "icon": "💼", 229 + "description": "Occupations and work", 230 + "section": 1, 231 + "prerequisites": ["school"], 232 + "lessons": ["lesson-01"] 233 + }, 234 + { 235 + "id": "sports", 236 + "name": "Sports", 237 + "icon": "⚽", 238 + "description": "Sports and hobbies vocabulary", 239 + "section": 1, 240 + "prerequisites": ["jobs"], 241 + "lessons": ["lesson-01"] 242 + }, 243 + { 244 + "id": "health", 245 + "name": "Health", 246 + "icon": "🏥", 247 + "description": "Health and wellness vocabulary", 248 + "section": 1, 249 + "prerequisites": ["sports"], 250 + "lessons": ["lesson-01"] 251 + }, 252 + { 253 + "id": "directions", 254 + "name": "Directions", 255 + "icon": "🧭", 256 + "description": "Asking for and giving directions", 257 + "section": 1, 258 + "prerequisites": ["health"], 41 259 "lessons": ["lesson-01"] 42 260 }, 43 261 { ··· 45 263 "name": "Travel", 46 264 "icon": "✈️", 47 265 "description": "Travel phrases and directions", 48 - "prerequisites": ["food", "numbers"], 266 + "section": 1, 267 + "prerequisites": ["directions"], 268 + "lessons": ["lesson-01"] 269 + }, 270 + { 271 + "id": "phrases", 272 + "name": "Phrases", 273 + "icon": "💬", 274 + "description": "Common everyday phrases", 275 + "section": 1, 276 + "prerequisites": ["travel"], 49 277 "lessons": ["lesson-01"] 50 278 } 51 279 ]
+64
content/verbs1/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "verbs1", 4 + "title": "Common Actions", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Kumain' mean?", 10 + "promptAudio": true, 11 + "choices": ["To eat", "To drink", "To sleep", "To walk"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the Tagalog verbs with their English translations", 17 + "pairs": [ 18 + { "left": "Kumain", "right": "To eat" }, 19 + { "left": "Uminom", "right": "To drink" }, 20 + { "left": "Matulog", "right": "To sleep" }, 21 + { "left": "Maglakad", "right": "To walk" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Gusto kong kumain'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["I want to eat", "i want to eat"], 29 + "hint": "'Gusto ko' means 'I want' and 'kumain' means 'to eat'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "I want to sleep", 34 + "sentence": "Gusto kong ___.", 35 + "blank": "matulog", 36 + "hint": "What you do in bed at night", 37 + "wordBank": ["matulog", "kumain", "uminom", "maglakad"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more common verbs", 42 + "pairs": [ 43 + { "left": "Tumakbo", "right": "To run" }, 44 + { "left": "Magbasa", "right": "To read" }, 45 + { "left": "Magsulat", "right": "To write" }, 46 + { "left": "Magluto", "right": "To cook" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "What is the Tagalog word for 'to work'?", 52 + "promptAudio": false, 53 + "choices": ["Magtrabaho", "Maglaro", "Maglakad", "Matulog"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'I want to drink water' in Tagalog", 59 + "phrase": "Gusto kong uminom ng tubig", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["gusto kong uminom ng tubig"] 62 + } 63 + ] 64 + }
+64
content/weather/lesson-01.json
··· 1 + { 2 + "id": "lesson-01", 3 + "topicId": "weather", 4 + "title": "Weather & Seasons", 5 + "xpReward": 10, 6 + "exercises": [ 7 + { 8 + "type": "multiple-choice", 9 + "prompt": "What does 'Mainit' mean?", 10 + "promptAudio": true, 11 + "choices": ["Hot", "Cold", "Rainy", "Windy"], 12 + "correctIndex": 0 13 + }, 14 + { 15 + "type": "matching-pairs", 16 + "prompt": "Match the weather words", 17 + "pairs": [ 18 + { "left": "Mainit", "right": "Hot" }, 19 + { "left": "Malamig", "right": "Cold" }, 20 + { "left": "Maulan", "right": "Rainy" }, 21 + { "left": "Mahangin", "right": "Windy" } 22 + ] 23 + }, 24 + { 25 + "type": "translation", 26 + "prompt": "Translate to English: 'Maulan ngayon'", 27 + "promptAudio": true, 28 + "acceptedAnswers": ["It's rainy today", "it's rainy today", "It is rainy today", "It's raining today", "Rainy today"], 29 + "hint": "'Maulan' means 'rainy' and 'ngayon' means 'today'" 30 + }, 31 + { 32 + "type": "fill-in-the-blank", 33 + "prompt": "It's hot today", 34 + "sentence": "___ ngayon.", 35 + "blank": "Mainit", 36 + "hint": "The opposite of 'malamig'", 37 + "wordBank": ["Mainit", "Malamig", "Maulan", "Maulap"] 38 + }, 39 + { 40 + "type": "matching-pairs", 41 + "prompt": "Match more weather words", 42 + "pairs": [ 43 + { "left": "Maulap", "right": "Cloudy" }, 44 + { "left": "Maaraw", "right": "Sunny" }, 45 + { "left": "Bagyo", "right": "Typhoon / Storm" }, 46 + { "left": "Kidlat", "right": "Lightning" } 47 + ] 48 + }, 49 + { 50 + "type": "multiple-choice", 51 + "prompt": "How do you ask 'What is the weather like?' in Tagalog?", 52 + "promptAudio": false, 53 + "choices": ["Kumusta ang panahon?", "Anong oras na?", "Saan ka pupunta?", "Ano ang pangalan mo?"], 54 + "correctIndex": 0 55 + }, 56 + { 57 + "type": "speak", 58 + "prompt": "Say 'It's sunny today' in Tagalog", 59 + "phrase": "Maaraw ngayon", 60 + "promptAudio": true, 61 + "acceptedAnswers": ["maaraw ngayon"] 62 + } 63 + ] 64 + }
+6 -1
web/src/content/loader.ts
··· 1 - import type { Lesson, TopicsConfig, Topic } from '../types/lesson'; 1 + import type { Lesson, TopicsConfig, Topic, Section } from '../types/lesson'; 2 2 3 3 const modules = import.meta.glob('../../../content/**/*.json', { eager: true }); 4 4 ··· 8 8 // Vite eager imports have a `default` property for JSON files 9 9 const mod = entry as { default?: T } & T; 10 10 return mod.default ?? (entry as T); 11 + } 12 + 13 + export function getSections(): Section[] { 14 + const config = getModule<TopicsConfig>('../../../content/topics.json'); 15 + return config?.sections ?? []; 11 16 } 12 17 13 18 export function getTopics(): Topic[] {
+85 -6
web/src/pages/HomePage.tsx
··· 4 4 import Typography from '@mui/material/Typography'; 5 5 import CircularProgress from '@mui/material/CircularProgress'; 6 6 import { useProgress } from '../hooks/useProgress'; 7 - import { getTopics, getLessonsForTopic } from '../content/loader'; 7 + import { getTopics, getSections, getLessonsForTopic } from '../content/loader'; 8 8 import { SkillNode } from '../components/home/SkillNode'; 9 9 import { StreakBanner } from '../components/home/StreakBanner'; 10 10 import { Rambi } from '../components/mascot/Rambi'; 11 11 12 12 // Vertical spacing between nodes 13 13 const NODE_GAP = 120; 14 + // Height reserved for a section banner 15 + const SECTION_BANNER_HEIGHT = 70; 14 16 // Max horizontal offset from center for the sine wave 15 17 const WAVE_AMPLITUDE = 80; 16 18 // How wide the path container is ··· 20 22 const navigate = useNavigate(); 21 23 const { progress, loading } = useProgress(); 22 24 const topics = useMemo(() => getTopics(), []); 25 + const sections = useMemo(() => getSections(), []); 23 26 24 27 const completedLessonIds = useMemo(() => { 25 28 if (!progress) return new Set<string>(); ··· 76 79 return Math.sin(index * 0.9) * WAVE_AMPLITUDE; 77 80 } 78 81 79 - // Node center positions for the SVG path 82 + // Build layout items: section banners + topic nodes with computed Y positions 83 + const sectionMap = useMemo(() => { 84 + const map = new Map<number, { name: string; description: string }>(); 85 + for (const s of sections) { 86 + map.set(s.id, { name: s.name, description: s.description }); 87 + } 88 + return map; 89 + }, [sections]); 90 + 91 + // Compute Y offset for each topic, inserting section banner space before each section 92 + const { topicYPositions, sectionBannerPositions, totalHeight } = useMemo(() => { 93 + const yPositions: number[] = []; 94 + const bannerPositions: { y: number; sectionId: number }[] = []; 95 + let currentY = 0; 96 + let seenSections = new Set<number>(); 97 + 98 + for (let i = 0; i < topics.length; i++) { 99 + const topic = topics[i]; 100 + if (!seenSections.has(topic.section)) { 101 + seenSections.add(topic.section); 102 + if (sectionMap.has(topic.section)) { 103 + bannerPositions.push({ y: currentY, sectionId: topic.section }); 104 + currentY += SECTION_BANNER_HEIGHT; 105 + } 106 + } 107 + yPositions.push(currentY); 108 + currentY += NODE_GAP; 109 + } 110 + 111 + return { 112 + topicYPositions: yPositions, 113 + sectionBannerPositions: bannerPositions, 114 + totalHeight: currentY + 60, 115 + }; 116 + }, [topics, sectionMap]); 117 + 118 + // Node center positions for the SVG path (accounting for section banners) 80 119 const nodePositions = topics.map((_, i) => ({ 81 120 x: PATH_WIDTH / 2 + getNodeX(i), 82 - y: 45 + i * NODE_GAP, // 45 = RING_SIZE/2 121 + y: topicYPositions[i] + 45, // 45 = RING_SIZE/2 83 122 })); 84 123 85 124 // Build a smooth curve through all node positions ··· 96 135 return d; 97 136 } 98 137 99 - const totalHeight = topics.length * NODE_GAP + 60; 100 - 101 138 if (loading) { 102 139 return ( 103 140 <Box ··· 173 210 /> 174 211 </svg> 175 212 213 + {/* Section banners */} 214 + {sectionBannerPositions.map(({ y, sectionId }) => { 215 + const section = sectionMap.get(sectionId); 216 + if (!section) return null; 217 + return ( 218 + <Box 219 + key={`section-${sectionId}`} 220 + sx={{ 221 + position: 'absolute', 222 + top: y, 223 + left: 0, 224 + right: 0, 225 + display: 'flex', 226 + alignItems: 'center', 227 + justifyContent: 'center', 228 + height: SECTION_BANNER_HEIGHT, 229 + }} 230 + > 231 + <Box 232 + sx={{ 233 + bgcolor: 'rgba(206, 130, 255, 0.12)', 234 + border: '1px solid rgba(206, 130, 255, 0.3)', 235 + borderRadius: 3, 236 + px: 3, 237 + py: 1, 238 + textAlign: 'center', 239 + }} 240 + > 241 + <Typography 242 + variant="body2" 243 + sx={{ color: '#CE82FF', fontWeight: 700, lineHeight: 1.3 }} 244 + > 245 + Section {sectionId}: {section.name} 246 + </Typography> 247 + <Typography variant="caption" sx={{ color: 'text.secondary' }}> 248 + {section.description} 249 + </Typography> 250 + </Box> 251 + </Box> 252 + ); 253 + })} 254 + 176 255 {/* Nodes */} 177 256 {topics.map((topic, i) => { 178 257 const totalLessons = getLessonsForTopic(topic.id).length; ··· 186 265 key={topic.id} 187 266 sx={{ 188 267 position: 'absolute', 189 - top: i * NODE_GAP, 268 + top: topicYPositions[i], 190 269 left: '50%', 191 270 transform: `translateX(calc(-50% + ${x}px))`, 192 271 }}
+8
web/src/types/lesson.ts
··· 62 62 name: string; 63 63 icon: string; 64 64 description: string; 65 + section: number; 65 66 prerequisites: string[]; 66 67 lessons: string[]; 67 68 } 68 69 70 + export interface Section { 71 + id: number; 72 + name: string; 73 + description: string; 74 + } 75 + 69 76 export interface TopicsConfig { 77 + sections: Section[]; 70 78 topics: Topic[]; 71 79 }