@syllst/th 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-4uNMctdq.js → index-DdRhLqkM.js} +2 -2
- package/dist/{index-4uNMctdq.js.map → index-DdRhLqkM.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/{lesson-03-CoDPKwa1.js → lesson-03-Bj5hWZ9t.js} +7 -7
- package/dist/lesson-03-Bj5hWZ9t.js.map +1 -0
- package/dist/syllabi/alphabet/index.js +1 -1
- package/package.json +8 -7
- package/src/syllabi/alphabet/lessons/lesson-03.mdx +6 -6
- package/dist/lesson-03-CoDPKwa1.js.map +0 -1
|
@@ -40,7 +40,7 @@ async function l(t) {
|
|
|
40
40
|
case 2:
|
|
41
41
|
return import("./lesson-02-CbJJ5Amt.js");
|
|
42
42
|
case 3:
|
|
43
|
-
return import("./lesson-03-
|
|
43
|
+
return import("./lesson-03-Bj5hWZ9t.js");
|
|
44
44
|
case 4:
|
|
45
45
|
return import("./lesson-04-BLuPI1-X.js");
|
|
46
46
|
case 5:
|
|
@@ -79,4 +79,4 @@ export {
|
|
|
79
79
|
d as i,
|
|
80
80
|
o as l
|
|
81
81
|
};
|
|
82
|
-
//# sourceMappingURL=index-
|
|
82
|
+
//# sourceMappingURL=index-DdRhLqkM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-DdRhLqkM.js","sources":["../src/shared.ts","../src/syllabi/alphabet/index.ts"],"sourcesContent":["/**\n * Shared types and utilities for SYLLST content\n * (Inlined from @syllst/content-shared to make package self-contained)\n */\n\n/**\n * CEFR language proficiency levels\n */\nexport type CEFRLevel = 'A1' | 'A2' | 'B1' | 'B2' | 'C1' | 'C2';\n\n/**\n * Difficulty levels\n */\nexport type Difficulty = 'beginner' | 'intermediate' | 'advanced';\n\n/**\n * Icon types for syllabi\n */\nexport type SyllabusIcon =\n | 'alphabet'\n | 'dialogue'\n | 'vocabulary'\n | 'grammar'\n | 'reading'\n | 'numbers'\n | 'food'\n | 'travel';\n\n/**\n * Configuration for a syllabus content package\n */\nexport interface SyllabusConfig {\n /** Unique syllabus ID (e.g., \"th-alphabet\") */\n id: string;\n /** Display title */\n title: string;\n /** Description */\n description: string;\n /** Language code (ISO 639-1) */\n language: string;\n /** Locale code (e.g., \"th-TH\") */\n locale: string;\n /** Number of lessons */\n lessonCount: number;\n /** Difficulty level */\n difficulty: Difficulty;\n /** CEFR level */\n cefrLevel: CEFRLevel;\n /** Icon for display */\n icon?: SyllabusIcon;\n /** Package version */\n version: string;\n}\n\n/**\n * Result of loading a lesson\n */\nexport interface LoadedLesson {\n /** Lesson number (1-indexed) */\n number: number;\n /** Raw MDX content */\n rawContent: string;\n}\n\n/**\n * Content loader interface\n */\nexport interface ContentLoader {\n /** Syllabus configuration */\n config: SyllabusConfig;\n /** Load a single lesson by number */\n loadLesson(lessonNumber: number): Promise<LoadedLesson>;\n /** Load all lessons */\n loadAllLessons(): Promise<LoadedLesson[]>;\n /** Get list of available lesson numbers */\n getAvailableLessons(): number[];\n}\n\n/**\n * Create a content loader from config and lesson loader function\n */\nexport function createContentLoader(\n config: SyllabusConfig,\n loadLessonMDX: (lessonNumber: number) => Promise<{ default: string }>\n): ContentLoader {\n return {\n config,\n\n async loadLesson(lessonNumber: number): Promise<LoadedLesson> {\n if (lessonNumber < 1 || lessonNumber > config.lessonCount) {\n throw new Error(`Lesson ${lessonNumber} not found. Valid range: 1-${config.lessonCount}`);\n }\n const module = await loadLessonMDX(lessonNumber);\n return {\n number: lessonNumber,\n rawContent: module.default,\n };\n },\n\n async loadAllLessons(): Promise<LoadedLesson[]> {\n const lessons: LoadedLesson[] = [];\n for (let i = 1; i <= config.lessonCount; i++) {\n lessons.push(await this.loadLesson(i));\n }\n return lessons;\n },\n\n getAvailableLessons(): number[] {\n return Array.from({ length: config.lessonCount }, (_, i) => i + 1);\n },\n };\n}\n","/**\n * Thai Alphabet syllabus\n */\n\nimport { createContentLoader, type SyllabusConfig, type ContentLoader } from '../../shared.js';\n\nexport const config: SyllabusConfig = {\n id: 'th-alphabet',\n title: 'อักษรไทย (Thai Alphabet)',\n description: 'Learn the Thai writing system - consonants, vowels, and tone marks',\n language: 'th',\n locale: 'th-TH',\n lessonCount: 12,\n difficulty: 'beginner',\n cefrLevel: 'A1',\n icon: 'alphabet',\n version: '0.1.0',\n};\n\nasync function loadLessonMDX(lessonNumber: number) {\n switch (lessonNumber) {\n case 1: return import('./lessons/lesson-01.mdx?raw');\n case 2: return import('./lessons/lesson-02.mdx?raw');\n case 3: return import('./lessons/lesson-03.mdx?raw');\n case 4: return import('./lessons/lesson-04.mdx?raw');\n case 5: return import('./lessons/lesson-05.mdx?raw');\n case 6: return import('./lessons/lesson-06.mdx?raw');\n case 7: return import('./lessons/lesson-07.mdx?raw');\n case 8: return import('./lessons/lesson-08.mdx?raw');\n case 9: return import('./lessons/lesson-09.mdx?raw');\n case 10: return import('./lessons/lesson-10.mdx?raw');\n case 11: return import('./lessons/lesson-11.mdx?raw');\n case 12: return import('./lessons/lesson-12.mdx?raw');\n default: throw new Error(`Lesson ${lessonNumber} not found`);\n }\n}\n\nexport const loader: ContentLoader = createContentLoader(config, loadLessonMDX);\nexport const loadLesson = loader.loadLesson.bind(loader);\nexport const loadAllLessons = loader.loadAllLessons.bind(loader);\nexport const getAvailableLessons = loader.getAvailableLessons.bind(loader);\n"],"names":["createContentLoader","config","loadLessonMDX","lessonNumber","module","lessons","i","_","loader","loadLesson","loadAllLessons","getAvailableLessons"],"mappings":"AAiFO,SAASA,EACdC,GACAC,GACe;AACf,SAAO;AAAA,IACL,QAAAD;AAAA,IAEA,MAAM,WAAWE,GAA6C;AAC5D,UAAIA,IAAe,KAAKA,IAAeF,EAAO;AAC5C,cAAM,IAAI,MAAM,UAAUE,CAAY,8BAA8BF,EAAO,WAAW,EAAE;AAE1F,YAAMG,IAAS,MAAMF,EAAcC,CAAY;AAC/C,aAAO;AAAA,QACL,QAAQA;AAAA,QACR,YAAYC,EAAO;AAAA,MAAA;AAAA,IAEvB;AAAA,IAEA,MAAM,iBAA0C;AAC9C,YAAMC,IAA0B,CAAA;AAChC,eAASC,IAAI,GAAGA,KAAKL,EAAO,aAAaK;AACvC,QAAAD,EAAQ,KAAK,MAAM,KAAK,WAAWC,CAAC,CAAC;AAEvC,aAAOD;AAAA,IACT;AAAA,IAEA,sBAAgC;AAC9B,aAAO,MAAM,KAAK,EAAE,QAAQJ,EAAO,YAAA,GAAe,CAACM,GAAGD,MAAMA,IAAI,CAAC;AAAA,IACnE;AAAA,EAAA;AAEJ;ACzGO,MAAML,IAAyB;AAAA,EACpC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,SAAS;AACX;AAEA,eAAeC,EAAcC,GAAsB;AACjD,UAAQA,GAAA;AAAA,IACN,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAG,aAAO,OAAO,yBAA6B;AAAA,IACnD,KAAK;AAAI,aAAO,OAAO,yBAA6B;AAAA,IACpD,KAAK;AAAI,aAAO,OAAO,yBAA6B;AAAA,IACpD,KAAK;AAAI,aAAO,OAAO,yBAA6B;AAAA,IACpD;AAAS,YAAM,IAAI,MAAM,UAAUA,CAAY,YAAY;AAAA,EAAA;AAE/D;AAEO,MAAMK,IAAwBR,EAAoBC,GAAQC,CAAa,GACjEO,IAAaD,EAAO,WAAW,KAAKA,CAAM,GAC1CE,IAAiBF,EAAO,eAAe,KAAKA,CAAM,GAClDG,IAAsBH,EAAO,oBAAoB,KAAKA,CAAM;;;;;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as r } from "./index-
|
|
2
|
-
import { i as T, l as y } from "./index-
|
|
1
|
+
import { c as r } from "./index-DdRhLqkM.js";
|
|
2
|
+
import { i as T, l as y } from "./index-DdRhLqkM.js";
|
|
3
3
|
import { c as s } from "./index-DBkPBXe2.js";
|
|
4
4
|
import { i as I, l as j } from "./index-DBkPBXe2.js";
|
|
5
5
|
import { c as i } from "./index-BuKXw7-Z.js";
|
|
@@ -40,7 +40,7 @@ Put your hand in front of your mouth and say these English words:
|
|
|
40
40
|
|
|
41
41
|
That puff of air is called **aspiration**.
|
|
42
42
|
|
|
43
|
-
:::exercise{id="aspiration-check"
|
|
43
|
+
:::exercise{id="aspiration-check" type="multiple-choice" title="Quick Check" skill="character-sound-mapping" objectiveId="obj-aspiration"}
|
|
44
44
|
Which word has MORE air on the 'k' sound?
|
|
45
45
|
?options: kite, sky
|
|
46
46
|
?answer: 1
|
|
@@ -79,13 +79,13 @@ Each character has a memorable shape:
|
|
|
79
79
|
|
|
80
80
|
**ห** (box) — Looks like a box. หีบ means "chest/box" — the shape matches!
|
|
81
81
|
|
|
82
|
-
:::exercise{id="shape-match"
|
|
82
|
+
:::exercise{id="shape-match" type="multiple-choice" title="Match the Shape" skill="character-recognition" tests="egg" objectiveId="obj-high-consonants-1"}
|
|
83
83
|
Which letter looks like ก with an extra loop on top?
|
|
84
84
|
?options: ส, ข, ห
|
|
85
85
|
?answer: 2
|
|
86
86
|
:::
|
|
87
87
|
|
|
88
|
-
:::exercise{id="shape-match-2"
|
|
88
|
+
:::exercise{id="shape-match-2" type="multiple-choice" title="Match the Shape" skill="character-recognition" tests="tiger" objectiveId="obj-high-consonants-1"}
|
|
89
89
|
Which letter has an S-curve shape (like tiger stripes)?
|
|
90
90
|
?options: ข, ห, ส
|
|
91
91
|
?answer: 3
|
|
@@ -101,7 +101,7 @@ Thai consonants sound different depending on position:
|
|
|
101
101
|
| ส tiger | **s** | **t** (no release) |
|
|
102
102
|
| ห box | **h** | (not used) |
|
|
103
103
|
|
|
104
|
-
:::exercise{id="position-sound"
|
|
104
|
+
:::exercise{id="position-sound" type="multiple-choice" title="Position Check" skill="character-sound-mapping" tests="egg" objectiveId="obj-aspiration"}
|
|
105
105
|
At the START of a syllable, how is ข pronounced?
|
|
106
106
|
?options: k (no air), kh (with air puff), s
|
|
107
107
|
?answer: 2
|
|
@@ -122,7 +122,7 @@ Compare to middle-class ก (flat mid tone):
|
|
|
122
122
|
|
|
123
123
|
Same vowel, different consonant class = **different tone!**
|
|
124
124
|
|
|
125
|
-
:::exercise{id="tone-pattern"
|
|
125
|
+
:::exercise{id="tone-pattern" type="multiple-choice" title="Tone Check" skill="character-class-identification" objectiveId="obj-rising-tone"}
|
|
126
126
|
What tone do high-class consonants produce in simple syllables?
|
|
127
127
|
?options: falling tone ↘, mid tone →, rising tone ↗
|
|
128
128
|
?answer: 3
|
|
@@ -140,7 +140,7 @@ You learned 3 high-class consonants:
|
|
|
140
140
|
|
|
141
141
|
**Key insight:** High-class = aspirated (puff of air) + rising tone ↗
|
|
142
142
|
|
|
143
|
-
:::exercise{id="final-recognition"
|
|
143
|
+
:::exercise{id="final-recognition" type="multiple-choice" title="Final Check" skill="character-class-identification" objectiveId="obj-rising-tone"}
|
|
144
144
|
Which consonant class produces a rising tone?
|
|
145
145
|
?options: low-class, middle-class, high-class
|
|
146
146
|
?answer: 3
|
|
@@ -149,4 +149,4 @@ Which consonant class produces a rising tone?
|
|
|
149
149
|
export {
|
|
150
150
|
n as default
|
|
151
151
|
};
|
|
152
|
-
//# sourceMappingURL=lesson-03-
|
|
152
|
+
//# sourceMappingURL=lesson-03-Bj5hWZ9t.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lesson-03-Bj5hWZ9t.js","sources":["../src/syllabi/alphabet/lessons/lesson-03.mdx?raw"],"sourcesContent":["export default \"---\\ntype: lesson\\nid: thai-script-lesson-03\\ntitle: \\\"บทที่ 3 — พยัญชนะสูง I\\\"\\ndescription: \\\"High-Class Consonants Part 1: ข ส ห — The aspirated consonants\\\"\\norder: 3\\nparentId: thai-script-alphabet\\ndifficulty: beginner\\ncefrLevel: A1\\ncategories:\\n - consonants\\n - high-class\\n - aspirated\\n - basic-characters\\nmetadata:\\n estimatedTime: 20\\n prerequisites:\\n - thai-script-lesson-02\\n learningObjectives:\\n - id: obj-high-consonants-1\\n description: \\\"Learn 3 common high-class consonants\\\"\\n skill: character-recognition\\n references: [egg, tiger, box]\\n - id: obj-aspiration\\n description: \\\"Understand aspiration (puff of air)\\\"\\n skill: character-sound-mapping\\n - id: obj-rising-tone\\n description: \\\"Recognize the rising tone pattern\\\"\\n skill: character-class-identification\\n---\\n\\n# บทที่ 3 (Lesson 3) — High-Class Consonants I\\n\\n## Feel the Difference\\n\\nPut your hand in front of your mouth and say these English words:\\n\\n- \\\"**k**ite\\\" — feel the puff of air on \\\"k\\\"\\n- \\\"s**k**y\\\" — notice LESS air after \\\"s\\\"\\n\\nThat puff of air is called **aspiration**.\\n\\n:::exercise{id=\\\"aspiration-check\\\" type=\\\"multiple-choice\\\" title=\\\"Quick Check\\\" skill=\\\"character-sound-mapping\\\" objectiveId=\\\"obj-aspiration\\\"}\\nWhich word has MORE air on the 'k' sound?\\n?options: kite, sky\\n?answer: 1\\n:::\\n\\n## Why This Matters\\n\\nThai treats aspirated and unaspirated sounds as **completely different letters**:\\n\\n| Sound | Air | Thai Letter | Like English... |\\n|-------|-----|-------------|-----------------|\\n| Unaspirated k | none | ก | s**k**y |\\n| Aspirated k | puff | ข | **k**ite |\\n\\nYou already know **ก** (from Lesson 1). Now meet its aspirated partner:\\n\\n## The Characters\\n\\n:::character-set{id=\\\"thai-high-consonants-1\\\" title=\\\"High-Class Consonants I\\\"}\\n\\n::character{id=\\\"egg\\\" canonicalRef=\\\"egg\\\" data:class=\\\"high\\\" char=\\\"ข\\\" name=\\\"ข ไข่ (khɔ̌ɔ khài)\\\" nativeName=\\\"ข ไข่\\\" transliteration=\\\"kh/k\\\" charType=\\\"consonant\\\"}\\n\\n::character{id=\\\"tiger\\\" canonicalRef=\\\"tiger\\\" data:class=\\\"high\\\" char=\\\"ส\\\" name=\\\"ส เสือ (sɔ̌ɔ sʉ̌a)\\\" nativeName=\\\"ส เสือ\\\" transliteration=\\\"s/t\\\" charType=\\\"consonant\\\"}\\n\\n::character{id=\\\"box\\\" canonicalRef=\\\"box\\\" data:class=\\\"high\\\" char=\\\"ห\\\" name=\\\"ห หีบ (hɔ̌ɔ hìip)\\\" nativeName=\\\"ห หีบ\\\" transliteration=\\\"h/-\\\" charType=\\\"consonant\\\"}\\n\\n:::\\n\\n## Shape Recognition\\n\\nEach character has a memorable shape:\\n\\n**ข** (egg) — Looks like ก with an extra loop. The extra loop = extra air!\\n\\n**ส** (tiger) — Curvy S-shape, like tiger stripes.\\n\\n**ห** (box) — Looks like a box. หีบ means \\\"chest/box\\\" — the shape matches!\\n\\n:::exercise{id=\\\"shape-match\\\" type=\\\"multiple-choice\\\" title=\\\"Match the Shape\\\" skill=\\\"character-recognition\\\" tests=\\\"egg\\\" objectiveId=\\\"obj-high-consonants-1\\\"}\\nWhich letter looks like ก with an extra loop on top?\\n?options: ส, ข, ห\\n?answer: 2\\n:::\\n\\n:::exercise{id=\\\"shape-match-2\\\" type=\\\"multiple-choice\\\" title=\\\"Match the Shape\\\" skill=\\\"character-recognition\\\" tests=\\\"tiger\\\" objectiveId=\\\"obj-high-consonants-1\\\"}\\nWhich letter has an S-curve shape (like tiger stripes)?\\n?options: ข, ห, ส\\n?answer: 3\\n:::\\n\\n## Sound at Start vs End\\n\\nThai consonants sound different depending on position:\\n\\n| Letter | Start of syllable | End of syllable |\\n|--------|------------------|-----------------|\\n| ข egg | **kh** (with air) | **k** (no release) |\\n| ส tiger | **s** | **t** (no release) |\\n| ห box | **h** | (not used) |\\n\\n:::exercise{id=\\\"position-sound\\\" type=\\\"multiple-choice\\\" title=\\\"Position Check\\\" skill=\\\"character-sound-mapping\\\" tests=\\\"egg\\\" objectiveId=\\\"obj-aspiration\\\"}\\nAt the START of a syllable, how is ข pronounced?\\n?options: k (no air), kh (with air puff), s\\n?answer: 2\\n:::\\n\\n## The Rising Tone\\n\\nHere's something powerful: **consonant class determines tone**.\\n\\nHigh-class consonants + simple vowel = **rising tone** ↗\\n\\n- ข + า = **ขา** (khǎa) ↗ \\\"leg\\\"\\n- ส + ี = **สี** (sǐi) ↗ \\\"color\\\"\\n- ห + า = **หา** (hǎa) ↗ \\\"to find\\\"\\n\\nCompare to middle-class ก (flat mid tone):\\n- ก + า = **กา** (gaa) → \\\"crow\\\"\\n\\nSame vowel, different consonant class = **different tone!**\\n\\n:::exercise{id=\\\"tone-pattern\\\" type=\\\"multiple-choice\\\" title=\\\"Tone Check\\\" skill=\\\"character-class-identification\\\" objectiveId=\\\"obj-rising-tone\\\"}\\nWhat tone do high-class consonants produce in simple syllables?\\n?options: falling tone ↘, mid tone →, rising tone ↗\\n?answer: 3\\n:::\\n\\n## Summary\\n\\nYou learned 3 high-class consonants:\\n\\n| Char | Name | Sound | Remember |\\n|------|------|-------|----------|\\n| ข | egg (ไข่) | kh- | ก + loop = + air |\\n| ส | tiger (เสือ) | s- | S-curve shape |\\n| ห | box (หีบ) | h- | Looks like a box |\\n\\n**Key insight:** High-class = aspirated (puff of air) + rising tone ↗\\n\\n:::exercise{id=\\\"final-recognition\\\" type=\\\"multiple-choice\\\" title=\\\"Final Check\\\" skill=\\\"character-class-identification\\\" objectiveId=\\\"obj-rising-tone\\\"}\\nWhich consonant class produces a rising tone?\\n?options: low-class, middle-class, high-class\\n?answer: 3\\n:::\\n\""],"names":["lesson03"],"mappings":"AAAA,MAAAA,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syllst/th",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Thai SYLLST content - all Thai language syllabi in one package",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -54,14 +54,15 @@
|
|
|
54
54
|
"dependencies": {},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"tsx": "^4.7.0",
|
|
57
|
-
"vite": "^
|
|
58
|
-
"vite-plugin-dts": "^4.
|
|
59
|
-
"
|
|
60
|
-
"@
|
|
57
|
+
"vite": "^7.3.1",
|
|
58
|
+
"vite-plugin-dts": "^4.5.4",
|
|
59
|
+
"vitest": "^4.0.18",
|
|
60
|
+
"@laeng/th": "0.2.1",
|
|
61
|
+
"@syllst/content-shared": "0.2.1"
|
|
61
62
|
},
|
|
62
63
|
"peerDependencies": {
|
|
63
64
|
"@syllst/core": "^0.4.0",
|
|
64
|
-
"@syllst/processor": "^0.
|
|
65
|
+
"@syllst/processor": "^0.5.0"
|
|
65
66
|
},
|
|
66
67
|
"publishConfig": {
|
|
67
68
|
"access": "public"
|
|
@@ -85,7 +86,7 @@
|
|
|
85
86
|
"build": "vite build",
|
|
86
87
|
"clean": "rm -rf dist",
|
|
87
88
|
"lint": "eslint src",
|
|
88
|
-
"test": "vitest run",
|
|
89
|
+
"test": "vitest run --passWithNoTests",
|
|
89
90
|
"validate": "tsx scripts/validate-ids.ts"
|
|
90
91
|
}
|
|
91
92
|
}
|
|
@@ -40,7 +40,7 @@ Put your hand in front of your mouth and say these English words:
|
|
|
40
40
|
|
|
41
41
|
That puff of air is called **aspiration**.
|
|
42
42
|
|
|
43
|
-
:::exercise{id="aspiration-check"
|
|
43
|
+
:::exercise{id="aspiration-check" type="multiple-choice" title="Quick Check" skill="character-sound-mapping" objectiveId="obj-aspiration"}
|
|
44
44
|
Which word has MORE air on the 'k' sound?
|
|
45
45
|
?options: kite, sky
|
|
46
46
|
?answer: 1
|
|
@@ -79,13 +79,13 @@ Each character has a memorable shape:
|
|
|
79
79
|
|
|
80
80
|
**ห** (box) — Looks like a box. หีบ means "chest/box" — the shape matches!
|
|
81
81
|
|
|
82
|
-
:::exercise{id="shape-match"
|
|
82
|
+
:::exercise{id="shape-match" type="multiple-choice" title="Match the Shape" skill="character-recognition" tests="egg" objectiveId="obj-high-consonants-1"}
|
|
83
83
|
Which letter looks like ก with an extra loop on top?
|
|
84
84
|
?options: ส, ข, ห
|
|
85
85
|
?answer: 2
|
|
86
86
|
:::
|
|
87
87
|
|
|
88
|
-
:::exercise{id="shape-match-2"
|
|
88
|
+
:::exercise{id="shape-match-2" type="multiple-choice" title="Match the Shape" skill="character-recognition" tests="tiger" objectiveId="obj-high-consonants-1"}
|
|
89
89
|
Which letter has an S-curve shape (like tiger stripes)?
|
|
90
90
|
?options: ข, ห, ส
|
|
91
91
|
?answer: 3
|
|
@@ -101,7 +101,7 @@ Thai consonants sound different depending on position:
|
|
|
101
101
|
| ส tiger | **s** | **t** (no release) |
|
|
102
102
|
| ห box | **h** | (not used) |
|
|
103
103
|
|
|
104
|
-
:::exercise{id="position-sound"
|
|
104
|
+
:::exercise{id="position-sound" type="multiple-choice" title="Position Check" skill="character-sound-mapping" tests="egg" objectiveId="obj-aspiration"}
|
|
105
105
|
At the START of a syllable, how is ข pronounced?
|
|
106
106
|
?options: k (no air), kh (with air puff), s
|
|
107
107
|
?answer: 2
|
|
@@ -122,7 +122,7 @@ Compare to middle-class ก (flat mid tone):
|
|
|
122
122
|
|
|
123
123
|
Same vowel, different consonant class = **different tone!**
|
|
124
124
|
|
|
125
|
-
:::exercise{id="tone-pattern"
|
|
125
|
+
:::exercise{id="tone-pattern" type="multiple-choice" title="Tone Check" skill="character-class-identification" objectiveId="obj-rising-tone"}
|
|
126
126
|
What tone do high-class consonants produce in simple syllables?
|
|
127
127
|
?options: falling tone ↘, mid tone →, rising tone ↗
|
|
128
128
|
?answer: 3
|
|
@@ -140,7 +140,7 @@ You learned 3 high-class consonants:
|
|
|
140
140
|
|
|
141
141
|
**Key insight:** High-class = aspirated (puff of air) + rising tone ↗
|
|
142
142
|
|
|
143
|
-
:::exercise{id="final-recognition"
|
|
143
|
+
:::exercise{id="final-recognition" type="multiple-choice" title="Final Check" skill="character-class-identification" objectiveId="obj-rising-tone"}
|
|
144
144
|
Which consonant class produces a rising tone?
|
|
145
145
|
?options: low-class, middle-class, high-class
|
|
146
146
|
?answer: 3
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lesson-03-CoDPKwa1.js","sources":["../src/syllabi/alphabet/lessons/lesson-03.mdx?raw"],"sourcesContent":["export default \"---\\ntype: lesson\\nid: thai-script-lesson-03\\ntitle: \\\"บทที่ 3 — พยัญชนะสูง I\\\"\\ndescription: \\\"High-Class Consonants Part 1: ข ส ห — The aspirated consonants\\\"\\norder: 3\\nparentId: thai-script-alphabet\\ndifficulty: beginner\\ncefrLevel: A1\\ncategories:\\n - consonants\\n - high-class\\n - aspirated\\n - basic-characters\\nmetadata:\\n estimatedTime: 20\\n prerequisites:\\n - thai-script-lesson-02\\n learningObjectives:\\n - id: obj-high-consonants-1\\n description: \\\"Learn 3 common high-class consonants\\\"\\n skill: character-recognition\\n references: [egg, tiger, box]\\n - id: obj-aspiration\\n description: \\\"Understand aspiration (puff of air)\\\"\\n skill: character-sound-mapping\\n - id: obj-rising-tone\\n description: \\\"Recognize the rising tone pattern\\\"\\n skill: character-class-identification\\n---\\n\\n# บทที่ 3 (Lesson 3) — High-Class Consonants I\\n\\n## Feel the Difference\\n\\nPut your hand in front of your mouth and say these English words:\\n\\n- \\\"**k**ite\\\" — feel the puff of air on \\\"k\\\"\\n- \\\"s**k**y\\\" — notice LESS air after \\\"s\\\"\\n\\nThat puff of air is called **aspiration**.\\n\\n:::exercise{id=\\\"aspiration-check\\\" exerciseType=\\\"multiple-choice\\\" title=\\\"Quick Check\\\" skill=\\\"character-sound-mapping\\\" objectiveId=\\\"obj-aspiration\\\"}\\nWhich word has MORE air on the 'k' sound?\\n?options: kite, sky\\n?answer: 1\\n:::\\n\\n## Why This Matters\\n\\nThai treats aspirated and unaspirated sounds as **completely different letters**:\\n\\n| Sound | Air | Thai Letter | Like English... |\\n|-------|-----|-------------|-----------------|\\n| Unaspirated k | none | ก | s**k**y |\\n| Aspirated k | puff | ข | **k**ite |\\n\\nYou already know **ก** (from Lesson 1). Now meet its aspirated partner:\\n\\n## The Characters\\n\\n:::character-set{id=\\\"thai-high-consonants-1\\\" title=\\\"High-Class Consonants I\\\"}\\n\\n::character{id=\\\"egg\\\" canonicalRef=\\\"egg\\\" data:class=\\\"high\\\" char=\\\"ข\\\" name=\\\"ข ไข่ (khɔ̌ɔ khài)\\\" nativeName=\\\"ข ไข่\\\" transliteration=\\\"kh/k\\\" charType=\\\"consonant\\\"}\\n\\n::character{id=\\\"tiger\\\" canonicalRef=\\\"tiger\\\" data:class=\\\"high\\\" char=\\\"ส\\\" name=\\\"ส เสือ (sɔ̌ɔ sʉ̌a)\\\" nativeName=\\\"ส เสือ\\\" transliteration=\\\"s/t\\\" charType=\\\"consonant\\\"}\\n\\n::character{id=\\\"box\\\" canonicalRef=\\\"box\\\" data:class=\\\"high\\\" char=\\\"ห\\\" name=\\\"ห หีบ (hɔ̌ɔ hìip)\\\" nativeName=\\\"ห หีบ\\\" transliteration=\\\"h/-\\\" charType=\\\"consonant\\\"}\\n\\n:::\\n\\n## Shape Recognition\\n\\nEach character has a memorable shape:\\n\\n**ข** (egg) — Looks like ก with an extra loop. The extra loop = extra air!\\n\\n**ส** (tiger) — Curvy S-shape, like tiger stripes.\\n\\n**ห** (box) — Looks like a box. หีบ means \\\"chest/box\\\" — the shape matches!\\n\\n:::exercise{id=\\\"shape-match\\\" exerciseType=\\\"multiple-choice\\\" title=\\\"Match the Shape\\\" skill=\\\"character-recognition\\\" tests=\\\"egg\\\" objectiveId=\\\"obj-high-consonants-1\\\"}\\nWhich letter looks like ก with an extra loop on top?\\n?options: ส, ข, ห\\n?answer: 2\\n:::\\n\\n:::exercise{id=\\\"shape-match-2\\\" exerciseType=\\\"multiple-choice\\\" title=\\\"Match the Shape\\\" skill=\\\"character-recognition\\\" tests=\\\"tiger\\\" objectiveId=\\\"obj-high-consonants-1\\\"}\\nWhich letter has an S-curve shape (like tiger stripes)?\\n?options: ข, ห, ส\\n?answer: 3\\n:::\\n\\n## Sound at Start vs End\\n\\nThai consonants sound different depending on position:\\n\\n| Letter | Start of syllable | End of syllable |\\n|--------|------------------|-----------------|\\n| ข egg | **kh** (with air) | **k** (no release) |\\n| ส tiger | **s** | **t** (no release) |\\n| ห box | **h** | (not used) |\\n\\n:::exercise{id=\\\"position-sound\\\" exerciseType=\\\"multiple-choice\\\" title=\\\"Position Check\\\" skill=\\\"character-sound-mapping\\\" tests=\\\"egg\\\" objectiveId=\\\"obj-aspiration\\\"}\\nAt the START of a syllable, how is ข pronounced?\\n?options: k (no air), kh (with air puff), s\\n?answer: 2\\n:::\\n\\n## The Rising Tone\\n\\nHere's something powerful: **consonant class determines tone**.\\n\\nHigh-class consonants + simple vowel = **rising tone** ↗\\n\\n- ข + า = **ขา** (khǎa) ↗ \\\"leg\\\"\\n- ส + ี = **สี** (sǐi) ↗ \\\"color\\\"\\n- ห + า = **หา** (hǎa) ↗ \\\"to find\\\"\\n\\nCompare to middle-class ก (flat mid tone):\\n- ก + า = **กา** (gaa) → \\\"crow\\\"\\n\\nSame vowel, different consonant class = **different tone!**\\n\\n:::exercise{id=\\\"tone-pattern\\\" exerciseType=\\\"multiple-choice\\\" title=\\\"Tone Check\\\" skill=\\\"character-class-identification\\\" objectiveId=\\\"obj-rising-tone\\\"}\\nWhat tone do high-class consonants produce in simple syllables?\\n?options: falling tone ↘, mid tone →, rising tone ↗\\n?answer: 3\\n:::\\n\\n## Summary\\n\\nYou learned 3 high-class consonants:\\n\\n| Char | Name | Sound | Remember |\\n|------|------|-------|----------|\\n| ข | egg (ไข่) | kh- | ก + loop = + air |\\n| ส | tiger (เสือ) | s- | S-curve shape |\\n| ห | box (หีบ) | h- | Looks like a box |\\n\\n**Key insight:** High-class = aspirated (puff of air) + rising tone ↗\\n\\n:::exercise{id=\\\"final-recognition\\\" exerciseType=\\\"multiple-choice\\\" title=\\\"Final Check\\\" skill=\\\"character-class-identification\\\" objectiveId=\\\"obj-rising-tone\\\"}\\nWhich consonant class produces a rising tone?\\n?options: low-class, middle-class, high-class\\n?answer: 3\\n:::\\n\""],"names":["lesson03"],"mappings":"AAAA,MAAAA,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
|