@syllst/th 0.1.3 → 0.2.0
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-of_athp-.js → index-4uNMctdq.js} +13 -13
- package/dist/{index-of_athp-.js.map → index-4uNMctdq.js.map} +1 -1
- package/dist/{index-Dy38Hmlm.js → index-BM-LWlCm.js} +10 -10
- package/dist/{index-Dy38Hmlm.js.map → index-BM-LWlCm.js.map} +1 -1
- package/dist/{index-CTQ45BVw.js → index-Bjym0crS.js} +8 -8
- package/dist/{index-CTQ45BVw.js.map → index-Bjym0crS.js.map} +1 -1
- package/dist/{index-B029m98V.js → index-BuKXw7-Z.js} +7 -7
- package/dist/{index-B029m98V.js.map → index-BuKXw7-Z.js.map} +1 -1
- package/dist/{index-CoqP9GZL.js → index-ByS0o5dz.js} +10 -10
- package/dist/{index-CoqP9GZL.js.map → index-ByS0o5dz.js.map} +1 -1
- package/dist/{index-BCA5Llwg.js → index-C9VnG7dT.js} +10 -10
- package/dist/{index-BCA5Llwg.js.map → index-C9VnG7dT.js.map} +1 -1
- package/dist/{index-vuRo2mLK.js → index-CPQkjFjV.js} +9 -9
- package/dist/{index-vuRo2mLK.js.map → index-CPQkjFjV.js.map} +1 -1
- package/dist/{index-BFcg5D_W.js → index-CkHd3Fal.js} +12 -12
- package/dist/{index-BFcg5D_W.js.map → index-CkHd3Fal.js.map} +1 -1
- package/dist/{index-CB8M6CK6.js → index-DBkPBXe2.js} +10 -10
- package/dist/{index-CB8M6CK6.js.map → index-DBkPBXe2.js.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +18 -18
- package/dist/{lesson-01--9NOyHZ6.js → lesson-01-B0wtSaSl.js} +21 -9
- package/dist/lesson-01-B0wtSaSl.js.map +1 -0
- package/dist/{lesson-01-97FtYE6g.js → lesson-01-C9vbUlA4.js} +14 -6
- package/dist/lesson-01-C9vbUlA4.js.map +1 -0
- package/dist/{lesson-01-CF4tJfZ3.js → lesson-01-CPmBFTe0.js} +28 -16
- package/dist/lesson-01-CPmBFTe0.js.map +1 -0
- package/dist/{lesson-01-3hBted4A.js → lesson-01-Cc4Ws8eR.js} +25 -14
- package/dist/lesson-01-Cc4Ws8eR.js.map +1 -0
- package/dist/{lesson-01-BYKAZiua.js → lesson-01-Cm5k-m-9.js} +14 -8
- package/dist/lesson-01-Cm5k-m-9.js.map +1 -0
- package/dist/{lesson-01-WV3ic8Ok.js → lesson-01-DELblCNj.js} +11 -5
- package/dist/lesson-01-DELblCNj.js.map +1 -0
- package/dist/{lesson-01-CRx-yw4C.js → lesson-01-Djl_72e7.js} +14 -6
- package/dist/lesson-01-Djl_72e7.js.map +1 -0
- package/dist/{lesson-01-BhjY6ArF.js → lesson-01-LEHTeGQQ.js} +17 -9
- package/dist/lesson-01-LEHTeGQQ.js.map +1 -0
- package/dist/{lesson-01-BNdHXAGR.js → lesson-01-ih_-OO_O.js} +14 -6
- package/dist/lesson-01-ih_-OO_O.js.map +1 -0
- package/dist/{lesson-02-C8dfzXvq.js → lesson-02-B2aZrKUQ.js} +14 -6
- package/dist/lesson-02-B2aZrKUQ.js.map +1 -0
- package/dist/{lesson-02-C2ALLvoT.js → lesson-02-BI1Vnwiz.js} +17 -9
- package/dist/lesson-02-BI1Vnwiz.js.map +1 -0
- package/dist/{lesson-02-BGnp0Ik_.js → lesson-02-BXbwEMaL.js} +27 -15
- package/dist/lesson-02-BXbwEMaL.js.map +1 -0
- package/dist/{lesson-02-BAbq-QGP.js → lesson-02-CbJJ5Amt.js} +24 -14
- package/dist/lesson-02-CbJJ5Amt.js.map +1 -0
- package/dist/{lesson-02-Bm9EJuN8.js → lesson-02-DGrALAgG.js} +21 -9
- package/dist/lesson-02-DGrALAgG.js.map +1 -0
- package/dist/{lesson-02-C0ZL4z3c.js → lesson-02-DcMDDBDL.js} +11 -5
- package/dist/lesson-02-DcMDDBDL.js.map +1 -0
- package/dist/{lesson-02-B2Xg7RVU.js → lesson-02-Dk59HZWp.js} +17 -9
- package/dist/lesson-02-Dk59HZWp.js.map +1 -0
- package/dist/{lesson-02-BO3BXPMJ.js → lesson-02-L8oNhBej.js} +14 -8
- package/dist/lesson-02-L8oNhBej.js.map +1 -0
- package/dist/{lesson-02-CsejVbCo.js → lesson-02-VDOme3ES.js} +17 -9
- package/dist/lesson-02-VDOme3ES.js.map +1 -0
- package/dist/{lesson-03-DV2SUWVH.js → lesson-03-9WioSe19.js} +21 -9
- package/dist/lesson-03-9WioSe19.js.map +1 -0
- package/dist/{lesson-03-DiV17_Os.js → lesson-03-BZutWzMD.js} +14 -6
- package/dist/lesson-03-BZutWzMD.js.map +1 -0
- package/dist/{lesson-03-Xc8-2Yt3.js → lesson-03-CSIF5xRS.js} +14 -8
- package/dist/lesson-03-CSIF5xRS.js.map +1 -0
- package/dist/{lesson-03-DrJgbfDQ.js → lesson-03-CSKig363.js} +17 -9
- package/dist/lesson-03-CSKig363.js.map +1 -0
- package/dist/{lesson-03-XVahXvgf.js → lesson-03-CoDPKwa1.js} +21 -14
- package/dist/lesson-03-CoDPKwa1.js.map +1 -0
- package/dist/{lesson-03-8NtAeqFh.js → lesson-03-DPJOG2M_.js} +14 -8
- package/dist/lesson-03-DPJOG2M_.js.map +1 -0
- package/dist/{lesson-03-CKTNtgY1.js → lesson-03-DkjCuJ26.js} +17 -9
- package/dist/lesson-03-DkjCuJ26.js.map +1 -0
- package/dist/{lesson-03-BdZfKRhq.js → lesson-03-DucbRMOQ.js} +17 -9
- package/dist/lesson-03-DucbRMOQ.js.map +1 -0
- package/dist/{lesson-03-D8va_Q9B.js → lesson-03-MIne1PbH.js} +26 -14
- package/dist/lesson-03-MIne1PbH.js.map +1 -0
- package/dist/{lesson-04-Dfc7S4nT.js → lesson-04-0Pj_x1DU.js} +17 -9
- package/dist/lesson-04-0Pj_x1DU.js.map +1 -0
- package/dist/{lesson-04-ZrSBM0BX.js → lesson-04-B9h0p9kE.js} +14 -8
- package/dist/lesson-04-B9h0p9kE.js.map +1 -0
- package/dist/{lesson-04-DEEPJ_rd.js → lesson-04-BLuPI1-X.js} +22 -13
- package/dist/lesson-04-BLuPI1-X.js.map +1 -0
- package/dist/{lesson-04-rapx_3vA.js → lesson-04-CmDvofL4.js} +17 -9
- package/dist/lesson-04-CmDvofL4.js.map +1 -0
- package/dist/{lesson-04-DtXVhdGB.js → lesson-04-DGKHK4LW.js} +17 -9
- package/dist/lesson-04-DGKHK4LW.js.map +1 -0
- package/dist/{lesson-04-CtNr2B3E.js → lesson-04-DUcHZzsk.js} +21 -9
- package/dist/lesson-04-DUcHZzsk.js.map +1 -0
- package/dist/{lesson-04-BpRrNmzO.js → lesson-04-DnVIXXk-.js} +14 -8
- package/dist/lesson-04-DnVIXXk-.js.map +1 -0
- package/dist/{lesson-04-ioLXnB0j.js → lesson-04-FZnIE7tu.js} +27 -15
- package/dist/lesson-04-FZnIE7tu.js.map +1 -0
- package/dist/{lesson-04-D__vMCyA.js → lesson-04-ToX3nRz1.js} +17 -9
- package/dist/lesson-04-ToX3nRz1.js.map +1 -0
- package/dist/{lesson-05-D_GdROUn.js → lesson-05-2aTCGXMh.js} +14 -8
- package/dist/lesson-05-2aTCGXMh.js.map +1 -0
- package/dist/{lesson-05-ip400cxe.js → lesson-05-BvitRdE8.js} +28 -16
- package/dist/lesson-05-BvitRdE8.js.map +1 -0
- package/dist/{lesson-05-D1d3kc3M.js → lesson-05-CgXGkcjS.js} +14 -8
- package/dist/lesson-05-CgXGkcjS.js.map +1 -0
- package/dist/{lesson-05-D2SVU-I0.js → lesson-05-ClfrUrvX.js} +17 -9
- package/dist/lesson-05-ClfrUrvX.js.map +1 -0
- package/dist/{lesson-05-CKxXcooO.js → lesson-05-D2zf9n7k.js} +23 -13
- package/dist/lesson-05-D2zf9n7k.js.map +1 -0
- package/dist/{lesson-05-DusKUtbm.js → lesson-05-DWquBfdl.js} +21 -9
- package/dist/lesson-05-DWquBfdl.js.map +1 -0
- package/dist/{lesson-05-Bm6fg-DJ.js → lesson-05-DpIkwhJ8.js} +17 -9
- package/dist/lesson-05-DpIkwhJ8.js.map +1 -0
- package/dist/{lesson-05-DBsHyFlt.js → lesson-05-UYz39ORV.js} +17 -9
- package/dist/lesson-05-UYz39ORV.js.map +1 -0
- package/dist/{lesson-05-DXOLS7G0.js → lesson-05-t6XuANiZ.js} +17 -9
- package/dist/lesson-05-t6XuANiZ.js.map +1 -0
- package/dist/{lesson-06-1ZsbrE1a.js → lesson-06-B2y08mKv.js} +17 -9
- package/dist/lesson-06-B2y08mKv.js.map +1 -0
- package/dist/{lesson-06-1CE05TRX.js → lesson-06-CHqaVQix.js} +16 -10
- package/dist/lesson-06-CHqaVQix.js.map +1 -0
- package/dist/{lesson-06-Bliedg7n.js → lesson-06-CaCZBX1V.js} +17 -9
- package/dist/lesson-06-CaCZBX1V.js.map +1 -0
- package/dist/{lesson-06-Du9J8sYl.js → lesson-06-ClplsJBT.js} +30 -18
- package/dist/lesson-06-ClplsJBT.js.map +1 -0
- package/dist/{lesson-06-BG26PBTF.js → lesson-06-CzGnNKo5.js} +14 -8
- package/dist/lesson-06-CzGnNKo5.js.map +1 -0
- package/dist/{lesson-06-CnKkcUb-.js → lesson-06-Dg_bQLNC.js} +17 -9
- package/dist/lesson-06-Dg_bQLNC.js.map +1 -0
- package/dist/{lesson-06-Aw-X-HMV.js → lesson-06-OWFMgO0a.js} +23 -14
- package/dist/lesson-06-OWFMgO0a.js.map +1 -0
- package/dist/{lesson-06-CvN9pDsE.js → lesson-06-Q2aRAzws.js} +17 -9
- package/dist/lesson-06-Q2aRAzws.js.map +1 -0
- package/dist/{lesson-07-DjCMCYkK.js → lesson-07-BLDUA_Ff.js} +17 -9
- package/dist/lesson-07-BLDUA_Ff.js.map +1 -0
- package/dist/{lesson-07-DezS1ojS.js → lesson-07-BpyF1Ssq.js} +27 -15
- package/dist/lesson-07-BpyF1Ssq.js.map +1 -0
- package/dist/{lesson-07-rvSSQiVh.js → lesson-07-C4GrfDTW.js} +25 -13
- package/dist/lesson-07-C4GrfDTW.js.map +1 -0
- package/dist/{lesson-07-CTFSd9gF.js → lesson-07-CVCUt1Jn.js} +14 -8
- package/dist/lesson-07-CVCUt1Jn.js.map +1 -0
- package/dist/{lesson-07-8zdPFyjE.js → lesson-07-DQFXCZsZ.js} +17 -9
- package/dist/lesson-07-DQFXCZsZ.js.map +1 -0
- package/dist/{lesson-07-X6anzbAn.js → lesson-07-Dcry2Yjo.js} +17 -9
- package/dist/lesson-07-Dcry2Yjo.js.map +1 -0
- package/dist/{lesson-07-B9bkJ3gP.js → lesson-07-JS_cqdNr.js} +14 -8
- package/dist/lesson-07-JS_cqdNr.js.map +1 -0
- package/dist/{lesson-08-CeDWopKc.js → lesson-08-18gscaS0.js} +25 -13
- package/dist/lesson-08-18gscaS0.js.map +1 -0
- package/dist/{lesson-08-Cyzy_VeP.js → lesson-08-2kBUq_B2.js} +14 -8
- package/dist/lesson-08-2kBUq_B2.js.map +1 -0
- package/dist/{lesson-08-BYfkPBkH.js → lesson-08-BP5lpiGe.js} +17 -9
- package/dist/lesson-08-BP5lpiGe.js.map +1 -0
- package/dist/{lesson-08-Bb_v_gD-.js → lesson-08-BXm9GgdN.js} +14 -8
- package/dist/lesson-08-BXm9GgdN.js.map +1 -0
- package/dist/{lesson-08-BqW5C_OE.js → lesson-08-Bru0PdEK.js} +21 -9
- package/dist/lesson-08-Bru0PdEK.js.map +1 -0
- package/dist/{lesson-08-hJlci9W5.js → lesson-08-Dd-8cbGW.js} +17 -9
- package/dist/lesson-08-Dd-8cbGW.js.map +1 -0
- package/dist/{lesson-09-DHRHZIc1.js → lesson-09-B1qWE3Yl.js} +27 -15
- package/dist/lesson-09-B1qWE3Yl.js.map +1 -0
- package/dist/{lesson-09-BQ1CZCjT.js → lesson-09-B5Vb70xj.js} +14 -8
- package/dist/lesson-09-B5Vb70xj.js.map +1 -0
- package/dist/{lesson-10-BdfkVT7s.js → lesson-10-00qNLc7A.js} +25 -13
- package/dist/lesson-10-00qNLc7A.js.map +1 -0
- package/dist/{lesson-10-C7YEQ8et.js → lesson-10-Dw-Jtm3D.js} +14 -8
- package/dist/lesson-10-Dw-Jtm3D.js.map +1 -0
- package/dist/{lesson-11-oJQ8ZxJk.js → lesson-11-BM3R_S7I.js} +25 -13
- package/dist/lesson-11-BM3R_S7I.js.map +1 -0
- package/dist/{lesson-12-D69m5ETy.js → lesson-12-D1Wx7CyK.js} +33 -21
- package/dist/lesson-12-D1Wx7CyK.js.map +1 -0
- package/dist/skills-hcn-pGD0.js +244 -0
- package/dist/skills-hcn-pGD0.js.map +1 -0
- package/dist/syllabi/alphabet/index.js +1 -1
- package/dist/syllabi/dialogue/index.d.ts +1 -1
- package/dist/syllabi/dialogue/index.js +2 -2
- package/dist/syllabi/essentials/index.d.ts +1 -1
- package/dist/syllabi/essentials/index.js +2 -2
- package/dist/syllabi/food/index.d.ts +1 -1
- package/dist/syllabi/food/index.js +2 -2
- package/dist/syllabi/grammar/index.d.ts +1 -1
- package/dist/syllabi/grammar/index.js +2 -2
- package/dist/syllabi/numbers/index.d.ts +1 -1
- package/dist/syllabi/numbers/index.js +2 -2
- package/dist/syllabi/reading/index.d.ts +1 -1
- package/dist/syllabi/reading/index.js +2 -2
- package/dist/syllabi/travel/index.d.ts +1 -1
- package/dist/syllabi/travel/index.js +2 -2
- package/dist/syllabi/vowels-tones/index.d.ts +1 -1
- package/dist/syllabi/vowels-tones/index.js +2 -2
- package/package.json +5 -5
- package/src/syllabi/alphabet/lessons/lesson-01.mdx +24 -13
- package/src/syllabi/alphabet/lessons/lesson-02.mdx +23 -13
- package/src/syllabi/alphabet/lessons/lesson-03.mdx +20 -13
- package/src/syllabi/alphabet/lessons/lesson-04.mdx +21 -12
- package/src/syllabi/alphabet/lessons/lesson-05.mdx +22 -12
- package/src/syllabi/alphabet/lessons/lesson-06.mdx +22 -13
- package/src/syllabi/alphabet/lessons/lesson-07.mdx +26 -14
- package/src/syllabi/alphabet/lessons/lesson-08.mdx +24 -12
- package/src/syllabi/alphabet/lessons/lesson-09.mdx +26 -14
- package/src/syllabi/alphabet/lessons/lesson-10.mdx +24 -12
- package/src/syllabi/alphabet/lessons/lesson-11.mdx +24 -12
- package/src/syllabi/alphabet/lessons/lesson-12.mdx +32 -20
- package/src/syllabi/dialogue/lessons/lesson-01.mdx +13 -5
- package/src/syllabi/dialogue/lessons/lesson-02.mdx +13 -5
- package/src/syllabi/dialogue/lessons/lesson-03.mdx +13 -5
- package/src/syllabi/dialogue/lessons/lesson-04.mdx +16 -8
- package/src/syllabi/dialogue/lessons/lesson-05.mdx +16 -8
- package/src/syllabi/dialogue/lessons/lesson-06.mdx +16 -8
- package/src/syllabi/dialogue/lessons/lesson-07.mdx +16 -8
- package/src/syllabi/dialogue/lessons/lesson-08.mdx +16 -8
- package/src/syllabi/essentials/lessons/lesson-01.mdx +13 -5
- package/src/syllabi/essentials/lessons/lesson-02.mdx +16 -8
- package/src/syllabi/essentials/lessons/lesson-03.mdx +16 -8
- package/src/syllabi/essentials/lessons/lesson-04.mdx +16 -8
- package/src/syllabi/essentials/lessons/lesson-05.mdx +16 -8
- package/src/syllabi/essentials/lessons/lesson-06.mdx +16 -8
- package/src/syllabi/food/lessons/lesson-01.mdx +13 -5
- package/src/syllabi/food/lessons/lesson-02.mdx +16 -8
- package/src/syllabi/food/lessons/lesson-03.mdx +16 -8
- package/src/syllabi/food/lessons/lesson-04.mdx +16 -8
- package/src/syllabi/food/lessons/lesson-05.mdx +16 -8
- package/src/syllabi/food/lessons/lesson-06.mdx +16 -8
- package/src/syllabi/food/lessons/lesson-07.mdx +16 -8
- package/src/syllabi/food/lessons/lesson-08.mdx +16 -8
- package/src/syllabi/grammar/lessons/lesson-01.mdx +10 -4
- package/src/syllabi/grammar/lessons/lesson-02.mdx +10 -4
- package/src/syllabi/grammar/lessons/lesson-03.mdx +13 -7
- package/src/syllabi/grammar/lessons/lesson-04.mdx +13 -7
- package/src/syllabi/grammar/lessons/lesson-05.mdx +13 -7
- package/src/syllabi/grammar/lessons/lesson-06.mdx +13 -7
- package/src/syllabi/grammar/lessons/lesson-07.mdx +13 -7
- package/src/syllabi/grammar/lessons/lesson-08.mdx +13 -7
- package/src/syllabi/numbers/lessons/lesson-01.mdx +27 -15
- package/src/syllabi/numbers/lessons/lesson-02.mdx +20 -8
- package/src/syllabi/numbers/lessons/lesson-03.mdx +20 -8
- package/src/syllabi/numbers/lessons/lesson-04.mdx +20 -8
- package/src/syllabi/numbers/lessons/lesson-05.mdx +20 -8
- package/src/syllabi/reading/lessons/lesson-01.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-02.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-03.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-04.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-05.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-06.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-07.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-08.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-09.mdx +13 -7
- package/src/syllabi/reading/lessons/lesson-10.mdx +13 -7
- package/src/syllabi/travel/lessons/lesson-01.mdx +16 -8
- package/src/syllabi/travel/lessons/lesson-02.mdx +16 -8
- package/src/syllabi/travel/lessons/lesson-03.mdx +16 -8
- package/src/syllabi/travel/lessons/lesson-04.mdx +16 -8
- package/src/syllabi/travel/lessons/lesson-05.mdx +16 -8
- package/src/syllabi/travel/lessons/lesson-06.mdx +16 -8
- package/src/syllabi/travel/lessons/lesson-07.mdx +16 -8
- package/src/syllabi/vowels-tones/lessons/lesson-01.mdx +20 -8
- package/src/syllabi/vowels-tones/lessons/lesson-02.mdx +26 -14
- package/src/syllabi/vowels-tones/lessons/lesson-03.mdx +25 -13
- package/src/syllabi/vowels-tones/lessons/lesson-04.mdx +24 -12
- package/src/syllabi/vowels-tones/lessons/lesson-05.mdx +27 -15
- package/src/syllabi/vowels-tones/lessons/lesson-06.mdx +29 -17
- package/src/syllabi/vowels-tones/lessons/lesson-07.mdx +24 -12
- package/src/syllabi/vowels-tones/lessons/lesson-08.mdx +20 -8
- package/dist/index-DADMaTE7.js +0 -27
- package/dist/index-DADMaTE7.js.map +0 -1
- package/dist/lesson-01--9NOyHZ6.js.map +0 -1
- package/dist/lesson-01-3hBted4A.js.map +0 -1
- package/dist/lesson-01-97FtYE6g.js.map +0 -1
- package/dist/lesson-01-BNdHXAGR.js.map +0 -1
- package/dist/lesson-01-BYKAZiua.js.map +0 -1
- package/dist/lesson-01-BhjY6ArF.js.map +0 -1
- package/dist/lesson-01-CF4tJfZ3.js.map +0 -1
- package/dist/lesson-01-CRx-yw4C.js.map +0 -1
- package/dist/lesson-01-WV3ic8Ok.js.map +0 -1
- package/dist/lesson-02-B2Xg7RVU.js.map +0 -1
- package/dist/lesson-02-BAbq-QGP.js.map +0 -1
- package/dist/lesson-02-BGnp0Ik_.js.map +0 -1
- package/dist/lesson-02-BO3BXPMJ.js.map +0 -1
- package/dist/lesson-02-Bm9EJuN8.js.map +0 -1
- package/dist/lesson-02-C0ZL4z3c.js.map +0 -1
- package/dist/lesson-02-C2ALLvoT.js.map +0 -1
- package/dist/lesson-02-C8dfzXvq.js.map +0 -1
- package/dist/lesson-02-CsejVbCo.js.map +0 -1
- package/dist/lesson-03-8NtAeqFh.js.map +0 -1
- package/dist/lesson-03-BdZfKRhq.js.map +0 -1
- package/dist/lesson-03-CKTNtgY1.js.map +0 -1
- package/dist/lesson-03-D8va_Q9B.js.map +0 -1
- package/dist/lesson-03-DV2SUWVH.js.map +0 -1
- package/dist/lesson-03-DiV17_Os.js.map +0 -1
- package/dist/lesson-03-DrJgbfDQ.js.map +0 -1
- package/dist/lesson-03-XVahXvgf.js.map +0 -1
- package/dist/lesson-03-Xc8-2Yt3.js.map +0 -1
- package/dist/lesson-04-BpRrNmzO.js.map +0 -1
- package/dist/lesson-04-CtNr2B3E.js.map +0 -1
- package/dist/lesson-04-DEEPJ_rd.js.map +0 -1
- package/dist/lesson-04-D__vMCyA.js.map +0 -1
- package/dist/lesson-04-Dfc7S4nT.js.map +0 -1
- package/dist/lesson-04-DtXVhdGB.js.map +0 -1
- package/dist/lesson-04-ZrSBM0BX.js.map +0 -1
- package/dist/lesson-04-ioLXnB0j.js.map +0 -1
- package/dist/lesson-04-rapx_3vA.js.map +0 -1
- package/dist/lesson-05-Bm6fg-DJ.js.map +0 -1
- package/dist/lesson-05-CKxXcooO.js.map +0 -1
- package/dist/lesson-05-D1d3kc3M.js.map +0 -1
- package/dist/lesson-05-D2SVU-I0.js.map +0 -1
- package/dist/lesson-05-DBsHyFlt.js.map +0 -1
- package/dist/lesson-05-DXOLS7G0.js.map +0 -1
- package/dist/lesson-05-D_GdROUn.js.map +0 -1
- package/dist/lesson-05-DusKUtbm.js.map +0 -1
- package/dist/lesson-05-ip400cxe.js.map +0 -1
- package/dist/lesson-06-1CE05TRX.js.map +0 -1
- package/dist/lesson-06-1ZsbrE1a.js.map +0 -1
- package/dist/lesson-06-Aw-X-HMV.js.map +0 -1
- package/dist/lesson-06-BG26PBTF.js.map +0 -1
- package/dist/lesson-06-Bliedg7n.js.map +0 -1
- package/dist/lesson-06-CnKkcUb-.js.map +0 -1
- package/dist/lesson-06-CvN9pDsE.js.map +0 -1
- package/dist/lesson-06-Du9J8sYl.js.map +0 -1
- package/dist/lesson-07-8zdPFyjE.js.map +0 -1
- package/dist/lesson-07-B9bkJ3gP.js.map +0 -1
- package/dist/lesson-07-CTFSd9gF.js.map +0 -1
- package/dist/lesson-07-DezS1ojS.js.map +0 -1
- package/dist/lesson-07-DjCMCYkK.js.map +0 -1
- package/dist/lesson-07-X6anzbAn.js.map +0 -1
- package/dist/lesson-07-rvSSQiVh.js.map +0 -1
- package/dist/lesson-08-BYfkPBkH.js.map +0 -1
- package/dist/lesson-08-Bb_v_gD-.js.map +0 -1
- package/dist/lesson-08-BqW5C_OE.js.map +0 -1
- package/dist/lesson-08-CeDWopKc.js.map +0 -1
- package/dist/lesson-08-Cyzy_VeP.js.map +0 -1
- package/dist/lesson-08-hJlci9W5.js.map +0 -1
- package/dist/lesson-09-BQ1CZCjT.js.map +0 -1
- package/dist/lesson-09-DHRHZIc1.js.map +0 -1
- package/dist/lesson-10-BdfkVT7s.js.map +0 -1
- package/dist/lesson-10-C7YEQ8et.js.map +0 -1
- package/dist/lesson-11-oJQ8ZxJk.js.map +0 -1
- package/dist/lesson-12-D69m5ETy.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lesson-12-D1Wx7CyK.js","sources":["../src/syllabi/alphabet/lessons/lesson-12.mdx?raw"],"sourcesContent":["export default \"---\\ntype: lesson\\nid: thai-script-lesson-12\\ntitle: \\\"บทที่ 12 — ตัวเลขและสัญลักษณ์\\\"\\ndescription: \\\"Numbers & Symbols: ๐-๙ ฯ ๆ — Thai numerals and special characters\\\"\\norder: 12\\nparentId: thai-script-alphabet\\ndifficulty: advanced\\ncefrLevel: B1\\ncategories:\\n - numbers\\n - symbols\\n - punctuation\\n - advanced-characters\\nmetadata:\\n estimatedTime: 20\\n prerequisites:\\n - thai-script-lesson-11\\n learningObjectives:\\n - id: obj-numerals\\n description: \\\"Learn Thai numerals 0-9\\\"\\n skill: character-recognition\\n references: [num-zero, num-one, num-two, num-three, num-four, num-five, num-six, num-seven, num-eight, num-nine]\\n - id: obj-punctuation\\n description: \\\"Understand Thai punctuation marks\\\"\\n skill: character-recognition\\n references: [paiyannoi, maiyamok]\\n - id: obj-repetition-mark\\n description: \\\"Master the repetition mark ๆ\\\"\\n skill: character-sound-mapping\\n references: [maiyamok]\\n - id: obj-script-literacy\\n description: \\\"Complete your Thai script literacy\\\"\\n skill: character-recognition\\n references: [num-zero, num-one, num-two, num-three, num-four, num-five, num-six, num-seven, num-eight, num-nine, paiyannoi, maiyamok]\\n---\\n\\n# บทที่ 12 (Lesson 12) — Numbers & Symbols\\n\\n## Introduction\\n\\nThai has its own numeral system dating back centuries. While Arabic numerals (0-9) are common in modern Thailand, Thai numerals still appear on official documents, temples, traditional contexts, and formal writing. This lesson also covers essential Thai punctuation.\\n\\n## Thai Numerals\\n\\n:::character-set{id=\\\"thai-numbers\\\" title=\\\"Thai Numerals\\\"}\\n\\n::character{id=\\\"num-zero\\\" canonicalRef=\\\"num-zero\\\" char=\\\"๐\\\" name=\\\"ศูนย์ (sǔun)\\\" nativeName=\\\"ศูนย์\\\" transliteration=\\\"0\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-one\\\" canonicalRef=\\\"num-one\\\" char=\\\"๑\\\" name=\\\"หนึ่ง (nʉ̀ng)\\\" nativeName=\\\"หนึ่ง\\\" transliteration=\\\"1\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-two\\\" canonicalRef=\\\"num-two\\\" char=\\\"๒\\\" name=\\\"สอง (sɔ̌ɔng)\\\" nativeName=\\\"สอง\\\" transliteration=\\\"2\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-three\\\" canonicalRef=\\\"num-three\\\" char=\\\"๓\\\" name=\\\"สาม (sǎam)\\\" nativeName=\\\"สาม\\\" transliteration=\\\"3\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-four\\\" canonicalRef=\\\"num-four\\\" char=\\\"๔\\\" name=\\\"สี่ (sìi)\\\" nativeName=\\\"สี่\\\" transliteration=\\\"4\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-five\\\" canonicalRef=\\\"num-five\\\" char=\\\"๕\\\" name=\\\"ห้า (hâa)\\\" nativeName=\\\"ห้า\\\" transliteration=\\\"5\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-six\\\" canonicalRef=\\\"num-six\\\" char=\\\"๖\\\" name=\\\"หก (hòk)\\\" nativeName=\\\"หก\\\" transliteration=\\\"6\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-seven\\\" canonicalRef=\\\"num-seven\\\" char=\\\"๗\\\" name=\\\"เจ็ด (jèt)\\\" nativeName=\\\"เจ็ด\\\" transliteration=\\\"7\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-eight\\\" canonicalRef=\\\"num-eight\\\" char=\\\"๘\\\" name=\\\"แปด (bpàaet)\\\" nativeName=\\\"แปด\\\" transliteration=\\\"8\\\" charType=\\\"number\\\"}\\n\\n::character{id=\\\"num-nine\\\" canonicalRef=\\\"num-nine\\\" char=\\\"๙\\\" name=\\\"เก้า (gâo)\\\" nativeName=\\\"เก้า\\\" transliteration=\\\"9\\\" charType=\\\"number\\\"}\\n\\n:::\\n\\n## Shape Recognition for Numbers\\n\\nThai numerals have distinctive shapes:\\n\\n| Numeral | Shape Hint |\\n|---------|------------|\\n| ๐ | Circle (like 0) |\\n| ๑ | Simple hook |\\n| ๒ | Like ๑ with extra curve |\\n| ๓ | Three loops/curves |\\n| ๔ | Complex with descender |\\n| ๕ | Curved shape |\\n| ๖ | Has a \\\"tail\\\" going down |\\n| ๗ | Curves at top |\\n| ๘ | Complex with loops |\\n| ๙ | Almost like a \\\"9\\\" reversed |\\n\\n**Memory tip**: ๐ (zero) looks like a circle, ๓ (three) has three connected parts.\\n\\n## Where You'll See Thai Numerals\\n\\n1. **Temple dates**: Buddhist Era years (พ.ศ. ๒๕๖๗)\\n2. **Official documents**: Government forms, IDs\\n3. **Royal contexts**: Anything related to monarchy\\n4. **Traditional signs**: Old buildings, historical markers\\n5. **Lottery tickets**: Thai lottery uses Thai numerals\\n6. **Clock faces**: Traditional-style clocks\\n\\n## The Buddhist Era Calendar\\n\\nThailand uses the **Buddhist Era (พ.ศ.)**, which is 543 years ahead of the Gregorian calendar:\\n- 2024 CE = พ.ศ. ๒๕๖๗\\n- 2025 CE = พ.ศ. ๒๕๖๘\\n\\nWhen you see dates in Thai numerals, they're likely Buddhist Era!\\n\\n## Special Symbols\\n\\n:::character-set{id=\\\"thai-symbols\\\" title=\\\"Thai Symbols\\\"}\\n\\n::character{id=\\\"paiyannoi\\\" canonicalRef=\\\"paiyannoi\\\" char=\\\"ฯ\\\" name=\\\"ไปยาลน้อย (bpai-yaan-nói)\\\" nativeName=\\\"ไปยาลน้อย\\\" transliteration=\\\"abbrev.\\\" charType=\\\"symbol\\\"}\\n\\n::character{id=\\\"maiyamok\\\" canonicalRef=\\\"maiyamok\\\" char=\\\"ๆ\\\" name=\\\"ไม้ยมก (mái-yá-mók)\\\" nativeName=\\\"ไม้ยมก\\\" transliteration=\\\"repeat\\\" charType=\\\"symbol\\\"}\\n\\n:::\\n\\n### ฯ Paiyannoi (Abbreviation Mark)\\n\\nUsed to indicate abbreviation, similar to a period in abbreviations:\\n- กรุงเทพฯ (Krung Thep...) — Bangkok (full: กรุงเทพมหานคร)\\n- ฯลฯ — etc. (literally \\\"and so on\\\")\\n\\nYou'll see ฯ in:\\n- Place name abbreviations\\n- Title abbreviations\\n- Lists ending with \\\"etc.\\\"\\n\\n### ๆ Maiyamok (Repetition Mark)\\n\\nIndicates that the previous word should be repeated:\\n- ช้า ๆ (cháa cháa) — slowly (literally \\\"slow slow\\\")\\n- เด็ก ๆ (dèk dèk) — children (plural marker)\\n- บาง ๆ (baang baang) — somewhat thin\\n\\n**Usage patterns**:\\n1. **Emphasis/intensity**: ดี ๆ (really good)\\n2. **Plurality**: คน ๆ (people, multiple)\\n3. **Reduplication for meaning change**: Various idiomatic uses\\n\\nWithout ๆ, you'd have to write the word twice. This mark saves space and is very common in everyday Thai.\\n\\n## Other Symbols You May Encounter\\n\\n| Symbol | Name | Use |\\n|--------|------|-----|\\n| ๆ | Maiyamok | Repetition |\\n| ฯ | Paiyannoi | Abbreviation |\\n| ๏ | Fongman | Old paragraph marker (rare) |\\n| ฯลฯ | (etc.) | Et cetera |\\n| ฯพณฯ | (title) | Royal/noble title prefix |\\n\\n## Punctuation in Thai\\n\\nTraditional Thai used **no punctuation** — no spaces between words, no periods, no commas. Modern Thai has adopted:\\n\\n| Punctuation | Usage |\\n|-------------|-------|\\n| (space) | Between clauses, not words |\\n| . | Rarely used; sometimes in abbreviations |\\n| , | Borrowed from English, used sparingly |\\n| ? | Used in informal writing |\\n| ! | Used in informal writing |\\n| \\\" \\\" | Quotation marks (borrowed) |\\n\\n**Important**: Thai traditionally has no spaces between words. Word boundaries are learned through experience. Spaces appear between phrases or clauses, not individual words.\\n\\n## Complete Script Summary\\n\\nYou've now learned the complete Thai script:\\n\\n| Category | Count | Examples |\\n|----------|-------|----------|\\n| Consonants | 44 | ก ข ค... |\\n| Vowels | 32+ | ◌า ◌ิ เ◌... |\\n| Tone Marks | 4 | ◌่ ◌้ ◌๊ ◌๋ |\\n| Numerals | 10 | ๐-๙ |\\n| Symbols | 2+ | ฯ ๆ |\\n\\n## Key Points\\n\\n1. **Thai numerals exist**: Used in traditional/formal contexts\\n2. **Buddhist Era**: Add 543 to get Thai year\\n3. **ๆ means repeat**: Common in everyday writing\\n4. **ฯ means abbreviated**: Like \\\"...\\\" or abbreviation periods\\n5. **No word spaces**: Thai doesn't space between words\\n6. **Modern punctuation**: Borrowed from English, used sparingly\\n\\n## Practice Exercises\\n\\n:::exercise{id=\\\"numbers-1-numeral-conversion\\\" type=\\\"fill-in-blank\\\" title=\\\"Numeral Conversion\\\" skill=\\\"character-recognition\\\" tests=\\\"num-zero,num-one,num-two,num-three,num-five,num-six,num-seven\\\" objectiveId=\\\"obj-numerals\\\"}\\n\\n**Question:** Convert these Thai numerals to Arabic numerals:\\n\\n- ๒๕๖๗\\n- ๑๒๓\\n- ๕๐\\n\\n**Answer:**\\n\\n- ๒๕๖๗ = 2567 (Buddhist Era year, equivalent to 2024 CE)\\n- ๑๒๓ = 123\\n- ๕๐ = 50\\n\\n**Explanation:** Thai numerals work exactly like Arabic numerals — position determines value. ๒๕๖๗ is a Buddhist Era year (add 543 to get Gregorian year).\\n\\n:::\\n\\n:::exercise{id=\\\"numbers-1-symbol-usage\\\" type=\\\"matching\\\" title=\\\"Symbol Usage\\\" skill=\\\"character-recognition\\\" tests=\\\"maiyamok,paiyannoi\\\" objectiveId=\\\"obj-punctuation\\\"}\\n\\n**Question:** Match each symbol to its correct usage\\n\\n- ๆ (mái yamok)\\n- ฯ (paiyannoi)\\n- ฯลฯ\\n\\n**Answer:**\\n\\n- ๆ → Repetition mark (repeat the previous word)\\n- ฯ → Abbreviation mark (indicates shortened form)\\n- ฯลฯ → Et cetera (and so on)\\n\\n**Explanation:** ๆ is very common in Thai writing for emphasis and plurality. ฯ indicates abbreviations, especially in place names. ฯลฯ means \\\"etc.\\\"\\n\\n:::\\n\\n:::exercise{id=\\\"numbers-1-reading-practice\\\" type=\\\"fill-in-blank\\\" title=\\\"Reading Practice with Symbols\\\" skill=\\\"character-sound-mapping\\\" tests=\\\"paiyannoi,maiyamok\\\" objectiveId=\\\"obj-repetition-mark\\\"}\\n\\n**Question:** What do these phrases mean?\\n\\n- กรุงเทพฯ\\n- ช้า ๆ\\n- เด็ก ๆ\\n\\n**Answer:**\\n\\n- กรุงเทพฯ = Bangkok (abbreviated from กรุงเทพมหานคร)\\n- ช้า ๆ = slowly (reduplication for emphasis)\\n- เด็ก ๆ = children (plural marker)\\n\\n**Explanation:** ฯ abbreviates long place names. ๆ creates reduplication for emphasis (ช้า = slow, ช้า ๆ = slowly) or plurality (เด็ก = child, เด็ก ๆ = children).\\n\\n:::\\n\\n## Congratulations!\\n\\nYou've completed the Thai Script course! You now know:\\n- All 44 consonants and their classes\\n- The tone mark system\\n- Thai numerals and symbols\\n\\n**What's next?**\\n- Practice reading real Thai text\\n- Learn Thai vowels in depth\\n- Build vocabulary\\n- Study grammar patterns\\n\\nRemember: Reading Thai is a skill that improves with practice. The patterns you've learned will become automatic as you read more Thai text.\\n\\n## Final Practice Challenge\\n\\nTry reading this sentence:\\n\\n**กรุงเทพฯ เป็นเมืองหลวงของประเทศไทย**\\n\\n- กรุงเทพฯ (Krung Thep...) — Bangkok\\n- เป็น (bpen) — is\\n- เมืองหลวง (mʉang-lǔang) — capital city\\n- ของ (khɔ̌ɔng) — of\\n- ประเทศไทย (bprà-thêet-thai) — Thailand\\n\\n\\\"Bangkok is the capital city of Thailand.\\\"\\n\\nYou can read Thai!\\n\""],"names":["lesson12"],"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;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;"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { buildLessonFromMDX as t } from "@syllst/processor";
|
|
2
|
+
function s(r, a) {
|
|
3
|
+
return {
|
|
4
|
+
config: r,
|
|
5
|
+
async loadLesson(o) {
|
|
6
|
+
if (o < 1 || o > r.lessonCount)
|
|
7
|
+
return null;
|
|
8
|
+
try {
|
|
9
|
+
const { default: e } = await a(o), n = await t(e);
|
|
10
|
+
return {
|
|
11
|
+
lessonNumber: o,
|
|
12
|
+
ast: n,
|
|
13
|
+
rawContent: e
|
|
14
|
+
};
|
|
15
|
+
} catch (e) {
|
|
16
|
+
return console.error(`Failed to load lesson ${o}:`, e), null;
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
async loadAllLessons() {
|
|
20
|
+
const o = [];
|
|
21
|
+
for (let e = 1; e <= r.lessonCount; e++) {
|
|
22
|
+
const n = await this.loadLesson(e);
|
|
23
|
+
n && o.push(n);
|
|
24
|
+
}
|
|
25
|
+
return o;
|
|
26
|
+
},
|
|
27
|
+
getAvailableLessons() {
|
|
28
|
+
return Array.from({ length: r.lessonCount }, (o, e) => e + 1);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const i = [
|
|
33
|
+
{
|
|
34
|
+
id: "character",
|
|
35
|
+
name: "Character Skills",
|
|
36
|
+
description: "Skills related to recognizing, writing, and producing characters",
|
|
37
|
+
skills: [
|
|
38
|
+
{
|
|
39
|
+
id: "character-recognition",
|
|
40
|
+
name: "Character Recognition",
|
|
41
|
+
description: "Identify a character from its visual form",
|
|
42
|
+
category: "character"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "character-production",
|
|
46
|
+
name: "Character Production",
|
|
47
|
+
description: "Write or produce a character from memory",
|
|
48
|
+
category: "character"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "character-sound-mapping",
|
|
52
|
+
name: "Character-Sound Mapping",
|
|
53
|
+
description: "Map a character to its pronunciation",
|
|
54
|
+
category: "character"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "character-name-recall",
|
|
58
|
+
name: "Character Name Recall",
|
|
59
|
+
description: "Recall the name or mnemonic of a character",
|
|
60
|
+
category: "character"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "character-class-identification",
|
|
64
|
+
name: "Character Class Identification",
|
|
65
|
+
description: "Identify the class/category of a character (e.g., consonant class)",
|
|
66
|
+
category: "character"
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "phonology",
|
|
72
|
+
name: "Phonology Skills",
|
|
73
|
+
description: "Skills related to sound systems, tone rules, and pronunciation",
|
|
74
|
+
skills: [
|
|
75
|
+
{
|
|
76
|
+
id: "tone-rule-application",
|
|
77
|
+
name: "Tone Rule Application",
|
|
78
|
+
description: "Apply tone rules to determine correct pronunciation",
|
|
79
|
+
category: "phonology"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: "tone-perception",
|
|
83
|
+
name: "Tone Perception",
|
|
84
|
+
description: "Distinguish between different tones in spoken language",
|
|
85
|
+
category: "phonology"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: "tone-production",
|
|
89
|
+
name: "Tone Production",
|
|
90
|
+
description: "Produce correct tones in speech",
|
|
91
|
+
category: "phonology"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "syllable-analysis",
|
|
95
|
+
name: "Syllable Analysis",
|
|
96
|
+
description: "Break words into syllables and identify syllable types",
|
|
97
|
+
category: "phonology"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: "sound-change-recognition",
|
|
101
|
+
name: "Sound Change Recognition",
|
|
102
|
+
description: "Recognize phonological processes like assimilation or elision",
|
|
103
|
+
category: "phonology"
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: "vocabulary",
|
|
109
|
+
name: "Vocabulary Skills",
|
|
110
|
+
description: "Skills related to word knowledge and usage",
|
|
111
|
+
skills: [
|
|
112
|
+
{
|
|
113
|
+
id: "word-recognition",
|
|
114
|
+
name: "Word Recognition",
|
|
115
|
+
description: "Recognize a word and recall its meaning",
|
|
116
|
+
category: "vocabulary"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "word-production",
|
|
120
|
+
name: "Word Production",
|
|
121
|
+
description: "Produce the correct word for a given meaning",
|
|
122
|
+
category: "vocabulary"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: "word-pronunciation",
|
|
126
|
+
name: "Word Pronunciation",
|
|
127
|
+
description: "Pronounce a word correctly (transcription recall)",
|
|
128
|
+
category: "vocabulary"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: "word-spelling",
|
|
132
|
+
name: "Word Spelling",
|
|
133
|
+
description: "Spell a word correctly in the target script",
|
|
134
|
+
category: "vocabulary"
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: "grammar",
|
|
140
|
+
name: "Grammar Skills",
|
|
141
|
+
description: "Skills related to grammatical patterns and sentence construction",
|
|
142
|
+
skills: [
|
|
143
|
+
{
|
|
144
|
+
id: "pattern-recognition",
|
|
145
|
+
name: "Pattern Recognition",
|
|
146
|
+
description: "Recognize a grammatical pattern in context",
|
|
147
|
+
category: "grammar"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: "pattern-application",
|
|
151
|
+
name: "Pattern Application",
|
|
152
|
+
description: "Apply a grammatical pattern to construct sentences",
|
|
153
|
+
category: "grammar"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: "particle-usage",
|
|
157
|
+
name: "Particle Usage",
|
|
158
|
+
description: "Use grammatical particles correctly",
|
|
159
|
+
category: "grammar"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: "word-order",
|
|
163
|
+
name: "Word Order",
|
|
164
|
+
description: "Arrange words in the correct order",
|
|
165
|
+
category: "grammar"
|
|
166
|
+
}
|
|
167
|
+
]
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: "reading",
|
|
171
|
+
name: "Reading Skills",
|
|
172
|
+
description: "Skills related to reading comprehension",
|
|
173
|
+
skills: [
|
|
174
|
+
{
|
|
175
|
+
id: "text-decoding",
|
|
176
|
+
name: "Text Decoding",
|
|
177
|
+
description: "Read and decode text in the target script",
|
|
178
|
+
category: "reading"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
id: "reading-comprehension",
|
|
182
|
+
name: "Reading Comprehension",
|
|
183
|
+
description: "Understand the meaning of a passage",
|
|
184
|
+
category: "reading"
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
id: "writing",
|
|
190
|
+
name: "Writing Skills",
|
|
191
|
+
description: "Skills related to the writing system",
|
|
192
|
+
skills: [
|
|
193
|
+
{
|
|
194
|
+
id: "stroke-order",
|
|
195
|
+
name: "Stroke Order",
|
|
196
|
+
description: "Write characters with correct stroke order",
|
|
197
|
+
category: "writing"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
id: "vowel-positioning",
|
|
201
|
+
name: "Vowel Positioning",
|
|
202
|
+
description: "Place vowel marks in the correct position relative to consonants",
|
|
203
|
+
category: "writing"
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: "tone-mark-placement",
|
|
207
|
+
name: "Tone Mark Placement",
|
|
208
|
+
description: "Place tone marks correctly on syllables",
|
|
209
|
+
category: "writing"
|
|
210
|
+
}
|
|
211
|
+
]
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
id: "conversation",
|
|
215
|
+
name: "Conversation Skills",
|
|
216
|
+
description: "Skills related to dialogue and conversation",
|
|
217
|
+
skills: [
|
|
218
|
+
{
|
|
219
|
+
id: "dialogue-comprehension",
|
|
220
|
+
name: "Dialogue Comprehension",
|
|
221
|
+
description: "Understand a dialogue exchange",
|
|
222
|
+
category: "conversation"
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
id: "polite-register",
|
|
226
|
+
name: "Polite Register",
|
|
227
|
+
description: "Use the appropriate level of politeness",
|
|
228
|
+
category: "conversation"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
id: "situational-response",
|
|
232
|
+
name: "Situational Response",
|
|
233
|
+
description: "Choose the correct response for a given situation",
|
|
234
|
+
category: "conversation"
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
}
|
|
238
|
+
];
|
|
239
|
+
i.flatMap((r) => r.skills.map((a) => a.id));
|
|
240
|
+
Object.fromEntries(i.flatMap((r) => r.skills.map((a) => [a.id, a])));
|
|
241
|
+
export {
|
|
242
|
+
s as c
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=skills-hcn-pGD0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-hcn-pGD0.js","sources":["../../../shared/dist/loader.js","../../../shared/dist/skills.js"],"sourcesContent":["/**\n * MDX content loading utilities\n */\nimport { buildLessonFromMDX } from '@syllst/processor';\n/**\n * Creates a content loader for a syllabus package.\n *\n * @param config - Syllabus configuration\n * @param lessonLoader - Function that imports MDX content for a lesson number\n * @returns ContentLoader implementation\n *\n * @example\n * ```ts\n * const loader = createContentLoader(\n * { id: 'th-alphabet', title: 'Thai Alphabet', ... },\n * async (n) => import(`./lessons/lesson-${n.toString().padStart(2, '0')}.mdx?raw`)\n * );\n * ```\n */\nexport function createContentLoader(config, lessonLoader) {\n return {\n config,\n async loadLesson(lessonNumber) {\n if (lessonNumber < 1 || lessonNumber > config.lessonCount) {\n return null;\n }\n try {\n const { default: rawContent } = await lessonLoader(lessonNumber);\n const ast = await buildLessonFromMDX(rawContent);\n return {\n lessonNumber,\n ast,\n rawContent,\n };\n }\n catch (error) {\n console.error(`Failed to load lesson ${lessonNumber}:`, error);\n return null;\n }\n },\n async loadAllLessons() {\n const lessons = [];\n for (let i = 1; i <= config.lessonCount; i++) {\n const lesson = await this.loadLesson(i);\n if (lesson) {\n lessons.push(lesson);\n }\n }\n return lessons;\n },\n getAvailableLessons() {\n return Array.from({ length: config.lessonCount }, (_, i) => i + 1);\n },\n };\n}\n/**\n * Extracts vocabulary items from a lesson AST.\n */\nexport function extractVocabularyItems(lesson) {\n const items = [];\n function walk(node) {\n if (!node || typeof node !== 'object')\n return;\n const n = node;\n if (n.type === 'vocabularyItem') {\n items.push({\n id: n.id,\n word: n.word,\n translation: n.translation,\n romanization: n.romanization,\n });\n }\n if (Array.isArray(n.children)) {\n n.children.forEach(walk);\n }\n }\n walk(lesson);\n return items;\n}\n/**\n * Extracts character items from a lesson AST.\n */\nexport function extractCharacterItems(lesson) {\n const items = [];\n function walk(node) {\n if (!node || typeof node !== 'object')\n return;\n const n = node;\n if (n.type === 'characterItem') {\n items.push({\n id: n.id,\n char: n.char,\n name: n.name,\n romanization: (typeof n.romanization === 'string' ? n.romanization : undefined),\n charType: n.charType,\n });\n }\n if (Array.isArray(n.children)) {\n n.children.forEach(walk);\n }\n }\n walk(lesson);\n return items;\n}\n/**\n * Extracts exercise skill information from a lesson AST.\n */\nexport function extractExerciseSkills(lesson) {\n const items = [];\n function walk(node) {\n if (!node || typeof node !== 'object')\n return;\n const n = node;\n if (n.type === 'exercise') {\n items.push({\n id: n.id,\n skill: n.skill,\n tests: n.tests,\n objectiveId: n.objectiveId,\n exerciseType: n.exerciseType,\n });\n }\n if (Array.isArray(n.children)) {\n n.children.forEach(walk);\n }\n }\n walk(lesson);\n return items;\n}\n/**\n * Extracts phonological rule nodes from a lesson AST.\n */\nexport function extractPhonologicalRules(lesson) {\n const items = [];\n function walk(node) {\n if (!node || typeof node !== 'object')\n return;\n const n = node;\n if (n.type === 'phonologicalRule') {\n const children = n.children || [];\n const conditionCount = children.filter((c) => c?.type === 'ruleCondition').length;\n items.push({\n id: n.id,\n title: n.title,\n ruleType: n.ruleType,\n conditionCount,\n });\n }\n if (Array.isArray(n.children)) {\n n.children.forEach(walk);\n }\n }\n walk(lesson);\n return items;\n}\n//# sourceMappingURL=loader.js.map","/**\n * Skill Taxonomy for Language Learning\n *\n * Defines the standard skill categories and individual skills\n * that can be tracked across exercises and learning objectives.\n * These skill IDs are used in exercise `skill` fields and\n * learning objective `skill` fields to enable granular tracking.\n */\n/**\n * Core skill categories for language learning.\n * Language-specific packages can extend with additional skills.\n */\nexport const SKILL_CATEGORIES = [\n {\n id: 'character',\n name: 'Character Skills',\n description: 'Skills related to recognizing, writing, and producing characters',\n skills: [\n {\n id: 'character-recognition',\n name: 'Character Recognition',\n description: 'Identify a character from its visual form',\n category: 'character',\n },\n {\n id: 'character-production',\n name: 'Character Production',\n description: 'Write or produce a character from memory',\n category: 'character',\n },\n {\n id: 'character-sound-mapping',\n name: 'Character-Sound Mapping',\n description: 'Map a character to its pronunciation',\n category: 'character',\n },\n {\n id: 'character-name-recall',\n name: 'Character Name Recall',\n description: 'Recall the name or mnemonic of a character',\n category: 'character',\n },\n {\n id: 'character-class-identification',\n name: 'Character Class Identification',\n description: 'Identify the class/category of a character (e.g., consonant class)',\n category: 'character',\n },\n ],\n },\n {\n id: 'phonology',\n name: 'Phonology Skills',\n description: 'Skills related to sound systems, tone rules, and pronunciation',\n skills: [\n {\n id: 'tone-rule-application',\n name: 'Tone Rule Application',\n description: 'Apply tone rules to determine correct pronunciation',\n category: 'phonology',\n },\n {\n id: 'tone-perception',\n name: 'Tone Perception',\n description: 'Distinguish between different tones in spoken language',\n category: 'phonology',\n },\n {\n id: 'tone-production',\n name: 'Tone Production',\n description: 'Produce correct tones in speech',\n category: 'phonology',\n },\n {\n id: 'syllable-analysis',\n name: 'Syllable Analysis',\n description: 'Break words into syllables and identify syllable types',\n category: 'phonology',\n },\n {\n id: 'sound-change-recognition',\n name: 'Sound Change Recognition',\n description: 'Recognize phonological processes like assimilation or elision',\n category: 'phonology',\n },\n ],\n },\n {\n id: 'vocabulary',\n name: 'Vocabulary Skills',\n description: 'Skills related to word knowledge and usage',\n skills: [\n {\n id: 'word-recognition',\n name: 'Word Recognition',\n description: 'Recognize a word and recall its meaning',\n category: 'vocabulary',\n },\n {\n id: 'word-production',\n name: 'Word Production',\n description: 'Produce the correct word for a given meaning',\n category: 'vocabulary',\n },\n {\n id: 'word-pronunciation',\n name: 'Word Pronunciation',\n description: 'Pronounce a word correctly (transcription recall)',\n category: 'vocabulary',\n },\n {\n id: 'word-spelling',\n name: 'Word Spelling',\n description: 'Spell a word correctly in the target script',\n category: 'vocabulary',\n },\n ],\n },\n {\n id: 'grammar',\n name: 'Grammar Skills',\n description: 'Skills related to grammatical patterns and sentence construction',\n skills: [\n {\n id: 'pattern-recognition',\n name: 'Pattern Recognition',\n description: 'Recognize a grammatical pattern in context',\n category: 'grammar',\n },\n {\n id: 'pattern-application',\n name: 'Pattern Application',\n description: 'Apply a grammatical pattern to construct sentences',\n category: 'grammar',\n },\n {\n id: 'particle-usage',\n name: 'Particle Usage',\n description: 'Use grammatical particles correctly',\n category: 'grammar',\n },\n {\n id: 'word-order',\n name: 'Word Order',\n description: 'Arrange words in the correct order',\n category: 'grammar',\n },\n ],\n },\n {\n id: 'reading',\n name: 'Reading Skills',\n description: 'Skills related to reading comprehension',\n skills: [\n {\n id: 'text-decoding',\n name: 'Text Decoding',\n description: 'Read and decode text in the target script',\n category: 'reading',\n },\n {\n id: 'reading-comprehension',\n name: 'Reading Comprehension',\n description: 'Understand the meaning of a passage',\n category: 'reading',\n },\n ],\n },\n {\n id: 'writing',\n name: 'Writing Skills',\n description: 'Skills related to the writing system',\n skills: [\n {\n id: 'stroke-order',\n name: 'Stroke Order',\n description: 'Write characters with correct stroke order',\n category: 'writing',\n },\n {\n id: 'vowel-positioning',\n name: 'Vowel Positioning',\n description: 'Place vowel marks in the correct position relative to consonants',\n category: 'writing',\n },\n {\n id: 'tone-mark-placement',\n name: 'Tone Mark Placement',\n description: 'Place tone marks correctly on syllables',\n category: 'writing',\n },\n ],\n },\n {\n id: 'conversation',\n name: 'Conversation Skills',\n description: 'Skills related to dialogue and conversation',\n skills: [\n {\n id: 'dialogue-comprehension',\n name: 'Dialogue Comprehension',\n description: 'Understand a dialogue exchange',\n category: 'conversation',\n },\n {\n id: 'polite-register',\n name: 'Polite Register',\n description: 'Use the appropriate level of politeness',\n category: 'conversation',\n },\n {\n id: 'situational-response',\n name: 'Situational Response',\n description: 'Choose the correct response for a given situation',\n category: 'conversation',\n },\n ],\n },\n];\n/**\n * Flat list of all skill IDs for quick lookup\n */\nexport const ALL_SKILL_IDS = SKILL_CATEGORIES.flatMap((cat) => cat.skills.map((s) => s.id));\n/**\n * Map from skill ID to Skill object\n */\nexport const SKILL_MAP = Object.fromEntries(SKILL_CATEGORIES.flatMap((cat) => cat.skills.map((s) => [s.id, s])));\n/**\n * Check if a skill ID is valid (exists in the taxonomy)\n */\nexport function isValidSkillId(skillId) {\n return skillId in SKILL_MAP;\n}\n/**\n * Get skill info by ID, returns undefined if not found\n */\nexport function getSkill(skillId) {\n return SKILL_MAP[skillId];\n}\n/**\n * Get all skills in a category\n */\nexport function getSkillsByCategory(categoryId) {\n const category = SKILL_CATEGORIES.find((c) => c.id === categoryId);\n return category?.skills ?? [];\n}\n//# sourceMappingURL=skills.js.map"],"names":["createContentLoader","config","lessonLoader","lessonNumber","rawContent","ast","buildLessonFromMDX","error","lessons","i","lesson","_","SKILL_CATEGORIES","cat","s"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SyllabusConfig, ContentLoader } from '@syllst/content-shared';
|
|
2
2
|
export declare const config: SyllabusConfig;
|
|
3
3
|
export declare const loader: ContentLoader;
|
|
4
|
-
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson>;
|
|
4
|
+
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson | null>;
|
|
5
5
|
export declare const loadAllLessons: () => Promise<import('@syllst/content-shared').LoadedLesson[]>;
|
|
6
6
|
export declare const getAvailableLessons: () => number[];
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { c as l, g as e, a as n, b as r, l as d } from "../../index-
|
|
1
|
+
import "../../skills-hcn-pGD0.js";
|
|
2
|
+
import { c as l, g as e, a as n, b as r, l as d } from "../../index-ByS0o5dz.js";
|
|
3
3
|
export {
|
|
4
4
|
l as config,
|
|
5
5
|
e as getAvailableLessons,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SyllabusConfig, ContentLoader } from '@syllst/content-shared';
|
|
2
2
|
export declare const config: SyllabusConfig;
|
|
3
3
|
export declare const loader: ContentLoader;
|
|
4
|
-
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson>;
|
|
4
|
+
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson | null>;
|
|
5
5
|
export declare const loadAllLessons: () => Promise<import('@syllst/content-shared').LoadedLesson[]>;
|
|
6
6
|
export declare const getAvailableLessons: () => number[];
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { c as l, g as e, a as n, b as r, l as d } from "../../index-
|
|
1
|
+
import "../../skills-hcn-pGD0.js";
|
|
2
|
+
import { c as l, g as e, a as n, b as r, l as d } from "../../index-Bjym0crS.js";
|
|
3
3
|
export {
|
|
4
4
|
l as config,
|
|
5
5
|
e as getAvailableLessons,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SyllabusConfig, ContentLoader } from '@syllst/content-shared';
|
|
2
2
|
export declare const config: SyllabusConfig;
|
|
3
3
|
export declare const loader: ContentLoader;
|
|
4
|
-
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson>;
|
|
4
|
+
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson | null>;
|
|
5
5
|
export declare const loadAllLessons: () => Promise<import('@syllst/content-shared').LoadedLesson[]>;
|
|
6
6
|
export declare const getAvailableLessons: () => number[];
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { c as l, g as e, a as n, b as r, l as d } from "../../index-
|
|
1
|
+
import "../../skills-hcn-pGD0.js";
|
|
2
|
+
import { c as l, g as e, a as n, b as r, l as d } from "../../index-C9VnG7dT.js";
|
|
3
3
|
export {
|
|
4
4
|
l as config,
|
|
5
5
|
e as getAvailableLessons,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SyllabusConfig, ContentLoader } from '@syllst/content-shared';
|
|
2
2
|
export declare const config: SyllabusConfig;
|
|
3
3
|
export declare const loader: ContentLoader;
|
|
4
|
-
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson>;
|
|
4
|
+
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson | null>;
|
|
5
5
|
export declare const loadAllLessons: () => Promise<import('@syllst/content-shared').LoadedLesson[]>;
|
|
6
6
|
export declare const getAvailableLessons: () => number[];
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { c as l, g as e, a as n, b as r, l as d } from "../../index-
|
|
1
|
+
import "../../skills-hcn-pGD0.js";
|
|
2
|
+
import { c as l, g as e, a as n, b as r, l as d } from "../../index-BM-LWlCm.js";
|
|
3
3
|
export {
|
|
4
4
|
l as config,
|
|
5
5
|
e as getAvailableLessons,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SyllabusConfig, ContentLoader } from '@syllst/content-shared';
|
|
2
2
|
export declare const config: SyllabusConfig;
|
|
3
3
|
export declare const loader: ContentLoader;
|
|
4
|
-
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson>;
|
|
4
|
+
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson | null>;
|
|
5
5
|
export declare const loadAllLessons: () => Promise<import('@syllst/content-shared').LoadedLesson[]>;
|
|
6
6
|
export declare const getAvailableLessons: () => number[];
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { c as l, g as e, a as n, b as r, l as d } from "../../index-
|
|
1
|
+
import "../../skills-hcn-pGD0.js";
|
|
2
|
+
import { c as l, g as e, a as n, b as r, l as d } from "../../index-BuKXw7-Z.js";
|
|
3
3
|
export {
|
|
4
4
|
l as config,
|
|
5
5
|
e as getAvailableLessons,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SyllabusConfig, ContentLoader } from '@syllst/content-shared';
|
|
2
2
|
export declare const config: SyllabusConfig;
|
|
3
3
|
export declare const loader: ContentLoader;
|
|
4
|
-
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson>;
|
|
4
|
+
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson | null>;
|
|
5
5
|
export declare const loadAllLessons: () => Promise<import('@syllst/content-shared').LoadedLesson[]>;
|
|
6
6
|
export declare const getAvailableLessons: () => number[];
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { c as l, g as e, a as n, b as r, l as d } from "../../index-
|
|
1
|
+
import "../../skills-hcn-pGD0.js";
|
|
2
|
+
import { c as l, g as e, a as n, b as r, l as d } from "../../index-CkHd3Fal.js";
|
|
3
3
|
export {
|
|
4
4
|
l as config,
|
|
5
5
|
e as getAvailableLessons,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SyllabusConfig, ContentLoader } from '@syllst/content-shared';
|
|
2
2
|
export declare const config: SyllabusConfig;
|
|
3
3
|
export declare const loader: ContentLoader;
|
|
4
|
-
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson>;
|
|
4
|
+
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson | null>;
|
|
5
5
|
export declare const loadAllLessons: () => Promise<import('@syllst/content-shared').LoadedLesson[]>;
|
|
6
6
|
export declare const getAvailableLessons: () => number[];
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { c as l, g as e, a as n, b as r, l as d } from "../../index-
|
|
1
|
+
import "../../skills-hcn-pGD0.js";
|
|
2
|
+
import { c as l, g as e, a as n, b as r, l as d } from "../../index-CPQkjFjV.js";
|
|
3
3
|
export {
|
|
4
4
|
l as config,
|
|
5
5
|
e as getAvailableLessons,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SyllabusConfig, ContentLoader } from '@syllst/content-shared';
|
|
2
2
|
export declare const config: SyllabusConfig;
|
|
3
3
|
export declare const loader: ContentLoader;
|
|
4
|
-
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson>;
|
|
4
|
+
export declare const loadLesson: (lessonNumber: number) => Promise<import('@syllst/content-shared').LoadedLesson | null>;
|
|
5
5
|
export declare const loadAllLessons: () => Promise<import('@syllst/content-shared').LoadedLesson[]>;
|
|
6
6
|
export declare const getAvailableLessons: () => number[];
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../../
|
|
2
|
-
import { c as l, g as e, a as n, b as r, l as d } from "../../index-
|
|
1
|
+
import "../../skills-hcn-pGD0.js";
|
|
2
|
+
import { c as l, g as e, a as n, b as r, l as d } from "../../index-DBkPBXe2.js";
|
|
3
3
|
export {
|
|
4
4
|
l as config,
|
|
5
5
|
e as getAvailableLessons,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syllst/th",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Thai SYLLST content - all Thai language syllabi in one package",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -56,12 +56,12 @@
|
|
|
56
56
|
"tsx": "^4.7.0",
|
|
57
57
|
"vite": "^5.4.0",
|
|
58
58
|
"vite-plugin-dts": "^4.0.0",
|
|
59
|
-
"@laeng/th": "0.
|
|
60
|
-
"@syllst/content-shared": "0.
|
|
59
|
+
"@laeng/th": "0.2.0",
|
|
60
|
+
"@syllst/content-shared": "0.2.0"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
|
-
"@syllst/core": "^0.
|
|
64
|
-
"@syllst/processor": "^0.
|
|
63
|
+
"@syllst/core": "^0.4.0",
|
|
64
|
+
"@syllst/processor": "^0.4.0"
|
|
65
65
|
},
|
|
66
66
|
"publishConfig": {
|
|
67
67
|
"access": "public"
|
|
@@ -14,11 +14,22 @@ categories:
|
|
|
14
14
|
metadata:
|
|
15
15
|
estimatedTime: 25
|
|
16
16
|
prerequisites: []
|
|
17
|
-
|
|
18
|
-
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
learningObjectives:
|
|
18
|
+
- id: obj-recognize-mid-1
|
|
19
|
+
description: "Recognize the first 6 middle-class consonants"
|
|
20
|
+
skill: character-recognition
|
|
21
|
+
references: [chicken, plate, child, turtle, fish, leaf]
|
|
22
|
+
- id: obj-class-understanding
|
|
23
|
+
description: "Understand why consonant class matters for tones"
|
|
24
|
+
skill: character-class-identification
|
|
25
|
+
- id: obj-mnemonics-1
|
|
26
|
+
description: "Learn the mnemonic words for each consonant"
|
|
27
|
+
skill: character-name-recall
|
|
28
|
+
references: [chicken, plate, child, turtle, fish, leaf]
|
|
29
|
+
- id: obj-sounds-1
|
|
30
|
+
description: "Practice initial and final sounds"
|
|
31
|
+
skill: character-sound-mapping
|
|
32
|
+
references: [chicken, plate, child, turtle, fish, leaf]
|
|
22
33
|
---
|
|
23
34
|
|
|
24
35
|
# บทที่ 1 (Lesson 1) — Middle-Class Consonants I
|
|
@@ -41,17 +52,17 @@ Think of middle class as "neutral" — the other classes modify from this baseli
|
|
|
41
52
|
|
|
42
53
|
:::character-set{id="thai-middle-consonants-1" title="Middle-Class Consonants I"}
|
|
43
54
|
|
|
44
|
-
::character{id="
|
|
55
|
+
::character{id="chicken" canonicalRef="chicken" data:class="middle" char="ก" name="ก ไก่ (gɔɔ gài)" nativeName="ก ไก่" transliteration="g/k" charType="consonant"}
|
|
45
56
|
|
|
46
|
-
::character{id="
|
|
57
|
+
::character{id="plate" canonicalRef="plate" data:class="middle" char="จ" name="จ จาน (jɔɔ jaan)" nativeName="จ จาน" transliteration="j/t" charType="consonant"}
|
|
47
58
|
|
|
48
|
-
::character{id="
|
|
59
|
+
::character{id="child" canonicalRef="child" data:class="middle" char="ด" name="ด เด็ก (dɔɔ dèk)" nativeName="ด เด็ก" transliteration="d/t" charType="consonant"}
|
|
49
60
|
|
|
50
|
-
::character{id="
|
|
61
|
+
::character{id="turtle" canonicalRef="turtle" data:class="middle" char="ต" name="ต เต่า (dtɔɔ dtào)" nativeName="ต เต่า" transliteration="dt/t" charType="consonant"}
|
|
51
62
|
|
|
52
|
-
::character{id="
|
|
63
|
+
::character{id="fish" canonicalRef="fish" data:class="middle" char="ป" name="ป ปลา (bpɔɔ bplaa)" nativeName="ป ปลา" transliteration="bp/p" charType="consonant"}
|
|
53
64
|
|
|
54
|
-
::character{id="
|
|
65
|
+
::character{id="leaf" canonicalRef="leaf" data:class="middle" char="บ" name="บ ใบไม้ (bɔɔ baimáai)" nativeName="บ ใบไม้" transliteration="b/p" charType="consonant"}
|
|
55
66
|
|
|
56
67
|
:::
|
|
57
68
|
|
|
@@ -101,7 +112,7 @@ Shape similarities within pairs (ด/ต, ป/บ) are intentional — they repr
|
|
|
101
112
|
|
|
102
113
|
## Quick Quiz
|
|
103
114
|
|
|
104
|
-
:::exercise{id="quiz-01" type="matching" title="Match Consonants to Animals"}
|
|
115
|
+
:::exercise{id="quiz-01" type="matching" title="Match Consonants to Animals" skill="character-name-recall" tests="chicken,turtle,fish" objectiveId="obj-mnemonics-1"}
|
|
105
116
|
|
|
106
117
|
**Question:** Match each consonant to its mnemonic animal
|
|
107
118
|
|
|
@@ -119,7 +130,7 @@ Shape similarities within pairs (ด/ต, ป/บ) are intentional — they repr
|
|
|
119
130
|
|
|
120
131
|
:::
|
|
121
132
|
|
|
122
|
-
:::exercise{id="recognition-01" type="fill-in-blank" title="Sound Recognition"}
|
|
133
|
+
:::exercise{id="recognition-01" type="fill-in-blank" title="Sound Recognition" skill="character-sound-mapping" tests="chicken,plate,fish" objectiveId="obj-sounds-1"}
|
|
123
134
|
|
|
124
135
|
**Question:** Which consonant makes each sound?
|
|
125
136
|
|