@momo-kits/native-kits 0.167.1-duo.2-debug → 0.167.1-duo.20

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 (266) hide show
  1. package/CLAUDE.md +36 -8
  2. package/README.md +2 -2
  3. package/ios/Application/ApplicationEnvironment.swift +17 -0
  4. package/ios/Application/MaxApi.swift +12 -3
  5. package/ios/Avatar/Avatar.swift +4 -3
  6. package/ios/Badge/Badge.swift +6 -4
  7. package/ios/Badge/BadgeDot.swift +1 -1
  8. package/ios/Badge/BadgeRibbon.swift +0 -1
  9. package/ios/Button/Button.swift +15 -12
  10. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +64 -18
  11. package/ios/Carousel/Carousel.swift +29 -12
  12. package/ios/Checkbox/Checkbox.swift +7 -3
  13. package/ios/Chip/Chip.swift +5 -4
  14. package/ios/Collapse/Collapse.swift +70 -19
  15. package/ios/Colors+Radius+Spacing/Colors.swift +10 -1
  16. package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
  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 +187 -3
  38. package/ios/Layout/Item.swift +5 -4
  39. package/ios/Layout/ScreenLayout.swift +380 -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 +128 -9
  44. package/ios/Navigation/BottomTab/BottomTab.swift +185 -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 +531 -0
  50. package/ios/Navigation/Component/HeaderBackground.swift +133 -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 +377 -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 +183 -0
  57. package/ios/{Application/Navigation/Overplay → Navigation/Component}/SnackBar.swift +5 -6
  58. package/ios/Navigation/HostBackGestureBridge.swift +78 -0
  59. package/ios/{Application/Navigation/Overplay → Navigation}/ModalScreen.swift +5 -2
  60. package/ios/Navigation/Navigation.swift +204 -0
  61. package/ios/Navigation/NavigationContainer.swift +194 -0
  62. package/ios/{Application/Navigation → Navigation}/Navigator.swift +177 -91
  63. package/ios/Navigation/StackScreen.swift +820 -0
  64. package/ios/Navigation/StackTransition.swift +400 -0
  65. package/ios/Navigation/SwipeBackHaptic.swift +33 -0
  66. package/ios/{Application/Navigation → Navigation}/Tracking/ScreenTracker.swift +12 -5
  67. package/ios/OTPKeyboard/OTPKeyboard.swift +8 -11
  68. package/ios/Pagination/PaginationScroll.swift +2 -2
  69. package/ios/Popup/PopupDisplay.swift +72 -136
  70. package/ios/Popup/PopupInput.swift +10 -13
  71. package/ios/Popup/PopupLayout.swift +140 -0
  72. package/ios/Popup/PopupNotify.swift +56 -73
  73. package/ios/Popup/PopupPromotion.swift +31 -47
  74. package/ios/PopupView/FullscreenPopup.swift +13 -19
  75. package/ios/PopupView/PopupView.swift +1 -1
  76. package/ios/PopupView/Utils++.swift +0 -8
  77. package/ios/ProgressInfo/ProgressInfo.swift +4 -2
  78. package/ios/Radio/Radio.swift +2 -1
  79. package/ios/Rating/Rating.swift +9 -1
  80. package/ios/Resources/dot_loading.json +558 -0
  81. package/ios/Resources/lottie_circle_loader.json +1 -0
  82. package/ios/ScrollIndicator/ScrollIndicator.swift +11 -10
  83. package/ios/Skeleton/Skeleton.swift +22 -27
  84. package/ios/Slider/Slider.swift +16 -18
  85. package/ios/Stepper/Stepper.swift +6 -1
  86. package/ios/Steps/Steps.swift +8 -6
  87. package/ios/SuggestAction/SuggestAction.swift +5 -0
  88. package/ios/Swipeable/SwipeCell.swift +10 -6
  89. package/ios/Switch/Switch.swift +22 -20
  90. package/ios/TabView/TabView.swift +102 -21
  91. package/ios/Tag/Tag.swift +15 -4
  92. package/ios/Template/Logo/Logo.swift +2 -1
  93. package/ios/Template/TrustBanner/TrustBanner.swift +106 -54
  94. package/ios/Title/Title.swift +6 -17
  95. package/ios/Tooltip/Tooltip.swift +29 -14
  96. package/ios/Typography/Text.swift +61 -19
  97. package/ios/Uploader/Uploader.swift +3 -1
  98. package/ios/native-kits.podspec +2 -1
  99. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  100. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +1 -1
  101. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DuoTabDemo.swift +80 -0
  102. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +1 -0
  103. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IPhoneDuoDemo.swift +173 -0
  104. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +77 -1
  105. package/package.json +1 -1
  106. package/scripts/gen-ios-icons.mjs +36 -0
  107. package/build.gradle.kts +0 -11
  108. package/compose/build.gradle.kts +0 -190
  109. package/compose/build.gradle.kts.backup +0 -190
  110. package/compose/compose.podspec +0 -47
  111. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  112. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  113. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  114. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  115. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -151
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -831
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -189
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -475
  149. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  150. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -266
  151. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
  152. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  153. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -264
  154. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  155. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  156. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  157. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  158. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  159. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  160. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  161. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -334
  162. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -98
  163. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
  164. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -552
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
  176. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  177. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  178. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -16
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -297
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -54
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -50
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +0 -157
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -41
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  199. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  200. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  201. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  202. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  203. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -299
  204. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +0 -58
  205. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -129
  206. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  207. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -205
  208. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  209. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  210. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -622
  211. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  212. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  213. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -175
  214. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -232
  215. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  216. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  217. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -381
  218. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -83
  219. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -105
  220. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -74
  221. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -347
  222. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -37
  223. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -363
  224. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +0 -169
  225. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  226. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  227. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  228. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  229. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  230. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -71
  231. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  232. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  233. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  234. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -118
  235. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -40
  236. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -45
  237. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  238. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  239. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  240. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -213
  241. package/gradle/libs.versions.toml +0 -69
  242. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  243. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  244. package/gradle.properties +0 -26
  245. package/gradlew +0 -252
  246. package/gradlew.bat +0 -94
  247. package/ios/Application/Components.swift +0 -270
  248. package/ios/Application/ComposeApi.swift +0 -22
  249. package/ios/Application/HeaderRight.swift +0 -306
  250. package/ios/Application/Navigation/BottomTab/BottomTab.swift +0 -104
  251. package/ios/Application/Navigation/HeaderBackProps.swift +0 -66
  252. package/ios/Application/Navigation/HeaderTitle.swift +0 -57
  253. package/ios/Application/Navigation/NavigationContainer.swift +0 -213
  254. package/ios/Application/Navigation/NavigationOptions.swift +0 -109
  255. package/ios/Application/Navigation/NavigatorManager.swift +0 -22
  256. package/ios/Application/Navigation/component/Header.swift +0 -178
  257. package/ios/Application/Navigation/component/HeaderBackground.swift +0 -83
  258. package/ios/Application/Navigation/component/HeaderColor.swift +0 -65
  259. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +0 -11
  260. package/ios/Application/Navigation/component/NavigationFooter.swift +0 -90
  261. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +0 -196
  262. package/ios/Application/Screen.swift +0 -250
  263. package/ios/Application/StackScreen.swift +0 -492
  264. package/ios-demo/README.md +0 -120
  265. package/settings.gradle.kts +0 -64
  266. /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
- ```
@@ -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")