@polyglot-bundles/vi-minimal-pairs 0.2.1 → 0.2.3

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.
@@ -0,0 +1,3 @@
1
+ import { MinimalPairsMinimalPair } from '../../../content-shared';
2
+ export declare const level0Pairs: MinimalPairsMinimalPair[];
3
+ //# sourceMappingURL=level-0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-0.d.ts","sourceRoot":"","sources":["../../src/data/level-0.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEhF,eAAO,MAAM,WAAW,EAAE,uBAAuB,EAmBhD,CAAC"}
@@ -0,0 +1,23 @@
1
+ const i = [
2
+ {
3
+ pairId: "vi_l0_001",
4
+ level: 0,
5
+ tags: ["level_0"],
6
+ contrastFeature: "consonant",
7
+ contrastDescription: "/k/ vs /t/",
8
+ word1: { script: "ca", romanization: "ca", definition: "fish; song", audioFile: null },
9
+ word2: { script: "ta", romanization: "ta", definition: "we", audioFile: null }
10
+ },
11
+ {
12
+ pairId: "vi_l0_002",
13
+ level: 0,
14
+ tags: ["level_0"],
15
+ contrastFeature: "consonant",
16
+ contrastDescription: "/m/ vs /n/",
17
+ word1: { script: "mẹ", romanization: "mẹ", definition: "mother", audioFile: null },
18
+ word2: { script: "nẹ", romanization: "nẹ", definition: "(dialectal)", audioFile: null }
19
+ }
20
+ ];
21
+ export {
22
+ i as level0Pairs
23
+ };
@@ -0,0 +1,3 @@
1
+ import { MinimalPairsMinimalPair } from '../../../content-shared';
2
+ export declare const level1Pairs: MinimalPairsMinimalPair[];
3
+ //# sourceMappingURL=level-1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-1.d.ts","sourceRoot":"","sources":["../../src/data/level-1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEhF,eAAO,MAAM,WAAW,EAAE,uBAAuB,EAkEhD,CAAC"}
@@ -0,0 +1,70 @@
1
+ const i = [
2
+ {
3
+ pairId: "vi_l1_001",
4
+ level: 1,
5
+ tags: ["level_1", "tone"],
6
+ contrastFeature: "tone",
7
+ contrastDescription: "ngang (mid level) vs sắc (high rising)",
8
+ pronunciationTipId: "tone_ngang_sac",
9
+ word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
10
+ word2: { script: "má", romanization: "má", definition: "mother; cheek", audioFile: null }
11
+ },
12
+ {
13
+ pairId: "vi_l1_002",
14
+ level: 1,
15
+ tags: ["level_1", "tone"],
16
+ contrastFeature: "tone",
17
+ contrastDescription: "ngang (mid level) vs huyền (low falling)",
18
+ word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
19
+ word2: { script: "mà", romanization: "mà", definition: "but; that", audioFile: null }
20
+ },
21
+ {
22
+ pairId: "vi_l1_003",
23
+ level: 1,
24
+ tags: ["level_1", "tone"],
25
+ contrastFeature: "tone",
26
+ contrastDescription: "ngang (mid level) vs hỏi (dipping)",
27
+ word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
28
+ word2: { script: "mả", romanization: "mả", definition: "grave; tomb", audioFile: null }
29
+ },
30
+ {
31
+ pairId: "vi_l1_004",
32
+ level: 1,
33
+ tags: ["level_1", "tone"],
34
+ contrastFeature: "tone",
35
+ contrastDescription: "ngang (mid level) vs ngã (creaky rising)",
36
+ word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
37
+ word2: { script: "mã", romanization: "mã", definition: "horse; code", audioFile: null }
38
+ },
39
+ {
40
+ pairId: "vi_l1_005",
41
+ level: 1,
42
+ tags: ["level_1", "tone"],
43
+ contrastFeature: "tone",
44
+ contrastDescription: "ngang (mid level) vs nặng (glottalized low)",
45
+ word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
46
+ word2: { script: "mạ", romanization: "mạ", definition: "rice seedling", audioFile: null }
47
+ },
48
+ {
49
+ pairId: "vi_l1_006",
50
+ level: 1,
51
+ tags: ["level_1", "tone"],
52
+ contrastFeature: "tone",
53
+ contrastDescription: "sắc (high rising) vs ngã (creaky rising)",
54
+ word1: { script: "mái", romanization: "mái", definition: "roof", audioFile: null },
55
+ word2: { script: "mãi", romanization: "mãi", definition: "forever", audioFile: null }
56
+ },
57
+ {
58
+ pairId: "vi_l1_007",
59
+ level: 1,
60
+ tags: ["level_1", "tone"],
61
+ contrastFeature: "tone",
62
+ contrastDescription: "Full six-tone contrast on /a/",
63
+ word1: { script: "a", romanization: "a", definition: "ah!", audioFile: null },
64
+ word2: { script: "á", romanization: "á", definition: "oh! (surprise)", audioFile: null },
65
+ notes: "Complete series: a (ah!), á (oh!), à (ah...), ả (hả?), ã (ãh), ạ (ạ!)"
66
+ }
67
+ ];
68
+ export {
69
+ i as level1Pairs
70
+ };
@@ -0,0 +1,3 @@
1
+ import { MinimalPairsMinimalPair } from '../../../content-shared';
2
+ export declare const level2Pairs: MinimalPairsMinimalPair[];
3
+ //# sourceMappingURL=level-2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-2.d.ts","sourceRoot":"","sources":["../../src/data/level-2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEhF,eAAO,MAAM,WAAW,EAAE,uBAAuB,EA+ChD,CAAC"}
@@ -0,0 +1,51 @@
1
+ const i = [
2
+ {
3
+ pairId: "vi_l2_001",
4
+ level: 2,
5
+ tags: ["level_2", "consonant"],
6
+ contrastFeature: "consonant",
7
+ contrastDescription: "/t/ vs /ɗ/ (voiceless vs implosive)",
8
+ pronunciationTipId: "consonant_t_d",
9
+ word1: { script: "tôi", romanization: "tôi", definition: "I", audioFile: null },
10
+ word2: { script: "đôi", romanization: "đôi", definition: "pair", audioFile: null }
11
+ },
12
+ {
13
+ pairId: "vi_l2_002",
14
+ level: 2,
15
+ tags: ["level_2", "consonant"],
16
+ contrastFeature: "consonant",
17
+ contrastDescription: "/s/ vs /x/",
18
+ word1: { script: "sa", romanization: "sa", definition: "to fall; to borrow", audioFile: null },
19
+ word2: { script: "xa", romanization: "xa", definition: "far", audioFile: null }
20
+ },
21
+ {
22
+ pairId: "vi_l2_003",
23
+ level: 2,
24
+ tags: ["level_2", "consonant"],
25
+ contrastFeature: "consonant",
26
+ contrastDescription: "/tr/ vs /ch/",
27
+ word1: { script: "trẻ", romanization: "trẻ", definition: "young", audioFile: null },
28
+ word2: { script: "chẻ", romanization: "chẻ", definition: "to split", audioFile: null }
29
+ },
30
+ {
31
+ pairId: "vi_l2_004",
32
+ level: 2,
33
+ tags: ["level_2", "consonant"],
34
+ contrastFeature: "consonant",
35
+ contrastDescription: "/g/ vs /k/",
36
+ word1: { script: "gây", romanization: "gây", definition: "to cause", audioFile: null },
37
+ word2: { script: "cây", romanization: "cây", definition: "tree", audioFile: null }
38
+ },
39
+ {
40
+ pairId: "vi_l2_005",
41
+ level: 2,
42
+ tags: ["level_2", "consonant"],
43
+ contrastFeature: "consonant",
44
+ contrastDescription: "/ŋ/ vs /ɲ/",
45
+ word1: { script: "ngà", romanization: "ngà", definition: "ivory", audioFile: null },
46
+ word2: { script: "nhà", romanization: "nhà", definition: "house", audioFile: null }
47
+ }
48
+ ];
49
+ export {
50
+ i as level2Pairs
51
+ };
@@ -0,0 +1,3 @@
1
+ import { MinimalPairsMinimalPair } from '../../../content-shared';
2
+ export declare const level3Pairs: MinimalPairsMinimalPair[];
3
+ //# sourceMappingURL=level-3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-3.d.ts","sourceRoot":"","sources":["../../src/data/level-3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEhF,eAAO,MAAM,WAAW,EAAE,uBAAuB,EAsChD,CAAC"}
@@ -0,0 +1,42 @@
1
+ const i = [
2
+ {
3
+ pairId: "vi_l3_001",
4
+ level: 3,
5
+ tags: ["level_3", "vowel"],
6
+ contrastFeature: "vowel",
7
+ contrastDescription: "/a/ vs /ɛ/",
8
+ pronunciationTipId: "vowel_a_e",
9
+ word1: { script: "cỏ", romanization: "cỏ", definition: "grass", audioFile: null },
10
+ word2: { script: "cá", romanization: "cá", definition: "fish", audioFile: null }
11
+ },
12
+ {
13
+ pairId: "vi_l3_002",
14
+ level: 3,
15
+ tags: ["level_3", "vowel"],
16
+ contrastFeature: "vowel",
17
+ contrastDescription: "/e/ vs /i/",
18
+ word1: { script: "tê", romanization: "tê", definition: "numb", audioFile: null },
19
+ word2: { script: "ti", romanization: "ti", definition: "small", audioFile: null }
20
+ },
21
+ {
22
+ pairId: "vi_l3_003",
23
+ level: 3,
24
+ tags: ["level_3", "vowel"],
25
+ contrastFeature: "vowel",
26
+ contrastDescription: "Monophthong vs diphthong",
27
+ word1: { script: "cây", romanization: "cây", definition: "tree", audioFile: null },
28
+ word2: { script: "cơi", romanization: "cơi", definition: "to open; enlarge", audioFile: null }
29
+ },
30
+ {
31
+ pairId: "vi_l3_004",
32
+ level: 3,
33
+ tags: ["level_3", "vowel"],
34
+ contrastFeature: "vowel",
35
+ contrastDescription: "/u/ vs /o/",
36
+ word1: { script: "tua", romanization: "tua", definition: "tentacle", audioFile: null },
37
+ word2: { script: "toa", romanization: "toa", definition: "train car", audioFile: null }
38
+ }
39
+ ];
40
+ export {
41
+ i as level3Pairs
42
+ };
@@ -0,0 +1,3 @@
1
+ import { MinimalPairsMinimalPair } from '../../../content-shared';
2
+ export declare const level4Pairs: MinimalPairsMinimalPair[];
3
+ //# sourceMappingURL=level-4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-4.d.ts","sourceRoot":"","sources":["../../src/data/level-4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEhF,eAAO,MAAM,WAAW,EAAE,uBAAuB,EA6BhD,CAAC"}
@@ -0,0 +1,33 @@
1
+ const i = [
2
+ {
3
+ pairId: "vi_l4_001",
4
+ level: 4,
5
+ tags: ["level_4", "final"],
6
+ contrastFeature: "final_consonant",
7
+ contrastDescription: "Final /-n/ vs final /-ŋ/",
8
+ pronunciationTipId: "final_n_ng",
9
+ word1: { script: "tân", romanization: "tân", definition: "new", audioFile: null },
10
+ word2: { script: "tâng", romanization: "tâng", definition: "to pitch; flatter", audioFile: null }
11
+ },
12
+ {
13
+ pairId: "vi_l4_002",
14
+ level: 4,
15
+ tags: ["level_4", "final"],
16
+ contrastFeature: "final_consonant",
17
+ contrastDescription: "Final /-n/ vs final /-k/",
18
+ word1: { script: "bạn", romanization: "bạn", definition: "friend", audioFile: null },
19
+ word2: { script: "bạc", romanization: "bạc", definition: "silver", audioFile: null }
20
+ },
21
+ {
22
+ pairId: "vi_l4_003",
23
+ level: 4,
24
+ tags: ["level_4", "final"],
25
+ contrastFeature: "final_consonant",
26
+ contrastDescription: "Final /-m/ vs final /-n/",
27
+ word1: { script: "tim", romanization: "tim", definition: "heart", audioFile: null },
28
+ word2: { script: "tin", romanization: "tin", definition: "news; tin", audioFile: null }
29
+ }
30
+ ];
31
+ export {
32
+ i as level4Pairs
33
+ };
@@ -0,0 +1,3 @@
1
+ import { MinimalPairsMinimalPair } from '../../../content-shared';
2
+ export declare const level5Pairs: MinimalPairsMinimalPair[];
3
+ //# sourceMappingURL=level-5.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-5.d.ts","sourceRoot":"","sources":["../../src/data/level-5.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEhF,eAAO,MAAM,WAAW,EAAE,uBAAuB,EAqBhD,CAAC"}
@@ -0,0 +1,25 @@
1
+ const i = [
2
+ {
3
+ pairId: "vi_l5_001",
4
+ level: 5,
5
+ tags: ["level_5", "tone"],
6
+ contrastFeature: "tone",
7
+ contrastDescription: "hỏi vs ngã (Northern distinction)",
8
+ word1: { script: "sửa", romanization: "sửa", definition: "to repair", audioFile: null },
9
+ word2: { script: "sữa", romanization: "sữa", definition: "milk", audioFile: null },
10
+ notes: "This distinction is maintained in Northern Vietnamese but merged in Southern"
11
+ },
12
+ {
13
+ pairId: "vi_l5_002",
14
+ level: 5,
15
+ tags: ["level_5", "consonant"],
16
+ contrastFeature: "consonant",
17
+ contrastDescription: "/l/ vs /n/ (regional variation)",
18
+ word1: { script: "lửa", romanization: "lửa", definition: "fire", audioFile: null },
19
+ word2: { script: "nửa", romanization: "nửa", definition: "half", audioFile: null },
20
+ notes: "Some Southern dialects merge /l/ and /n/. Northern speakers maintain the distinction."
21
+ }
22
+ ];
23
+ export {
24
+ i as level5Pairs
25
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAEjF,eAAO,MAAM,gBAAgB,EAAE,wBAsP9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAmBjF,eAAO,MAAM,gBAAgB,EAAE,wBAI9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
package/dist/data.js CHANGED
@@ -1,242 +1,24 @@
1
- const i = {
2
- levels: [
3
- { level: 0, title: "Getting Started", description: "Practice with clearly different sounds" },
4
- { level: 1, title: "Six Tones", description: "The Vietnamese tonal system" },
5
- { level: 2, title: "Initial Consonants", description: "Consonant contrasts at syllable start" },
6
- { level: 3, title: "Vowels", description: "Vietnamese vowel quality" },
7
- { level: 4, title: "Final Consonants", description: "Syllable-ending contrasts" },
8
- { level: 5, title: "Expert Level", description: "Subtle regional and phonetic distinctions" }
9
- ],
10
- minimalPairs: [
11
- // Level 0: Clear contrasts
12
- {
13
- pairId: "vi_l0_001",
14
- level: 0,
15
- tags: ["level_0"],
16
- contrastFeature: "consonant",
17
- contrastDescription: "/k/ vs /t/",
18
- word1: { script: "ca", romanization: "ca", definition: "fish; song", audioFile: null },
19
- word2: { script: "ta", romanization: "ta", definition: "we", audioFile: null }
20
- },
21
- {
22
- pairId: "vi_l0_002",
23
- level: 0,
24
- tags: ["level_0"],
25
- contrastFeature: "consonant",
26
- contrastDescription: "/m/ vs /n/",
27
- word1: { script: "mẹ", romanization: "mẹ", definition: "mother", audioFile: null },
28
- word2: { script: "nẹ", romanization: "nẹ", definition: "(dialectal)", audioFile: null }
29
- },
30
- // Level 1: The six tones of Vietnamese
31
- {
32
- pairId: "vi_l1_001",
33
- level: 1,
34
- tags: ["level_1", "tone"],
35
- contrastFeature: "tone",
36
- contrastDescription: "ngang (mid level) vs sắc (high rising)",
37
- pronunciationTipId: "tone_ngang_sac",
38
- word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
39
- word2: { script: "má", romanization: "má", definition: "mother; cheek", audioFile: null }
40
- },
41
- {
42
- pairId: "vi_l1_002",
43
- level: 1,
44
- tags: ["level_1", "tone"],
45
- contrastFeature: "tone",
46
- contrastDescription: "ngang (mid level) vs huyền (low falling)",
47
- word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
48
- word2: { script: "mà", romanization: "mà", definition: "but; that", audioFile: null }
49
- },
50
- {
51
- pairId: "vi_l1_003",
52
- level: 1,
53
- tags: ["level_1", "tone"],
54
- contrastFeature: "tone",
55
- contrastDescription: "ngang (mid level) vs hỏi (dipping)",
56
- word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
57
- word2: { script: "mả", romanization: "mả", definition: "grave; tomb", audioFile: null }
58
- },
59
- {
60
- pairId: "vi_l1_004",
61
- level: 1,
62
- tags: ["level_1", "tone"],
63
- contrastFeature: "tone",
64
- contrastDescription: "ngang (mid level) vs ngã (creaky rising)",
65
- word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
66
- word2: { script: "mã", romanization: "mã", definition: "horse; code", audioFile: null }
67
- },
68
- {
69
- pairId: "vi_l1_005",
70
- level: 1,
71
- tags: ["level_1", "tone"],
72
- contrastFeature: "tone",
73
- contrastDescription: "ngang (mid level) vs nặng (glottalized low)",
74
- word1: { script: "ma", romanization: "ma", definition: "ghost", audioFile: null },
75
- word2: { script: "mạ", romanization: "mạ", definition: "rice seedling", audioFile: null }
76
- },
77
- {
78
- pairId: "vi_l1_006",
79
- level: 1,
80
- tags: ["level_1", "tone"],
81
- contrastFeature: "tone",
82
- contrastDescription: "sắc (high rising) vs ngã (creaky rising)",
83
- word1: { script: "mái", romanization: "mái", definition: "roof", audioFile: null },
84
- word2: { script: "mãi", romanization: "mãi", definition: "forever", audioFile: null }
85
- },
86
- {
87
- pairId: "vi_l1_007",
88
- level: 1,
89
- tags: ["level_1", "tone"],
90
- contrastFeature: "tone",
91
- contrastDescription: "Full six-tone contrast on /a/",
92
- word1: { script: "a", romanization: "a", definition: "ah!", audioFile: null },
93
- word2: { script: "á", romanization: "á", definition: "oh! (surprise)", audioFile: null },
94
- notes: "Complete series: a (ah!), á (oh!), à (ah...), ả (hả?), ã (ãh), ạ (ạ!)"
95
- },
96
- // Level 2: Initial consonants
97
- {
98
- pairId: "vi_l2_001",
99
- level: 2,
100
- tags: ["level_2", "consonant"],
101
- contrastFeature: "consonant",
102
- contrastDescription: "/t/ vs /ɗ/ (voiceless vs implosive)",
103
- pronunciationTipId: "consonant_t_d",
104
- word1: { script: "tôi", romanization: "tôi", definition: "I", audioFile: null },
105
- word2: { script: "đôi", romanization: "đôi", definition: "pair", audioFile: null }
106
- },
107
- {
108
- pairId: "vi_l2_002",
109
- level: 2,
110
- tags: ["level_2", "consonant"],
111
- contrastFeature: "consonant",
112
- contrastDescription: "/s/ vs /x/",
113
- word1: { script: "sa", romanization: "sa", definition: "to fall; to borrow", audioFile: null },
114
- word2: { script: "xa", romanization: "xa", definition: "far", audioFile: null }
115
- },
116
- {
117
- pairId: "vi_l2_003",
118
- level: 2,
119
- tags: ["level_2", "consonant"],
120
- contrastFeature: "consonant",
121
- contrastDescription: "/tr/ vs /ch/",
122
- word1: { script: "trẻ", romanization: "trẻ", definition: "young", audioFile: null },
123
- word2: { script: "chẻ", romanization: "chẻ", definition: "to split", audioFile: null }
124
- },
125
- {
126
- pairId: "vi_l2_004",
127
- level: 2,
128
- tags: ["level_2", "consonant"],
129
- contrastFeature: "consonant",
130
- contrastDescription: "/g/ vs /k/",
131
- word1: { script: "gây", romanization: "gây", definition: "to cause", audioFile: null },
132
- word2: { script: "cây", romanization: "cây", definition: "tree", audioFile: null }
133
- },
134
- {
135
- pairId: "vi_l2_005",
136
- level: 2,
137
- tags: ["level_2", "consonant"],
138
- contrastFeature: "consonant",
139
- contrastDescription: "/ŋ/ vs /ɲ/",
140
- word1: { script: "ngà", romanization: "ngà", definition: "ivory", audioFile: null },
141
- word2: { script: "nhà", romanization: "nhà", definition: "house", audioFile: null }
142
- },
143
- // Level 3: Vowels
144
- {
145
- pairId: "vi_l3_001",
146
- level: 3,
147
- tags: ["level_3", "vowel"],
148
- contrastFeature: "vowel",
149
- contrastDescription: "/a/ vs /ɛ/",
150
- pronunciationTipId: "vowel_a_e",
151
- word1: { script: "cỏ", romanization: "cỏ", definition: "grass", audioFile: null },
152
- word2: { script: "cá", romanization: "cá", definition: "fish", audioFile: null }
153
- },
154
- {
155
- pairId: "vi_l3_002",
156
- level: 3,
157
- tags: ["level_3", "vowel"],
158
- contrastFeature: "vowel",
159
- contrastDescription: "/e/ vs /i/",
160
- word1: { script: "tê", romanization: "tê", definition: "numb", audioFile: null },
161
- word2: { script: "ti", romanization: "ti", definition: "small", audioFile: null }
162
- },
163
- {
164
- pairId: "vi_l3_003",
165
- level: 3,
166
- tags: ["level_3", "vowel"],
167
- contrastFeature: "vowel",
168
- contrastDescription: "Monophthong vs diphthong",
169
- word1: { script: "cây", romanization: "cây", definition: "tree", audioFile: null },
170
- word2: { script: "cơi", romanization: "cơi", definition: "to open; enlarge", audioFile: null }
171
- },
172
- {
173
- pairId: "vi_l3_004",
174
- level: 3,
175
- tags: ["level_3", "vowel"],
176
- contrastFeature: "vowel",
177
- contrastDescription: "/u/ vs /o/",
178
- word1: { script: "tua", romanization: "tua", definition: "tentacle", audioFile: null },
179
- word2: { script: "toa", romanization: "toa", definition: "train car", audioFile: null }
180
- },
181
- // Level 4: Final consonants
182
- {
183
- pairId: "vi_l4_001",
184
- level: 4,
185
- tags: ["level_4", "final"],
186
- contrastFeature: "final_consonant",
187
- contrastDescription: "Final /-n/ vs final /-ŋ/",
188
- pronunciationTipId: "final_n_ng",
189
- word1: { script: "tân", romanization: "tân", definition: "new", audioFile: null },
190
- word2: { script: "tâng", romanization: "tâng", definition: "to pitch; flatter", audioFile: null }
191
- },
192
- {
193
- pairId: "vi_l4_002",
194
- level: 4,
195
- tags: ["level_4", "final"],
196
- contrastFeature: "final_consonant",
197
- contrastDescription: "Final /-n/ vs final /-k/",
198
- word1: { script: "bạn", romanization: "bạn", definition: "friend", audioFile: null },
199
- word2: { script: "bạc", romanization: "bạc", definition: "silver", audioFile: null }
200
- },
201
- {
202
- pairId: "vi_l4_003",
203
- level: 4,
204
- tags: ["level_4", "final"],
205
- contrastFeature: "final_consonant",
206
- contrastDescription: "Final /-m/ vs final /-n/",
207
- word1: { script: "tim", romanization: "tim", definition: "heart", audioFile: null },
208
- word2: { script: "tin", romanization: "tin", definition: "news; tin", audioFile: null }
209
- },
210
- // Level 5: Expert - subtle distinctions
211
- {
212
- pairId: "vi_l5_001",
213
- level: 5,
214
- tags: ["level_5", "tone"],
215
- contrastFeature: "tone",
216
- contrastDescription: "hỏi vs ngã (Northern distinction)",
217
- word1: { script: "sửa", romanization: "sửa", definition: "to repair", audioFile: null },
218
- word2: { script: "sữa", romanization: "sữa", definition: "milk", audioFile: null },
219
- notes: "This distinction is maintained in Northern Vietnamese but merged in Southern"
220
- },
221
- {
222
- pairId: "vi_l5_002",
223
- level: 5,
224
- tags: ["level_5", "consonant"],
225
- contrastFeature: "consonant",
226
- contrastDescription: "/l/ vs /n/ (regional variation)",
227
- word1: { script: "lửa", romanization: "lửa", definition: "fire", audioFile: null },
228
- word2: { script: "nửa", romanization: "nửa", definition: "half", audioFile: null },
229
- notes: "Some Southern dialects merge /l/ and /n/. Northern speakers maintain the distinction."
230
- }
231
- ],
232
- pronunciationTips: {
233
- tone_ngang_sac: "ngang (mid): level, neutral. sắc (high rising): starts mid, rises sharply like a question in English.",
234
- consonant_t_d: "/t/ is voiceless with no aspiration. /ɗ/ (đ) is implosive - pull the glottis down while making the sound.",
235
- vowel_a_e: "/a/ is open central. /ɛ/ (e) is open-mid front. Vietnamese has many vowel qualities.",
236
- final_n_ng: "/-n/ is alveolar (tongue on ridge). /-ŋ/ (ng) is velar (back of tongue against soft palate)."
237
- }
1
+ import { levels as r } from "./levels.js";
2
+ import { pronunciationTips as i } from "./pronunciationTips.js";
3
+ import { level0Pairs as o } from "./data/level-0.js";
4
+ import { level1Pairs as m } from "./data/level-1.js";
5
+ import { level2Pairs as l } from "./data/level-2.js";
6
+ import { level3Pairs as a } from "./data/level-3.js";
7
+ import { level4Pairs as e } from "./data/level-4.js";
8
+ import { level5Pairs as s } from "./data/level-5.js";
9
+ const t = [
10
+ ...o,
11
+ ...m,
12
+ ...l,
13
+ ...a,
14
+ ...e,
15
+ ...s
16
+ ], x = {
17
+ levels: r,
18
+ minimalPairs: t,
19
+ pronunciationTips: i
238
20
  };
239
21
  export {
240
- i as default,
241
- i as minimalPairsData
22
+ x as default,
23
+ x as minimalPairsData
242
24
  };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,11 @@
1
1
  export { minimalPairsData as default } from './data';
2
- export { minimalPairsData } from './data';
2
+ export { levels } from './levels';
3
+ export { pronunciationTips } from './pronunciationTips';
4
+ export { level0Pairs } from './data/level-0';
5
+ export { level1Pairs } from './data/level-1';
6
+ export { level2Pairs } from './data/level-2';
7
+ export { level3Pairs } from './data/level-3';
8
+ export { level4Pairs } from './data/level-4';
9
+ export { level5Pairs } from './data/level-5';
3
10
  export type { MinimalPairsLanguageData, MinimalPairsLevelInfo, MinimalPairsMinimalPair, MinimalPairsPronunciationTipsMap, MinimalPairsRubySegment, MinimalPairsWordInfo, } from '../../content-shared';
4
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAG1C,YAAY,EACV,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGrD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,YAAY,EACV,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,kCAAkC,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,20 @@
1
- import { default as e, default as f } from "./data.js";
1
+ import { default as o } from "./data.js";
2
+ import { levels as p } from "./levels.js";
3
+ import { pronunciationTips as f } from "./pronunciationTips.js";
4
+ import { level0Pairs as m } from "./data/level-0.js";
5
+ import { level1Pairs as a } from "./data/level-1.js";
6
+ import { level2Pairs as v } from "./data/level-2.js";
7
+ import { level3Pairs as n } from "./data/level-3.js";
8
+ import { level4Pairs as c } from "./data/level-4.js";
9
+ import { level5Pairs as T } from "./data/level-5.js";
2
10
  export {
3
- e as default,
4
- f as minimalPairsData
11
+ o as default,
12
+ m as level0Pairs,
13
+ a as level1Pairs,
14
+ v as level2Pairs,
15
+ n as level3Pairs,
16
+ c as level4Pairs,
17
+ T as level5Pairs,
18
+ p as levels,
19
+ f as pronunciationTips
5
20
  };
@@ -0,0 +1,3 @@
1
+ import { MinimalPairsLevelInfo } from '../../content-shared';
2
+ export declare const levels: MinimalPairsLevelInfo[];
3
+ //# sourceMappingURL=levels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"levels.d.ts","sourceRoot":"","sources":["../src/levels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE9E,eAAO,MAAM,MAAM,EAAE,qBAAqB,EAOzC,CAAC"}
package/dist/levels.js ADDED
@@ -0,0 +1,11 @@
1
+ const e = [
2
+ { level: 0, title: "Getting Started", description: "Practice with clearly different sounds" },
3
+ { level: 1, title: "Six Tones", description: "The Vietnamese tonal system" },
4
+ { level: 2, title: "Initial Consonants", description: "Consonant contrasts at syllable start" },
5
+ { level: 3, title: "Vowels", description: "Vietnamese vowel quality" },
6
+ { level: 4, title: "Final Consonants", description: "Syllable-ending contrasts" },
7
+ { level: 5, title: "Expert Level", description: "Subtle regional and phonetic distinctions" }
8
+ ];
9
+ export {
10
+ e as levels
11
+ };
@@ -0,0 +1,3 @@
1
+ import { MinimalPairsPronunciationTipsMap } from '../../content-shared';
2
+ export declare const pronunciationTips: MinimalPairsPronunciationTipsMap;
3
+ //# sourceMappingURL=pronunciationTips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pronunciationTips.d.ts","sourceRoot":"","sources":["../src/pronunciationTips.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AAEzF,eAAO,MAAM,iBAAiB,EAAE,gCAQ/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ const n = {
2
+ tone_ngang_sac: "ngang (mid): level, neutral. sắc (high rising): starts mid, rises sharply like a question in English.",
3
+ consonant_t_d: "/t/ is voiceless with no aspiration. /ɗ/ (đ) is implosive - pull the glottis down while making the sound.",
4
+ vowel_a_e: "/a/ is open central. /ɛ/ (e) is open-mid front. Vietnamese has many vowel qualities.",
5
+ final_n_ng: "/-n/ is alveolar (tongue on ridge). /-ŋ/ (ng) is velar (back of tongue against soft palate)."
6
+ };
7
+ export {
8
+ n as pronunciationTips
9
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polyglot-bundles/vi-minimal-pairs",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -12,14 +12,46 @@
12
12
  "./data": {
13
13
  "types": "./dist/data.d.ts",
14
14
  "import": "./dist/data.js"
15
+ },
16
+ "./levels": {
17
+ "types": "./dist/levels.d.ts",
18
+ "import": "./dist/levels.js"
19
+ },
20
+ "./pronunciationTips": {
21
+ "types": "./dist/pronunciationTips.d.ts",
22
+ "import": "./dist/pronunciationTips.js"
23
+ },
24
+ "./data/level-0": {
25
+ "types": "./dist/data/level-0.d.ts",
26
+ "import": "./dist/data/level-0.js"
27
+ },
28
+ "./data/level-1": {
29
+ "types": "./dist/data/level-1.d.ts",
30
+ "import": "./dist/data/level-1.js"
31
+ },
32
+ "./data/level-2": {
33
+ "types": "./dist/data/level-2.d.ts",
34
+ "import": "./dist/data/level-2.js"
35
+ },
36
+ "./data/level-3": {
37
+ "types": "./dist/data/level-3.d.ts",
38
+ "import": "./dist/data/level-3.js"
39
+ },
40
+ "./data/level-4": {
41
+ "types": "./dist/data/level-4.d.ts",
42
+ "import": "./dist/data/level-4.js"
43
+ },
44
+ "./data/level-5": {
45
+ "types": "./dist/data/level-5.d.ts",
46
+ "import": "./dist/data/level-5.js"
15
47
  }
16
48
  },
17
49
  "files": [
18
50
  "dist"
19
51
  ],
20
52
  "dependencies": {
21
- "@polyglot-bundles/content-shared": "^0.3.0",
22
- "@polyglot-bundles/vi-lang": "0.2.0"
53
+ "@polyglot-bundles/content-shared": "0.3.1",
54
+ "@polyglot-bundles/vi-lang": "0.2.1"
23
55
  },
24
56
  "devDependencies": {
25
57
  "vite": "^5.4.0",