@momo-kits/native-kits 0.157.1-skill.3-debug → 0.157.1-skill.6-debug

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.
Files changed (109) hide show
  1. package/.claude/skills/momo-native-kits-skills/README.md +52 -0
  2. package/.claude/skills/momo-native-kits-skills/SKILL.md +32 -0
  3. package/.claude/skills/momo-native-kits-skills/data-display/SKILL.md +42 -0
  4. package/.claude/skills/momo-native-kits-skills/feedback/SKILL.md +43 -0
  5. package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/feedback}/references/popup.md +3 -10
  6. package/.claude/skills/momo-native-kits-skills/form-controls/SKILL.md +42 -0
  7. package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/button.md +2 -3
  8. package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/input.md +3 -7
  9. package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/radio.md +9 -9
  10. package/.claude/skills/momo-native-kits-skills/layout/SKILL.md +39 -0
  11. package/.claude/skills/momo-native-kits-skills/navigation/SKILL.md +38 -0
  12. package/.claude/skills/momo-native-kits-skills/output/test-report.json +12 -0
  13. package/.claude/skills/momo-native-kits-skills/output/validation-result.json +108 -0
  14. package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills}/references/constants.md +81 -6
  15. package/.claude/skills/momo-native-kits-skills/references/design-guidelines.md +130 -0
  16. package/.claude/skills/momo-native-kits-skills/references/developer/android-compose.md +29 -0
  17. package/.claude/skills/momo-native-kits-skills/references/developer/code-convention.md +118 -0
  18. package/.claude/skills/momo-native-kits-skills/references/developer/compose-multiplatform.md +29 -0
  19. package/.claude/skills/momo-native-kits-skills/scripts/logger.js +63 -0
  20. package/.claude/skills/momo-native-kits-skills/scripts/rules/badge.js +32 -0
  21. package/.claude/skills/momo-native-kits-skills/scripts/rules/bottomtab.js +19 -0
  22. package/.claude/skills/momo-native-kits-skills/scripts/rules/button.js +32 -0
  23. package/.claude/skills/momo-native-kits-skills/scripts/rules/card.js +32 -0
  24. package/.claude/skills/momo-native-kits-skills/scripts/rules/checkbox.js +32 -0
  25. package/.claude/skills/momo-native-kits-skills/scripts/rules/chip.js +59 -0
  26. package/.claude/skills/momo-native-kits-skills/scripts/rules/divider.js +19 -0
  27. package/.claude/skills/momo-native-kits-skills/scripts/rules/global.js +61 -0
  28. package/.claude/skills/momo-native-kits-skills/scripts/rules/index.js +54 -0
  29. package/.claude/skills/momo-native-kits-skills/scripts/rules/input.js +32 -0
  30. package/.claude/skills/momo-native-kits-skills/scripts/rules/navigation.js +48 -0
  31. package/.claude/skills/momo-native-kits-skills/scripts/rules/popup.js +45 -0
  32. package/.claude/skills/momo-native-kits-skills/scripts/rules/radio.js +105 -0
  33. package/.claude/skills/momo-native-kits-skills/scripts/rules/skeleton.js +20 -0
  34. package/.claude/skills/momo-native-kits-skills/scripts/rules/snackbar.js +32 -0
  35. package/.claude/skills/momo-native-kits-skills/scripts/rules/state.js +21 -0
  36. package/.claude/skills/momo-native-kits-skills/scripts/rules/switch.js +45 -0
  37. package/.claude/skills/momo-native-kits-skills/scripts/rules/text.js +19 -0
  38. package/.claude/skills/momo-native-kits-skills/scripts/rules/tooltip.js +45 -0
  39. package/.claude/skills/momo-native-kits-skills/scripts/rules/trustbanner.js +22 -0
  40. package/.claude/skills/momo-native-kits-skills/scripts/test-on-device.sh +117 -0
  41. package/.claude/skills/momo-native-kits-skills/scripts/test-runner.js +167 -0
  42. package/.claude/skills/momo-native-kits-skills/scripts/validate-kits.js +131 -0
  43. package/.momo-agent.json +13 -0
  44. package/compose/build.gradle.kts +1 -1
  45. package/gradle.properties +1 -1
  46. package/package.json +1 -1
  47. package/.claude/momo-native-kits-skill/SKILL.md +0 -51
  48. package/.claude/momo-native-kits-skill/evals/evals.json +0 -95
  49. package/.claude/momo-native-kits-skill/workspace/iteration-1/benchmark.json +0 -20
  50. package/.claude/momo-native-kits-skill/workspace/iteration-1/benchmark.md +0 -13
  51. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/eval_metadata.json +0 -6
  52. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/with_skill/outputs/ButtonExample.kt +0 -55
  53. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-0-button/without_skill/outputs/ButtonExample.kt +0 -45
  54. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/eval_metadata.json +0 -6
  55. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/with_skill/outputs/InputPhoneExample.kt +0 -40
  56. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-1-input/without_skill/outputs/InputPhoneExample.kt +0 -42
  57. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/eval_metadata.json +0 -6
  58. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/with_skill/outputs/BottomTabExample.kt +0 -236
  59. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-2-bottomtab/without_skill/outputs/BottomTabExample.kt +0 -152
  60. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/eval_metadata.json +0 -6
  61. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/with_skill/outputs/CheckBoxExample.kt +0 -49
  62. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-3-checkbox/without_skill/outputs/CheckBoxExample.kt +0 -123
  63. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/eval_metadata.json +0 -6
  64. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/with_skill/outputs/DateTimePickerExample.kt +0 -318
  65. package/.claude/momo-native-kits-skill/workspace/iteration-1/eval-4-datetimepicker/without_skill/outputs/DateTimePickerExample.kt +0 -330
  66. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-card/with_skill/outputs/CardExample.kt +0 -124
  67. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-card/without_skill/outputs/CardExample.kt +0 -71
  68. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-loginform/with_skill/outputs/LoginFormExample.kt +0 -134
  69. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-loginform/without_skill/outputs/LoginFormExample.kt +0 -199
  70. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-navcontainer/with_skill/outputs/NavigationContainerExample.kt +0 -224
  71. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-navcontainer/without_skill/outputs/NavigationContainerExample.kt +0 -225
  72. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-popup/with_skill/outputs/PopupExample.kt +0 -79
  73. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-popup/without_skill/outputs/PopupExample.kt +0 -169
  74. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/eval_metadata.json +0 -6
  75. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/with_skill/outputs/SetOptionsExample.kt +0 -255
  76. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-setoptions/without_skill/outputs/SetOptionsExample.kt +0 -212
  77. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-skeleton/with_skill/outputs/SkeletonExample.kt +0 -199
  78. package/.claude/momo-native-kits-skill/workspace/iteration-2/eval-skeleton/without_skill/outputs/SkeletonExample.kt +0 -229
  79. package/.claude/momo-native-kits-skill/workspace/iteration-3/benchmark.json +0 -20
  80. package/.claude/momo-native-kits-skill/workspace/iteration-3/benchmark.md +0 -13
  81. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/eval_metadata.json +0 -22
  82. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/with_skill/outputs/PrimaryButtonExample.kt +0 -38
  83. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/with_skill/timing.json +0 -5
  84. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/without_skill/outputs/PrimaryButtonExample.kt +0 -83
  85. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-button/without_skill/timing.json +0 -5
  86. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/eval_metadata.json +0 -22
  87. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/with_skill/outputs/NavigationContainerExample.kt +0 -547
  88. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/with_skill/timing.json +0 -5
  89. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/without_skill/outputs/MoMoNavigationContainer.kt +0 -519
  90. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-navcontainer/without_skill/timing.json +0 -5
  91. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/eval_metadata.json +0 -27
  92. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/with_skill/outputs/SetOptionsExample.kt +0 -429
  93. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/with_skill/timing.json +0 -5
  94. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/without_skill/outputs/SetOptionsExample.kt +0 -353
  95. package/.claude/momo-native-kits-skill/workspace/iteration-3/eval-setoptions/without_skill/timing.json +0 -5
  96. package/.claude/settings.local.json +0 -41
  97. package/local.properties +0 -8
  98. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/data-display}/references/badge.md +0 -0
  99. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/data-display}/references/chip.md +0 -0
  100. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/data-display}/references/skeleton.md +0 -0
  101. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/data-display}/references/text.md +0 -0
  102. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/feedback}/references/snackbar.md +0 -0
  103. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/feedback}/references/tooltip.md +0 -0
  104. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/feedback}/references/trustbanner.md +0 -0
  105. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/checkbox.md +0 -0
  106. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/form-controls}/references/switch.md +0 -0
  107. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/layout}/references/card.md +0 -0
  108. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/layout}/references/divider.md +0 -0
  109. /package/.claude/{momo-native-kits-skill → skills/momo-native-kits-skills/navigation}/references/navigation.md +0 -0
@@ -1,55 +0,0 @@
1
- package com.example
2
-
3
- import androidx.compose.foundation.layout.fillMaxWidth
4
- import androidx.compose.foundation.layout.padding
5
- import androidx.compose.runtime.Composable
6
- import androidx.compose.ui.Modifier
7
- import androidx.compose.ui.unit.dp
8
- import vn.momo.kits.components.Button
9
- import vn.momo.kits.components.ButtonType
10
- import vn.momo.kits.components.Size
11
-
12
- /**
13
- * Example: Primary Button with text 'Đăng nhập'
14
- *
15
- * This demonstrates how to create a primary button in MoMo Native Kits
16
- * with the Vietnamese text "Đăng nhập" (Login).
17
- */
18
- @Composable
19
- fun LoginButtonExample() {
20
- Button(
21
- onClick = {
22
- // Handle login action
23
- },
24
- title = "Đăng nhập",
25
- type = ButtonType.PRIMARY,
26
- size = Size.LARGE,
27
- isFull = true,
28
- modifier = Modifier
29
- .fillMaxWidth()
30
- .padding(horizontal = 16.dp)
31
- )
32
- }
33
-
34
- /**
35
- * Alternative example: Primary button with additional customization
36
- */
37
- @Composable
38
- fun LoginButtonWithIconsExample() {
39
- Button(
40
- onClick = {
41
- // Handle login action
42
- },
43
- title = "Đăng nhập",
44
- type = ButtonType.PRIMARY,
45
- size = Size.LARGE,
46
- iconLeft = "user", // Optional: Add icon on the left
47
- iconRight = "arrow_right", // Optional: Add icon on the right
48
- loading = false, // Set to true when processing login
49
- isFull = true,
50
- useTintColor = true,
51
- modifier = Modifier
52
- .fillMaxWidth()
53
- .padding(horizontal = 16.dp)
54
- )
55
- }
@@ -1,45 +0,0 @@
1
- package com.momo.example
2
-
3
- import androidx.compose.foundation.layout.fillWidth
4
- import androidx.compose.foundation.layout.height
5
- import androidx.compose.foundation.shape.RoundedCornerShape
6
- import androidx.compose.material3.Button
7
- import androidx.compose.material3.ButtonDefaults
8
- import androidx.compose.material3.Text
9
- import androidx.compose.runtime.Composable
10
- import androidx.compose.ui.Modifier
11
- import androidx.compose.ui.graphics.Color
12
- import androidx.compose.ui.text.font.FontWeight
13
- import androidx.compose.ui.unit.dp
14
- import androidx.compose.ui.unit.sp
15
-
16
- /**
17
- * Primary button with Vietnamese text "Đăng nhập" (Login)
18
- */
19
- @Composable
20
- fun PrimaryLoginButton(
21
- onClick: () -> Unit,
22
- modifier: Modifier = Modifier
23
- ) {
24
- Button(
25
- onClick = onClick,
26
- modifier = modifier
27
- .fillWidth()
28
- .height(48.dp),
29
- shape = RoundedCornerShape(8.dp),
30
- colors = ButtonDefaults.buttonColors(
31
- containerColor = Color(0xFFAD0000), // MoMo's primary red color
32
- contentColor = Color.White
33
- ),
34
- elevation = ButtonDefaults.buttonElevation(
35
- defaultElevation = 2.dp,
36
- pressedElevation = 4.dp
37
- )
38
- ) {
39
- Text(
40
- text = "Đăng nhập",
41
- fontSize = 16.sp,
42
- fontWeight = FontWeight.SemiBold
43
- )
44
- }
45
- }
@@ -1,6 +0,0 @@
1
- {
2
- "eval_id": 1,
3
- "eval_name": "input-phone",
4
- "prompt": "I need an input field for phone number with label 'Số điện thoại' and placeholder 'Nhập số điện thoại'",
5
- "assertions": []
6
- }
@@ -1,40 +0,0 @@
1
- package com.example
2
-
3
- import androidx.compose.foundation.layout.Column
4
- import androidx.compose.foundation.layout.fillMaxWidth
5
- import androidx.compose.foundation.layout.padding
6
- import androidx.compose.foundation.text.KeyboardOptions
7
- import androidx.compose.runtime.Composable
8
- import androidx.compose.runtime.getValue
9
- import androidx.compose.runtime.mutableStateOf
10
- import androidx.compose.runtime.remember
11
- import androidx.compose.runtime.setValue
12
- import androidx.compose.ui.Modifier
13
- import androidx.compose.ui.text.input.KeyboardType
14
- import androidx.compose.ui.unit.dp
15
- import vn.momo.kits.components.Input
16
-
17
- @Composable
18
- fun InputPhoneExample() {
19
- var phoneNumber by remember { mutableStateOf("") }
20
-
21
- Column(
22
- modifier = Modifier
23
- .fillMaxWidth()
24
- .padding(16.dp)
25
- ) {
26
- Input(
27
- value = phoneNumber,
28
- onValueChange = { newValue ->
29
- // Filter to only allow digits
30
- phoneNumber = newValue.filter { it.isDigit() }
31
- },
32
- modifier = Modifier.fillMaxWidth(),
33
- inputSize = vn.momo.kits.components.InputSize.LARGE,
34
- label = "Số điện thoại",
35
- placeholder = "Nhập số điện thoại",
36
- keyboardType = KeyboardType.Phone,
37
- maxLength = 10
38
- )
39
- }
40
- }
@@ -1,42 +0,0 @@
1
- package com.example.input
2
-
3
- import androidx.compose.foundation.layout.Column
4
- import androidx.compose.foundation.layout.fillMaxWidth
5
- import androidx.compose.foundation.layout.padding
6
- import androidx.compose.foundation.text.KeyboardOptions
7
- import androidx.compose.material.OutlinedTextField
8
- import androidx.compose.material.Text
9
- import androidx.compose.runtime.Composable
10
- import androidx.compose.runtime.getValue
11
- import androidx.compose.runtime.mutableStateOf
12
- import androidx.compose.runtime.remember
13
- import androidx.compose.runtime.setValue
14
- import androidx.compose.ui.Modifier
15
- import androidx.compose.ui.text.input.KeyboardType
16
- import androidx.compose.ui.unit.dp
17
-
18
- @Composable
19
- fun InputPhoneExample() {
20
- var phoneNumber by remember { mutableStateOf("") }
21
-
22
- Column(
23
- modifier = Modifier
24
- .fillMaxWidth()
25
- .padding(16.dp)
26
- ) {
27
- OutlinedTextField(
28
- value = phoneNumber,
29
- onValueChange = { newValue ->
30
- // Filter to only allow numeric characters
31
- phoneNumber = newValue.filter { it.isDigit() }
32
- },
33
- label = { Text("Số điện thoại") },
34
- placeholder = { Text("Nhập số điện thoại") },
35
- keyboardOptions = KeyboardOptions(
36
- keyboardType = KeyboardType.Phone
37
- ),
38
- singleLine = true,
39
- modifier = Modifier.fillMaxWidth()
40
- )
41
- }
42
- }
@@ -1,6 +0,0 @@
1
- {
2
- "eval_id": 2,
3
- "eval_name": "bottom-tab",
4
- "prompt": "How do I implement a bottom tab navigation with 4 tabs: Home, Wallet, History, Profile in MoMo app?",
5
- "assertions": []
6
- }
@@ -1,236 +0,0 @@
1
- package com.example.momoapp
2
-
3
- import androidx.compose.foundation.layout.Box
4
- import androidx.compose.foundation.layout.fillMaxSize
5
- import androidx.compose.foundation.layout.padding
6
- import androidx.compose.material3.Text
7
- import androidx.compose.runtime.Composable
8
- import androidx.compose.ui.Alignment
9
- import androidx.compose.ui.Modifier
10
- import androidx.compose.ui.unit.dp
11
- import vn.momo.kits.navigation.BottomTab
12
- import vn.momo.kits.navigation.BottomTabItem
13
- import vn.momo.kits.navigation.NavigationOptions
14
- import vn.momo.kits.navigation.StackScreen
15
- import vn.momo.kits.navigation.component.HeaderType
16
- import vn.momo.kits.components.Title
17
- import vn.momo.kits.components.TitleType
18
- import vn.momo.kits.navigation.component.Header
19
-
20
- /**
21
- * MoMo App Bottom Tab Navigation Example
22
- *
23
- * This example demonstrates how to implement a bottom tab navigation
24
- * with 4 tabs: Home, Wallet, History, Profile
25
- */
26
- @Composable
27
- fun MoMoApp() {
28
- BottomTab(
29
- items = listOf(
30
- // Home Tab
31
- BottomTabItem(
32
- name = "home",
33
- label = "Trang chủ",
34
- icon = "ic_home",
35
- screen = {
36
- StackScreen(
37
- navigationOptions = NavigationOptions(
38
- headerType = HeaderType.DEFAULT,
39
- isShowBottomTab = true
40
- )
41
- ) {
42
- HomeScreen()
43
- }
44
- }
45
- ),
46
-
47
- // Wallet Tab
48
- BottomTabItem(
49
- name = "wallet",
50
- label = "Ví của tôi",
51
- icon = "ic_wallet",
52
- screen = {
53
- StackScreen(
54
- navigationOptions = NavigationOptions(
55
- headerType = HeaderType.DEFAULT,
56
- isShowBottomTab = true
57
- )
58
- ) {
59
- WalletScreen()
60
- }
61
- }
62
- ),
63
-
64
- // History Tab
65
- BottomTabItem(
66
- name = "history",
67
- label = "Lịch sử",
68
- icon = "ic_history",
69
- screen = {
70
- StackScreen(
71
- navigationOptions = NavigationOptions(
72
- headerType = HeaderType.DEFAULT,
73
- isShowBottomTab = true
74
- )
75
- ) {
76
- HistoryScreen()
77
- }
78
- }
79
- ),
80
-
81
- // Profile Tab
82
- BottomTabItem(
83
- name = "profile",
84
- label = "Tài khoản",
85
- icon = "ic_profile",
86
- screen = {
87
- StackScreen(
88
- navigationOptions = NavigationOptions(
89
- headerType = HeaderType.DEFAULT,
90
- isShowBottomTab = true
91
- )
92
- ) {
93
- ProfileScreen()
94
- }
95
- }
96
- )
97
- )
98
- )
99
- }
100
-
101
- // ==================== Screen Composables ====================
102
-
103
- @Composable
104
- private fun HomeScreen() {
105
- Box(
106
- modifier = Modifier
107
- .fillMaxSize()
108
- .padding(16.dp),
109
- contentAlignment = Alignment.Center
110
- ) {
111
- Title(
112
- text = "Trang chủ",
113
- type = TitleType.TITLE_1
114
- )
115
- }
116
- }
117
-
118
- @Composable
119
- private fun WalletScreen() {
120
- Box(
121
- modifier = Modifier
122
- .fillMaxSize()
123
- .padding(16.dp),
124
- contentAlignment = Alignment.Center
125
- ) {
126
- Title(
127
- text = "Ví của tôi",
128
- type = TitleType.TITLE_1
129
- )
130
- }
131
- }
132
-
133
- @Composable
134
- private fun HistoryScreen() {
135
- Box(
136
- modifier = Modifier
137
- .fillMaxSize()
138
- .padding(16.dp),
139
- contentAlignment = Alignment.Center
140
- ) {
141
- Title(
142
- text = "Lịch sử giao dịch",
143
- type = TitleType.TITLE_1
144
- )
145
- }
146
- }
147
-
148
- @Composable
149
- private fun ProfileScreen() {
150
- Box(
151
- modifier = Modifier
152
- .fillMaxSize()
153
- .padding(16.dp),
154
- contentAlignment = Alignment.Center
155
- ) {
156
- Title(
157
- text = "Tài khoản",
158
- type = TitleType.TITLE_1
159
- )
160
- }
161
- }
162
-
163
- // ==================== Alternative: With Badge Example ====================
164
-
165
- /**
166
- * Example showing how to add badges/dots to tabs
167
- */
168
- @Composable
169
- fun MoMoAppWithBadges() {
170
- BottomTab(
171
- items = listOf(
172
- BottomTabItem(
173
- name = "home",
174
- label = "Trang chủ",
175
- icon = "ic_home",
176
- screen = {
177
- StackScreen(
178
- navigationOptions = NavigationOptions(
179
- headerType = HeaderType.DEFAULT,
180
- isShowBottomTab = true
181
- )
182
- ) {
183
- HomeScreen()
184
- }
185
- }
186
- ),
187
- BottomTabItem(
188
- name = "wallet",
189
- label = "Ví của tôi",
190
- icon = "ic_wallet",
191
- showDot = true, // Shows notification dot
192
- screen = {
193
- StackScreen(
194
- navigationOptions = NavigationOptions(
195
- headerType = HeaderType.DEFAULT,
196
- isShowBottomTab = true
197
- )
198
- ) {
199
- WalletScreen()
200
- }
201
- }
202
- ),
203
- BottomTabItem(
204
- name = "history",
205
- label = "Lịch sử",
206
- icon = "ic_history",
207
- badgeLabel = "3", // Shows badge with number
208
- screen = {
209
- StackScreen(
210
- navigationOptions = NavigationOptions(
211
- headerType = HeaderType.DEFAULT,
212
- isShowBottomTab = true
213
- )
214
- ) {
215
- HistoryScreen()
216
- }
217
- }
218
- ),
219
- BottomTabItem(
220
- name = "profile",
221
- label = "Tài khoản",
222
- icon = "ic_profile",
223
- screen = {
224
- StackScreen(
225
- navigationOptions = NavigationOptions(
226
- headerType = HeaderType.DEFAULT,
227
- isShowBottomTab = true
228
- )
229
- ) {
230
- ProfileScreen()
231
- }
232
- }
233
- )
234
- )
235
- )
236
- }
@@ -1,152 +0,0 @@
1
- package com.momo.app.ui.navigation
2
-
3
- import androidx.compose.foundation.layout.padding
4
- import androidx.compose.material.icons.Icons
5
- import androidx.compose.material.icons.filled.Home
6
- import androidx.compose.material.icons.filled.Person
7
- import androidx.compose.material.icons.filled.Receipt
8
- import androidx.compose.material.icons.filled.Wallet
9
- import androidx.compose.material.icons.outlined.Home
10
- import androidx.compose.material.icons.outlined.Person
11
- import androidx.compose.material.icons.outlined.Receipt
12
- import androidx.compose.material.icons.outlined.Wallet
13
- import androidx.compose.material3.Icon
14
- import androidx.compose.material3.NavigationBar
15
- import androidx.compose.material3.NavigationBarItem
16
- import androidx.compose.material3.Scaffold
17
- import androidx.compose.material3.Text
18
- import androidx.compose.runtime.Composable
19
- import androidx.compose.runtime.getValue
20
- import androidx.compose.ui.Modifier
21
- import androidx.compose.ui.graphics.vector.ImageVector
22
- import androidx.navigation.NavDestination.Companion.hierarchy
23
- import androidx.navigation.NavGraph.Companion.findStartDestination
24
- import androidx.navigation.compose.NavHost
25
- import androidx.navigation.compose.composable
26
- import androidx.navigation.compose.currentBackStackEntryAsState
27
- import androidx.navigation.compose.rememberNavController
28
-
29
- /**
30
- * Bottom Tab Navigation with 4 tabs: Home, Wallet, History, Profile
31
- * Designed for MoMo app
32
- */
33
- sealed class BottomNavItem(
34
- val route: String,
35
- val title: String,
36
- val selectedIcon: ImageVector,
37
- val unselectedIcon: ImageVector
38
- ) {
39
- data object Home : BottomNavItem(
40
- route = "home",
41
- title = "Home",
42
- selectedIcon = Icons.Filled.Home,
43
- unselectedIcon = Icons.Outlined.Home
44
- )
45
-
46
- data object Wallet : BottomNavItem(
47
- route = "wallet",
48
- title = "Wallet",
49
- selectedIcon = Icons.Filled.Wallet,
50
- unselectedIcon = Icons.Outlined.Wallet
51
- )
52
-
53
- data object History : BottomNavItem(
54
- route = "history",
55
- title = "History",
56
- selectedIcon = Icons.Filled.Receipt,
57
- unselectedIcon = Icons.Outlined.Receipt
58
- )
59
-
60
- data object Profile : BottomNavItem(
61
- route = "profile",
62
- title = "Profile",
63
- selectedIcon = Icons.Filled.Person,
64
- unselectedIcon = Icons.Outlined.Person
65
- )
66
- }
67
-
68
- @Composable
69
- fun BottomTabNavigation() {
70
- val navController = rememberNavController()
71
- val navBackStackEntry by navController.currentBackStackEntryAsState()
72
- val currentDestination = navBackStackEntry?.destination
73
-
74
- val bottomNavItems = listOf(
75
- BottomNavItem.Home,
76
- BottomNavItem.Wallet,
77
- BottomNavItem.History,
78
- BottomNavItem.Profile
79
- )
80
-
81
- Scaffold(
82
- bottomBar = {
83
- NavigationBar {
84
- bottomNavItems.forEach { item ->
85
- val selected = currentDestination?.hierarchy?.any { it.route == item.route } == true
86
-
87
- NavigationBarItem(
88
- selected = selected,
89
- onClick = {
90
- navController.navigate(item.route) {
91
- popUpTo(navController.graph.findStartDestination().id) {
92
- saveState = true
93
- }
94
- launchSingleTop = true
95
- restoreState = true
96
- }
97
- },
98
- icon = {
99
- Icon(
100
- imageVector = if (selected) item.selectedIcon else item.unselectedIcon,
101
- contentDescription = item.title
102
- )
103
- },
104
- label = {
105
- Text(text = item.title)
106
- }
107
- )
108
- }
109
- }
110
- }
111
- ) { paddingValues ->
112
- NavHost(
113
- navController = navController,
114
- startDestination = BottomNavItem.Home.route,
115
- modifier = Modifier.padding(paddingValues)
116
- ) {
117
- composable(BottomNavItem.Home.route) {
118
- HomeScreen()
119
- }
120
- composable(BottomNavItem.Wallet.route) {
121
- WalletScreen()
122
- }
123
- composable(BottomNavItem.History.route) {
124
- HistoryScreen()
125
- }
126
- composable(BottomNavItem.Profile.route) {
127
- ProfileScreen()
128
- }
129
- }
130
- }
131
- }
132
-
133
- // Placeholder screens for each tab
134
- @Composable
135
- private fun HomeScreen() {
136
- Text(text = "Home Screen")
137
- }
138
-
139
- @Composable
140
- private fun WalletScreen() {
141
- Text(text = "Wallet Screen")
142
- }
143
-
144
- @Composable
145
- private fun HistoryScreen() {
146
- Text(text = "History Screen")
147
- }
148
-
149
- @Composable
150
- private fun ProfileScreen() {
151
- Text(text = "Profile Screen")
152
- }
@@ -1,6 +0,0 @@
1
- {
2
- "eval_id": 3,
3
- "eval_name": "checkbox-terms",
4
- "prompt": "Create a checkbox component for terms and conditions agreement",
5
- "assertions": []
6
- }
@@ -1,49 +0,0 @@
1
- package com.example
2
-
3
- import androidx.compose.foundation.layout.Column
4
- import androidx.compose.foundation.layout.Spacer
5
- import androidx.compose.foundation.layout.height
6
- import androidx.compose.foundation.layout.padding
7
- import androidx.compose.runtime.getValue
8
- import androidx.compose.runtime.mutableStateOf
9
- import androidx.compose.runtime.remember
10
- import androidx.compose.runtime.setValue
11
- import androidx.compose.ui.Modifier
12
- import androidx.compose.ui.unit.dp
13
- import vn.momo.kits.components.Button
14
- import vn.momo.kits.components.ButtonType
15
- import vn.momo.kits.components.CheckBox
16
- import vn.momo.kits.components.Size
17
- import vn.momo.kits.const.Spacing
18
-
19
- @Composable
20
- fun TermsAndConditionsScreen() {
21
- var isAgreed by remember { mutableStateOf(false) }
22
-
23
- Column(
24
- modifier = Modifier.padding(Spacing.L)
25
- ) {
26
- // Checkbox for terms and conditions agreement
27
- CheckBox(
28
- checked = isAgreed,
29
- onCheckedChange = { isAgreed = it },
30
- label = "Tôi đồng ý với Điều khoản dịch vụ và Chính sách bảo mật",
31
- enabled = true
32
- )
33
-
34
- Spacer(modifier = Modifier.height(Spacing.XL))
35
-
36
- // Submit button that is enabled only when checkbox is checked
37
- Button(
38
- onClick = {
39
- // Handle terms acceptance submission
40
- // Navigate to next screen or process registration
41
- },
42
- title = "Tiếp tục",
43
- type = ButtonType.PRIMARY,
44
- size = Size.LARGE,
45
- isFull = true,
46
- enabled = isAgreed
47
- )
48
- }
49
- }