@momo-kits/native-kits 0.167.1-duo.1-debug → 0.167.1-duo.10

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 (260) hide show
  1. package/CLAUDE.md +32 -0
  2. package/ios/Application/ApplicationEnvironment.swift +17 -0
  3. package/ios/Application/ComposeApi.swift +2 -1
  4. package/ios/Application/{Components.swift → LegacyHeader.swift} +7 -65
  5. package/ios/Application/Screen.swift +3 -2
  6. package/ios/Avatar/Avatar.swift +4 -3
  7. package/ios/Badge/Badge.swift +6 -4
  8. package/ios/Badge/BadgeDot.swift +1 -1
  9. package/ios/Badge/BadgeRibbon.swift +0 -1
  10. package/ios/Button/Button.swift +15 -12
  11. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +64 -18
  12. package/ios/Carousel/Carousel.swift +29 -12
  13. package/ios/Checkbox/Checkbox.swift +7 -3
  14. package/ios/Chip/Chip.swift +5 -4
  15. package/ios/Collapse/Collapse.swift +70 -19
  16. package/ios/Colors+Radius+Spacing/Colors.swift +10 -1
  17. package/ios/DateTimePicker/DateTimePicker.swift +54 -20
  18. package/ios/DateTimePicker/WheelPicker.swift +103 -105
  19. package/ios/Divider/Divider.swift +37 -4
  20. package/ios/Extensions/Color++.swift +38 -9
  21. package/ios/Extensions/OptionalEnvironmentObject.swift +12 -0
  22. package/ios/Extensions/SkeletonUICompat.swift +11 -0
  23. package/ios/Icon/Icon.swift +21 -23
  24. package/ios/Icon/Icons.swift +1329 -0
  25. package/ios/IconButton/IconButton.swift +15 -7
  26. package/ios/Image/Image.swift +7 -23
  27. package/ios/Information/Information.swift +27 -9
  28. package/ios/Input/ErrorView.swift +2 -2
  29. package/ios/Input/Input.swift +160 -147
  30. package/ios/Input/InputPhoneNumber.swift +12 -9
  31. package/ios/Input/InputSearch.swift +102 -75
  32. package/ios/Input/InputTextArea.swift +128 -145
  33. package/ios/InputDropDown/InputDropDown.swift +10 -7
  34. package/ios/InputMoney/InputMoney.swift +33 -11
  35. package/ios/InputOTP/InputOTP.swift +22 -12
  36. package/ios/Layout/Card.swift +50 -0
  37. package/ios/Layout/GridContext.swift +123 -3
  38. package/ios/Layout/Item.swift +5 -4
  39. package/ios/Layout/ScreenLayout.swift +312 -0
  40. package/ios/Layout/Section.swift +4 -100
  41. package/ios/Loader/Loader.swift +5 -9
  42. package/ios/Lottie/LottieView.swift +14 -2
  43. package/ios/{Application/Navigation/Overplay → Navigation}/BottomSheet.swift +97 -8
  44. package/ios/Navigation/BottomTab/BottomTab.swift +187 -0
  45. package/ios/{Application/Navigation → Navigation}/BottomTab/BottomTabBar.swift +15 -7
  46. package/ios/Navigation/BottomTab/DuoBarCompression.swift +105 -0
  47. package/ios/Navigation/BottomTab/DuoTabBar.swift +304 -0
  48. package/ios/{Application → Navigation/Component}/FloatingButton.swift +14 -3
  49. package/ios/Navigation/Component/Header.swift +493 -0
  50. package/ios/Navigation/Component/HeaderBackground.swift +134 -0
  51. package/ios/Navigation/Component/HeaderJourney.swift +73 -0
  52. package/ios/Navigation/Component/HeaderLocation.swift +48 -0
  53. package/ios/Navigation/Component/HeaderRight.swift +386 -0
  54. package/ios/Navigation/Component/HeaderTitle.swift +36 -0
  55. package/ios/{Application/Navigation → Navigation/Component}/HeaderUser.swift +21 -24
  56. package/ios/Navigation/Component/SideBar.swift +176 -0
  57. package/ios/{Application/Navigation/Overplay → Navigation/Component}/SnackBar.swift +5 -5
  58. package/ios/Navigation/HostBackGestureBridge.swift +57 -0
  59. package/ios/{Application/Navigation/Overplay → Navigation}/ModalScreen.swift +5 -1
  60. package/ios/Navigation/Navigation.swift +190 -0
  61. package/ios/{Application/Navigation → Navigation}/NavigationContainer.swift +92 -81
  62. package/ios/{Application/Navigation → Navigation}/Navigator.swift +185 -36
  63. package/ios/Navigation/StackScreen.swift +782 -0
  64. package/ios/{Application/Navigation → Navigation}/Tracking/ScreenTracker.swift +12 -5
  65. package/ios/OTPKeyboard/OTPKeyboard.swift +8 -11
  66. package/ios/Pagination/PaginationScroll.swift +2 -2
  67. package/ios/Popup/PopupDisplay.swift +72 -136
  68. package/ios/Popup/PopupInput.swift +10 -13
  69. package/ios/Popup/PopupLayout.swift +140 -0
  70. package/ios/Popup/PopupNotify.swift +56 -73
  71. package/ios/Popup/PopupPromotion.swift +31 -47
  72. package/ios/PopupView/FullscreenPopup.swift +13 -19
  73. package/ios/PopupView/PopupView.swift +1 -1
  74. package/ios/PopupView/Utils++.swift +0 -8
  75. package/ios/ProgressInfo/ProgressInfo.swift +4 -2
  76. package/ios/Radio/Radio.swift +2 -1
  77. package/ios/Rating/Rating.swift +9 -1
  78. package/ios/Resources/dot_loading.json +558 -0
  79. package/ios/Resources/lottie_circle_loader.json +1 -0
  80. package/ios/ScrollIndicator/ScrollIndicator.swift +11 -10
  81. package/ios/Skeleton/Skeleton.swift +22 -27
  82. package/ios/Slider/Slider.swift +16 -18
  83. package/ios/Stepper/Stepper.swift +6 -1
  84. package/ios/Steps/Steps.swift +8 -6
  85. package/ios/SuggestAction/SuggestAction.swift +5 -0
  86. package/ios/Swipeable/SwipeCell.swift +10 -6
  87. package/ios/Switch/Switch.swift +22 -20
  88. package/ios/TabView/TabView.swift +102 -21
  89. package/ios/Tag/Tag.swift +15 -4
  90. package/ios/Template/Logo/Logo.swift +2 -1
  91. package/ios/Template/TrustBanner/TrustBanner.swift +106 -54
  92. package/ios/Title/Title.swift +6 -17
  93. package/ios/Tooltip/Tooltip.swift +29 -14
  94. package/ios/Typography/Text.swift +61 -19
  95. package/ios/Uploader/Uploader.swift +3 -1
  96. package/ios/native-kits.podspec +2 -1
  97. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  98. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +1 -1
  99. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DuoTabDemo.swift +80 -0
  100. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +1 -0
  101. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IPhoneDuoDemo.swift +173 -0
  102. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +77 -1
  103. package/package.json +1 -1
  104. package/scripts/gen-ios-icons.mjs +36 -0
  105. package/.claude/settings.local.json +0 -185
  106. package/build.gradle.kts +0 -11
  107. package/compose/build.gradle.kts +0 -190
  108. package/compose/build.gradle.kts.backup +0 -190
  109. package/compose/compose.podspec +0 -47
  110. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  111. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  112. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  113. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  114. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -151
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -831
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -189
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -475
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  149. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -266
  150. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
  151. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  152. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -264
  153. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  154. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  155. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  156. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  157. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  158. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  159. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  160. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -334
  161. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -98
  162. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
  163. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  164. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -552
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  176. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  177. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
  178. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -16
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -297
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -52
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -38
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -39
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  199. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  200. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  201. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -299
  202. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +0 -58
  203. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -129
  204. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  205. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -201
  206. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  207. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  208. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -596
  209. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  210. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  211. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -175
  212. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -225
  213. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  214. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  215. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -360
  216. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -83
  217. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -106
  218. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -75
  219. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -309
  220. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -37
  221. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -364
  222. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  223. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  224. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  225. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  226. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  227. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -71
  228. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  229. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  230. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  231. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -115
  232. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -40
  233. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -45
  234. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  235. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  236. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  237. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -213
  238. package/gradle/libs.versions.toml +0 -69
  239. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  240. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  241. package/gradle.properties +0 -26
  242. package/gradlew +0 -252
  243. package/gradlew.bat +0 -94
  244. package/ios/Application/HeaderRight.swift +0 -306
  245. package/ios/Application/Navigation/BottomTab/BottomTab.swift +0 -104
  246. package/ios/Application/Navigation/HeaderBackProps.swift +0 -66
  247. package/ios/Application/Navigation/HeaderTitle.swift +0 -57
  248. package/ios/Application/Navigation/NavigationOptions.swift +0 -109
  249. package/ios/Application/Navigation/NavigatorManager.swift +0 -22
  250. package/ios/Application/Navigation/component/Header.swift +0 -178
  251. package/ios/Application/Navigation/component/HeaderBackground.swift +0 -83
  252. package/ios/Application/Navigation/component/HeaderColor.swift +0 -65
  253. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +0 -11
  254. package/ios/Application/Navigation/component/NavigationFooter.swift +0 -90
  255. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +0 -196
  256. package/ios/Application/StackScreen.swift +0 -492
  257. package/ios-demo/README.md +0 -120
  258. package/local.properties +0 -8
  259. package/settings.gradle.kts +0 -64
  260. /package/ios/{Application/Navigation → Navigation}/BottomTab/CurvedContainer.swift +0 -0
@@ -1,492 +0,0 @@
1
- //
2
- // StackScreen.swift
3
- // Pods
4
- //
5
- // SwiftUI mirror of Compose's `StackScreen`. This is a refactor of `Screen`:
6
- // the body is decomposed into the same focused pieces Compose uses — header
7
- // layer, scrollable content (`StackScreenContent`), floating button
8
- // (`FloatingContent`) and footer (`NavigationFooter`) — instead of one
9
- // monolithic, partially-duplicated view. The public init matches `Screen`
10
- // so call sites (e.g. NavigationContainer's ScreenHost) can swap over.
11
- //
12
-
13
- import SwiftUI
14
-
15
- public struct StackScreen<Content: View>: View {
16
- // MARK: - Properties
17
-
18
- var backgroundColor: Color?
19
- var headerTransparent: Bool = false
20
- var fullScreenContent: Bool = false
21
- var tintColor: Color? = Colors.black17
22
- var isBack: Bool
23
- var headerType: HeaderType
24
- var useAnimated: Bool = false
25
- var verticalAlignment: VerticalAlignment
26
- var horizontalAlignment: HorizontalAlignment
27
- var title: String
28
- var headerTitle: HeaderTitle?
29
- var titlePosition: TitlePosition
30
- var goBack: (() -> Void)?
31
- var scrollable: Bool
32
- var scrollToTopCallback: (() -> Void)?
33
- var onContentLayout: ((CGRect) -> Void)?
34
- var useAvoidKeyboard: Bool
35
- var keyboardShouldPersistTaps: Bool
36
- var footer: (() -> AnyView)?
37
- var headerRight: (()->any View)? = {HeaderRight()}
38
- var animatedHeader: AnimatedHeader? = nil
39
- var layoutOffset: CGFloat
40
- var inputSearchProps: InputSearchProps?
41
- var fabProps: FabProps?
42
- var screenName: String = ""
43
- var content: () -> Content
44
-
45
- public init(
46
- backgroundColor: Color? = nil,
47
- headerTransparent: Bool = false,
48
- fullScreenContent: Bool = false,
49
- tintColor: Color = Colors.black17,
50
- isBack: Bool = true,
51
- headerType: HeaderType = .default,
52
- useAnimated: Bool = false,
53
- verticalAlignment: VerticalAlignment = .top,
54
- horizontalAlignment: HorizontalAlignment = .leading,
55
- title: String = "Stack",
56
- headerTitle: HeaderTitle? = nil,
57
- titlePosition: TitlePosition = .left,
58
- goBack: (() -> Void)? = nil,
59
- scrollable: Bool = true,
60
- scrollToTopCallback: (() -> Void)? = nil,
61
- onContentLayout: ((CGRect) -> Void)? = nil,
62
- useAvoidKeyboard: Bool = true,
63
- keyboardShouldPersistTaps: Bool = false,
64
- footer: (() -> AnyView)? = nil,
65
- headerRight: (()->any View)? = {HeaderRight()},
66
- animatedHeader: AnimatedHeader? = nil,
67
- layoutOffset: CGFloat = 56,
68
- inputSearchProps: InputSearchProps? = nil,
69
- fabProps: FabProps? = nil,
70
- screenName: String = "",
71
- @ViewBuilder content: @escaping () -> Content
72
- ) {
73
- self.backgroundColor = backgroundColor
74
- self.headerTransparent = headerTransparent
75
- self.fullScreenContent = fullScreenContent
76
- self.tintColor = tintColor
77
- self.isBack = isBack
78
- self.headerType = headerType
79
- self.useAnimated = useAnimated
80
- self.verticalAlignment = verticalAlignment
81
- self.horizontalAlignment = horizontalAlignment
82
- self.title = title
83
- self.headerTitle = headerTitle
84
- self.titlePosition = titlePosition
85
- self.goBack = goBack
86
- self.scrollable = scrollable
87
- self.scrollToTopCallback = scrollToTopCallback
88
- self.onContentLayout = onContentLayout
89
- self.useAvoidKeyboard = useAvoidKeyboard
90
- self.keyboardShouldPersistTaps = keyboardShouldPersistTaps
91
- self.footer = footer
92
- self.headerRight = headerRight
93
- self.animatedHeader = animatedHeader
94
- self.layoutOffset = layoutOffset
95
- self.inputSearchProps = inputSearchProps
96
- self.fabProps = fabProps
97
- self.screenName = screenName
98
- self.content = content
99
- }
100
-
101
- @State private var scrollOffset: CGFloat = 0
102
- @State private var keyboardHeight: CGFloat = 0
103
- @State private var headerRightWidth: CGFloat = 0
104
- @State private var isBottomTabRoot: Bool = false
105
-
106
- @Environment(\.applicationEnvironment) private var appEnv
107
-
108
- // Auto-tracking state (mirrors Compose's `remember { ScreenTrackingState() }` +
109
- // the once-computed push/back `action`).
110
- @State private var trackingState = ScreenTrackingState()
111
- @State private var trackingAction: String = ScreenTracker.getLastScreenName() != nil ? "push" : "back"
112
-
113
- /// Header background fade tied to scroll: 0 → transparent (over a hero image
114
- /// or transparent header), 1 → opaque surface with the drop shadow.
115
- private var scrollOpacity: CGFloat { min(scrollOffset / 114, 1) }
116
-
117
- // MARK: - Search header (mirrors Compose's getInputSearchType / SearchAnimated)
118
-
119
- private enum InputSearchType { case none, header, animated }
120
-
121
- private var inputSearchType: InputSearchType {
122
- guard inputSearchProps != nil else { return .none }
123
- return useAnimated ? .animated : .header
124
- }
125
-
126
- private static var headerHeight: CGFloat { 52 }
127
-
128
- /// Extra top space reserved inside the content so the animated search bar has
129
- /// room below the header at scroll 0; it shrinks to 0 as the bar slides up.
130
- private var animatedSearchInset: CGFloat {
131
- guard inputSearchType == .animated else { return 0 }
132
- let scroll = max(scrollOffset, 0)
133
- return min(max(Self.headerHeight - scroll, 0), Self.headerHeight)
134
- }
135
-
136
- /// Title fades out as the animated search bar rises into the header.
137
- private var titleOpacity: CGFloat {
138
- guard inputSearchType == .animated else { return 1 }
139
- let scroll = max(scrollOffset, 0)
140
- return 1 - min(max(scroll / Self.headerHeight, 0), 1)
141
- }
142
-
143
- // MARK: - Body
144
-
145
- public var body: some View {
146
- GeometryReader { _ in
147
- let keyboardSize: CGFloat = useAvoidKeyboard ? max(keyboardHeight, 0) : 0
148
-
149
- ZStack(alignment: .top) {
150
- // Background color
151
- (backgroundColor ?? Color.white)
152
- .edgesIgnoringSafeArea(.all)
153
-
154
- VStack(spacing: 0) {
155
- ZStack(alignment: fabProps?.position == .center ? .bottom : .bottomTrailing) {
156
- VStack(alignment: horizontalAlignment, spacing: 0) {
157
- headerAndContent
158
- }
159
-
160
- FloatingContent(
161
- fabProps: fabProps,
162
- keyboardSize: keyboardSize,
163
- hasFooter: footer != nil,
164
- scrollOffset: scrollOffset
165
- )
166
- }
167
-
168
- NavigationFooter(footerComponent: footer, keyboardSize: keyboardSize)
169
- }
170
-
171
- // Animated search bar overlay (mirrors Compose's SearchAnimated layer).
172
- if inputSearchType == .animated, let props = inputSearchProps {
173
- SearchAnimatedHeader(
174
- props: props,
175
- scrollOffset: scrollOffset,
176
- hiddenBack: !isBack,
177
- hasHeaderRight: headerRight != nil,
178
- headerRightWidth: headerRightWidth,
179
- headerHeight: Self.headerHeight
180
- )
181
- }
182
- }
183
- .ignoresSafeArea(.keyboard, edges: .bottom)
184
- .onPreferenceChange(HeaderRightWidthKey.self) { width in
185
- if headerRightWidth != width { headerRightWidth = width }
186
- }
187
- .onPreferenceChange(IsBottomTabRootKey.self) { isRoot in
188
- if isBottomTabRoot != isRoot { isBottomTabRoot = isRoot }
189
- }
190
- .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillChangeFrameNotification)) { notification in
191
- guard useAvoidKeyboard,
192
- let endFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return }
193
- withAnimation(.easeOut(duration: 0.25)) {
194
- keyboardHeight = UIScreen.main.bounds.height - endFrame.origin.y
195
- }
196
- }
197
- // Mirrors Compose's `hideKeyboardOnTap()`: a simultaneous gesture so
198
- // taps still reach buttons/fields while also dismissing the keyboard.
199
- .modifier(HideKeyboardOnTap(enabled: keyboardShouldPersistTaps))
200
- }
201
- .task(id: screenName) {
202
- ScreenTracker.trackScreenNavigated(
203
- maxApi: appEnv.maxApi,
204
- context: appEnv.applicationContext,
205
- screenName: screenName,
206
- action: trackingAction,
207
- state: trackingState
208
- )
209
- do {
210
- try await Task.sleep(nanoseconds: 2_000_000_000)
211
- } catch {
212
- return
213
- }
214
- let loadTime = Date().timeIntervalSince1970 * 1000 - trackingState.time
215
- ScreenTracker.trackScreenDisplayed(
216
- maxApi: appEnv.maxApi,
217
- context: appEnv.applicationContext,
218
- screenName: screenName,
219
- duration: loadTime,
220
- state: trackingState
221
- )
222
- let interactionTime = Date().timeIntervalSince1970 * 1000 - trackingState.time
223
- ScreenTracker.trackScreenInteracted(
224
- maxApi: appEnv.maxApi,
225
- context: appEnv.applicationContext,
226
- screenName: screenName,
227
- duration: interactionTime - loadTime,
228
- totalDuration: interactionTime,
229
- state: trackingState
230
- )
231
- }
232
- }
233
-
234
- // MARK: - Header + content layer
235
-
236
- @ViewBuilder
237
- private var headerAndContent: some View {
238
- if let animatedHeader = animatedHeader {
239
- // Animated (hero) header: the image is the top of the scroll content
240
- // and the body overlaps its lower part; the header bar background
241
- // fades in over the image as the screen scrolls (mirrors Compose's
242
- // ScreenContent for HeaderType.Animated).
243
- ZStack(alignment: .top) {
244
- StackScreenContent(
245
- scrollable: scrollable,
246
- scrollOffset: $scrollOffset,
247
- scrollToTopCallback: scrollToTopCallback,
248
- animatedSearchInset: animatedSearchInset,
249
- content: { animatedHeroBody(animatedHeader) }
250
- )
251
- .edgesIgnoringSafeArea(.all)
252
-
253
- header
254
- .background(
255
- Colors.black01
256
- .opacity(scrollOpacity)
257
- .edgesIgnoringSafeArea(.top)
258
- )
259
- .zIndex(100)
260
- }
261
- } else if headerTransparent && fullScreenContent {
262
- ZStack(alignment: .top) {
263
- header
264
- .background(
265
- NavigationHeaderBackground(
266
- headerType: headerType,
267
- scrollState: scrollOffset,
268
- headerTransparent: headerTransparent,
269
- fullScreenContent: fullScreenContent
270
- )
271
- )
272
- .zIndex(100)
273
-
274
- StackScreenContent(scrollable: scrollable, scrollOffset: $scrollOffset, scrollToTopCallback: scrollToTopCallback, animatedSearchInset: animatedSearchInset, content: content)
275
- .edgesIgnoringSafeArea(.all)
276
- }
277
- } else {
278
- header
279
- .background(
280
- NavigationHeaderBackground(
281
- headerType: headerType,
282
- scrollState: scrollOffset,
283
- headerTransparent: headerTransparent,
284
- fullScreenContent: fullScreenContent
285
- )
286
- .edgesIgnoringSafeArea(.top)
287
- )
288
-
289
- StackScreenContent(scrollable: scrollable, scrollOffset: $scrollOffset, scrollToTopCallback: scrollToTopCallback, animatedSearchInset: animatedSearchInset, content: content)
290
- }
291
- }
292
-
293
- /// Hero image + body for an animated header. The image fills the width at its
294
- /// aspect-ratio height; the body is offset below the header band so it overlaps
295
- /// the lower part of the image (mirrors Compose's image box + padded content).
296
- @ViewBuilder
297
- private func animatedHeroBody(_ animatedHeader: AnimatedHeader) -> some View {
298
- let width = UIScreen.main.bounds.width
299
- let imageHeight = width / animatedHeader.aspectRatio.value
300
- let contentTopInset = safeAreaTopInset() + HEADER_HEIGHT + layoutOffset
301
-
302
- ZStack(alignment: .top) {
303
- animatedHeader.composable(scrollOffset)
304
- .frame(width: width, height: imageHeight)
305
- .clipped()
306
-
307
- content()
308
- .padding(.top, contentTopInset)
309
- }
310
- .frame(maxWidth: .infinity, alignment: .top)
311
- }
312
-
313
- private var header: NavigationHeader {
314
- NavigationHeader(
315
- headerType: headerType,
316
- titlePosition: titlePosition,
317
- title: title,
318
- headerTitle: headerTitle,
319
- headerRight: headerRight,
320
- goBack: goBack,
321
- opacity: scrollOpacity,
322
- animatedHeader: animatedHeader,
323
- scrollState: scrollOffset,
324
- // For the animated search the bar is rendered by the overlay, so the
325
- // header shows the (fading) title instead of an inline search field.
326
- inputSearchProps: inputSearchType == .header ? inputSearchProps : nil,
327
- tintColor: tintColor,
328
- titleOpacity: titleOpacity
329
- )
330
- }
331
- }
332
-
333
- // MARK: - Screen content (scrollable body)
334
-
335
- /// Mirrors Compose's `ScreenContent`/`MainContent`: renders the screen body and,
336
- /// when scrollable, tracks the scroll offset so the header/FAB can react to it.
337
- private struct StackScreenContent<Content: View>: View {
338
- let scrollable: Bool
339
- @Binding var scrollOffset: CGFloat
340
- /// Mirrors Compose's `ScrollData.scrollToTopCallback`; fired alongside the
341
- /// scroll-to-top triggered by a status-bar tap.
342
- let scrollToTopCallback: (() -> Void)?
343
- /// Extra top space reserved for the animated search bar (mirrors Compose's
344
- /// MainContent animated top spacer). Zero for non-animated screens.
345
- var animatedSearchInset: CGFloat = 0
346
- let content: () -> Content
347
-
348
- private let topAnchorID = "stack_screen_top_anchor"
349
- private let scrollSpace = "stack_screen_scroll_space"
350
-
351
- var body: some View {
352
- if scrollable {
353
- ScrollViewReader { proxy in
354
- ScrollView(.vertical, showsIndicators: false) {
355
- VStack(spacing: 0) {
356
- // Top probe + scroll-to-top anchor. Measured in the scroll's
357
- // own coordinate space so the offset is a clean 0-based
358
- // "pixels scrolled" value, independent of the inset below.
359
- Color.clear
360
- .frame(height: 0)
361
- .id(topAnchorID)
362
- .background(GeometryReader { geo in
363
- Color.clear
364
- .onAppear {
365
- scrollOffset = -geo.frame(in: .named(scrollSpace)).minY
366
- }
367
- .onChange(of: geo.frame(in: .named(scrollSpace)).minY) { minY in
368
- scrollOffset = -minY
369
- }
370
- })
371
-
372
- if animatedSearchInset > 0 {
373
- Spacer().frame(height: animatedSearchInset)
374
- }
375
-
376
- VStack {
377
- content()
378
- }
379
- }
380
- }
381
- .coordinateSpace(name: scrollSpace)
382
- // Status-bar tap (via MoMoStatusBarTap swizzle) scrolls to top and
383
- // notifies the consumer, mirroring Compose's scrollToTopCallback.
384
- .onReceive(NotificationCenter.default.publisher(for: MoMoStatusBarTap.notificationName)) { _ in
385
- withAnimation {
386
- proxy.scrollTo(topAnchorID, anchor: .top)
387
- }
388
- scrollToTopCallback?()
389
- }
390
- }
391
- } else {
392
- content()
393
- }
394
- }
395
- }
396
-
397
- // MARK: - Animated search header
398
-
399
- /// Mirrors Compose's `SearchAnimated`: the search bar slides from below the
400
- /// header (scroll 0) up into the header band as the user scrolls, while its
401
- /// horizontal insets grow to make room for the back button and header-right.
402
- /// Note: Compose's scroll-end snap and background-color lerp are not ported.
403
- private struct SearchAnimatedHeader: View {
404
- let props: InputSearchProps
405
- let scrollOffset: CGFloat
406
- let hiddenBack: Bool
407
- let hasHeaderRight: Bool
408
- let headerRightWidth: CGFloat
409
- let headerHeight: CGFloat
410
-
411
- var body: some View {
412
- let scroll = max(scrollOffset, 0)
413
-
414
- // Insets are measured from the safe-area top (status bar handled by layout).
415
- let minTop: CGFloat = 0
416
- let maxTop = headerHeight
417
- let minSide = Spacing.M
418
- let maxStart: CGFloat = hiddenBack ? Spacing.M : 48
419
- let maxEnd = headerRightWidth + (hasHeaderRight ? Spacing.M * 2 : Spacing.M)
420
-
421
- let top = min(max(maxTop - scroll, minTop), maxTop)
422
- let start = min(max(minSide + scroll, minSide), maxStart)
423
- let end = min(max(minSide + scroll, minSide), maxEnd)
424
-
425
- VStack(spacing: 0) {
426
- Spacer().frame(height: top)
427
- InputSearch(props: props)
428
- .frame(height: headerHeight)
429
- .padding(.leading, start)
430
- .padding(.trailing, end)
431
- Spacer(minLength: 0)
432
- }
433
- .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
434
- }
435
- }
436
-
437
- // MARK: - Floating content
438
-
439
- /// Mirrors Compose's `FloatingContent`: no FAB props means nothing renders.
440
- private struct FloatingContent: View {
441
- let fabProps: FabProps?
442
- let keyboardSize: CGFloat
443
- /// With a footer the FAB is anchored to the footer's *layout* top, which does not move
444
- /// when the band offsets itself over the keyboard — so it rides the same offset.
445
- let hasFooter: Bool
446
- let scrollOffset: CGFloat
447
-
448
- /// Compose keeps the FAB `Spacing.M + AppNavigationBar` above the bottom of the screen
449
- /// and lifts it with `imePadding()`; here it sits `Spacing.M` above the safe area and
450
- /// nothing lifts it, so the difference is applied as an offset (see NavigationFooter).
451
- private var verticalOffset: CGFloat {
452
- if hasFooter { return NavigationFooter.verticalOffset(keyboardSize: keyboardSize) }
453
- return NavigationFooter.safeAreaBottom - NavigationFooter.navigationBarInset - keyboardSize
454
- }
455
-
456
- var body: some View {
457
- if let fabProps = fabProps {
458
- FloatingButton(
459
- props: fabProps,
460
- keyboardOffset: 0,
461
- scrollOffset: scrollOffset
462
- )
463
- .padding(.horizontal, Spacing.M)
464
- .offset(y: verticalOffset)
465
- .ignoresSafeArea(.keyboard, edges: .bottom)
466
- }
467
- }
468
- }
469
-
470
- // MARK: - Hide keyboard on tap
471
-
472
- /// Mirrors Compose's `Modifier.hideKeyboardOnTap()`. When enabled, a tap
473
- /// anywhere resigns the first responder. Uses `simultaneousGesture` so the tap
474
- /// is not consumed — buttons and text fields keep working.
475
- private struct HideKeyboardOnTap: ViewModifier {
476
- let enabled: Bool
477
-
478
- func body(content: Content) -> some View {
479
- if enabled {
480
- content.simultaneousGesture(
481
- TapGesture().onEnded {
482
- UIApplication.shared.sendAction(
483
- #selector(UIResponder.resignFirstResponder),
484
- to: nil, from: nil, for: nil
485
- )
486
- }
487
- )
488
- } else {
489
- content
490
- }
491
- }
492
- }
@@ -1,120 +0,0 @@
1
- # MoMoUIKitsDemo
2
-
3
- SwiftUI demo browser for `MoMoUIKits`.
4
-
5
- The package can optionally host a Compose UIKits screen by receiving a
6
- `UIViewController` factory from the host app. It does not import the KMP
7
- `shared` module directly.
8
-
9
- SwiftUI mode reuses the full demo screen set from
10
- `sample/iosApp/iosApp/Demo`, including the sample `HomeView` registry and demo
11
- screens for all currently available components.
12
-
13
- ## CocoaPods
14
-
15
- In the host app `Podfile`, include both local pods:
16
-
17
- ```ruby
18
- pod 'MoMoUIKits', :path => '../momo-native-kits/ios/native-kits.podspec'
19
- pod 'MoMoUIKitsDemo', :path => '../momo-native-kits/ios-demo'
20
- ```
21
-
22
- Adjust the relative paths to match the host app checkout.
23
-
24
- ## Host App Usage
25
-
26
- ```swift
27
- import MoMoUIKitsDemo
28
- import shared
29
-
30
- class UIKitsViewController: BaseComposeAppViewController {
31
- override func getViewController() -> UIViewController? {
32
- let params = self.application.data as? [String: Any]
33
-
34
- return MoMoUIKitsDemoViewControllerFactory.make(
35
- context: MoMoUIKitsDemoContext(
36
- appId: params?["appId"] as? String ?? "",
37
- appCode: params?["code"] as? String ?? "",
38
- appName: params?["name"] as? String,
39
- appIcon: params?["icon"] as? String ?? ""
40
- ),
41
- composeViewController: {
42
- UIKitsScreenComposeViewControllerKt.UIKitsScreenComposeViewController(
43
- params: params
44
- )
45
- }
46
- )
47
- }
48
-
49
- override func viewDidDisappear(_ animated: Bool) {
50
- super.viewDidDisappear(animated)
51
- composeViewController = nil
52
- }
53
- }
54
- ```
55
-
56
- If the host does not pass `composeViewController`, the demo opens directly in
57
- SwiftUI mode.
58
-
59
- ## Included SwiftUI Demos
60
-
61
- The pod includes the sample demo screens for:
62
-
63
- - Animated Header
64
- - Avatar
65
- - Badge
66
- - Baseline View
67
- - Bottom Tab
68
- - Button
69
- - Carousel
70
- - Checkbox
71
- - Chip
72
- - Collapse
73
- - DateTimePicker
74
- - Divider
75
- - Header User
76
- - Icon Button
77
- - Image
78
- - Information
79
- - Input
80
- - Input DropDown
81
- - Input Money
82
- - Input OTP
83
- - Input Phone Number
84
- - Input Search
85
- - Input TextArea
86
- - Loader
87
- - Navigation
88
- - Pagination
89
- - Popup Display
90
- - Popup Notify
91
- - Popup Promotion
92
- - Progress Info
93
- - Radio
94
- - Rating
95
- - Skeleton
96
- - Slider
97
- - SnackBar
98
- - Stepper
99
- - Steps
100
- - Suggest Action
101
- - Swipe
102
- - Switch
103
- - TabView
104
- - Tag
105
- - Theme
106
- - Title
107
- - Tooltip
108
- - Typography
109
- - Uploader
110
-
111
- ## Validation Notes
112
-
113
- Validated locally with:
114
-
115
- ```sh
116
- pod ipc spec ios/MoMoUIKits.podspec
117
- pod ipc spec ios-demo/MoMoUIKitsDemo.podspec
118
- pod lib lint ios/MoMoUIKits.podspec --allow-warnings --skip-import-validation
119
- pod lib lint ios-demo/MoMoUIKitsDemo.podspec --allow-warnings --skip-import-validation --include-podspecs=ios/MoMoUIKits.podspec
120
- ```
package/local.properties DELETED
@@ -1,8 +0,0 @@
1
- ## This file must *NOT* be checked into Version Control Systems,
2
- # as it contains information specific to your local configuration.
3
- #
4
- # Location of the SDK. This is only used by Gradle.
5
- # For customization when using a Version Control System, please read the
6
- # header note.
7
- #Tue Jun 02 17:05:32 ICT 2026
8
- sdk.dir=/Users/sophia/Library/Android/sdk
@@ -1,64 +0,0 @@
1
- import org.gradle.kotlin.dsl.maven
2
-
3
- rootProject.name = "momo-native-kits"
4
- enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
5
-
6
- pluginManagement {
7
- repositories {
8
- google {
9
- mavenContent {
10
- includeGroupAndSubgroups("androidx")
11
- includeGroupAndSubgroups("com.android")
12
- includeGroupAndSubgroups("com.google")
13
- }
14
- }
15
- mavenCentral()
16
- gradlePluginPortal()
17
- maven {
18
- url = uri("https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven")
19
- credentials {username = "download_packages"; password = "gldt-bjDqLpU_sPcHDuXau2ws" }
20
- }
21
- maven {
22
- url = uri("https://artifacts.mservice.com.vn/repository/maven-momo-app/")
23
- credentials {
24
- username = "viewer"
25
- password = "viewer"
26
- }
27
- isAllowInsecureProtocol = true
28
- }
29
- }
30
- }
31
-
32
- dependencyResolutionManagement {
33
- repositories {
34
- google {
35
- mavenContent {
36
- includeGroupAndSubgroups("androidx")
37
- includeGroupAndSubgroups("com.android")
38
- includeGroupAndSubgroups("com.google")
39
- }
40
- }
41
- mavenCentral()
42
- maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
43
- maven {
44
- url = uri("https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven")
45
- credentials {
46
- username = "download_packages";
47
- password = "gldt-bjDqLpU_sPcHDuXau2ws"
48
- }
49
- }
50
- maven {
51
- url = uri("https://artifacts.mservice.com.vn/repository/maven-momo-app/")
52
- credentials {
53
- username = "viewer"
54
- password = "viewer"
55
- }
56
- isAllowInsecureProtocol = true
57
- }
58
- }
59
- }
60
-
61
- include(":compose")
62
-
63
- include(":sample:androidApp")
64
- include(":sample:shared")