@momo-kits/native-kits 0.162.2-debug → 0.162.2-sp.1

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 (278) hide show
  1. package/.claude/settings.local.json +55 -0
  2. package/ios/Application/Components.swift +34 -43
  3. package/ios/Application/FloatingButton.swift +10 -8
  4. package/ios/Application/Navigation/BottomTab/BottomTab.swift +102 -0
  5. package/ios/Application/Navigation/BottomTab/BottomTabBar.swift +215 -0
  6. package/ios/Application/Navigation/BottomTab/CurvedContainer.swift +65 -0
  7. package/ios/Application/Navigation/HeaderBackProps.swift +66 -0
  8. package/ios/Application/Navigation/HeaderTitle.swift +57 -0
  9. package/ios/Application/Navigation/HeaderUser.swift +209 -0
  10. package/ios/Application/Navigation/NavigationContainer.swift +151 -0
  11. package/ios/Application/Navigation/NavigationOptions.swift +109 -0
  12. package/ios/Application/Navigation/Navigator.swift +360 -0
  13. package/ios/Application/Navigation/Overplay/BottomSheet.swift +176 -0
  14. package/ios/Application/Navigation/Overplay/ModalScreen.swift +68 -0
  15. package/ios/Application/Navigation/Overplay/SnackBar.swift +144 -0
  16. package/ios/Application/Navigation/component/Header.swift +178 -0
  17. package/ios/Application/Navigation/component/HeaderBackground.swift +83 -0
  18. package/ios/Application/Navigation/component/HeaderColor.swift +65 -0
  19. package/ios/Application/StackScreen.swift +449 -0
  20. package/ios/Avatar/Avatar.swift +193 -0
  21. package/ios/Badge/Badge.swift +11 -13
  22. package/ios/Badge/BadgeRibbon.swift +12 -19
  23. package/ios/BaselineView/BaselineView.swift +163 -0
  24. package/ios/Button/Button.swift +62 -23
  25. package/ios/Carousel/Carousel.swift +181 -0
  26. package/ios/Checkbox/Checkbox.swift +14 -12
  27. package/ios/Chip/Chip.swift +23 -9
  28. package/ios/Collapse/Collapse.swift +182 -0
  29. package/ios/Colors+Radius+Spacing/Colors.swift +1 -1
  30. package/ios/Colors+Radius+Spacing/Theme.swift +295 -0
  31. package/ios/DateTimePicker/DateTimePicker.swift +210 -0
  32. package/ios/DateTimePicker/DateTimePickerTypes.swift +55 -0
  33. package/ios/DateTimePicker/DateTimePickerUtils.swift +167 -0
  34. package/ios/DateTimePicker/WheelPicker.swift +161 -0
  35. package/ios/Divider/Divider.swift +16 -0
  36. package/ios/Icon/Icon.swift +6 -1
  37. package/ios/IconButton/IconButton.swift +112 -0
  38. package/ios/Information/Information.swift +151 -0
  39. package/ios/Input/Input.swift +42 -25
  40. package/ios/Input/InputPhoneNumber.swift +21 -19
  41. package/ios/Input/InputSearch.swift +101 -45
  42. package/ios/Input/InputTextArea.swift +67 -40
  43. package/ios/InputDropDown/InputDropDown.swift +198 -0
  44. package/ios/InputMoney/InputMoney.swift +335 -0
  45. package/ios/InputOTP/InputOTP.swift +210 -0
  46. package/ios/Loader/Loader.swift +113 -0
  47. package/ios/MoMoUIKits.podspec +5 -0
  48. package/ios/OTPKeyboard/KeyboardButton.swift +1 -1
  49. package/ios/Pagination/PaginationDot.swift +61 -0
  50. package/ios/Pagination/PaginationNumber.swift +35 -0
  51. package/ios/Pagination/PaginationScroll.swift +101 -0
  52. package/ios/Pagination/PaginationWhiteDot.swift +37 -0
  53. package/ios/Popup/PopupDisplay.swift +10 -12
  54. package/ios/Popup/PopupInput.swift +2 -6
  55. package/ios/Popup/PopupNotify.swift +219 -0
  56. package/ios/ProgressInfo/ProgressInfo.swift +294 -0
  57. package/ios/Radio/Radio.swift +70 -0
  58. package/ios/Rating/Rating.swift +82 -0
  59. package/ios/Skeleton/Skeleton.swift +99 -0
  60. package/ios/Slider/Slider.swift +237 -0
  61. package/ios/Stepper/Stepper.swift +220 -0
  62. package/ios/Steps/Steps.swift +451 -0
  63. package/ios/SuggestAction/SuggestAction.swift +97 -0
  64. package/ios/Swipeable/SwipeCell.swift +185 -0
  65. package/ios/Swipeable/SwipeCellModel.swift +21 -0
  66. package/ios/TabView/TabView.swift +530 -0
  67. package/ios/Tag/Tag.swift +98 -0
  68. package/ios/Template/TrustBanner/TrustBanner.swift +2 -0
  69. package/ios/Title/Title.swift +269 -0
  70. package/ios/Tooltip/Tooltip.swift +482 -0
  71. package/ios/Typography/Text.swift +77 -5
  72. package/ios/Typography/Typography.swift +9 -0
  73. package/ios/Uploader/Uploader.swift +183 -0
  74. package/ios/native-kits.podspec +58 -8
  75. package/ios-demo/MoMoUIKitsDemo.podspec +18 -0
  76. package/ios-demo/Resources/dot_loading.json +558 -0
  77. package/ios-demo/Resources/icon.json +4052 -0
  78. package/ios-demo/Resources/lottie_circle_loader.json +1 -0
  79. package/ios-demo/Sources/MoMoUIKitsDemo/DemoScaffold.swift +48 -0
  80. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsBadgeDemoView.swift +25 -0
  81. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsButtonDemoView.swift +26 -0
  82. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsCheckboxDemoView.swift +19 -0
  83. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsChipDemoView.swift +33 -0
  84. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsInputDemoView.swift +48 -0
  85. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsPopupDemoView.swift +21 -0
  86. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsRadioDemoView.swift +17 -0
  87. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsTypographyDemoView.swift +28 -0
  88. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoContext.swift +31 -0
  89. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoFactory.swift +72 -0
  90. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AnimatedHeaderDemo.swift +110 -0
  91. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +93 -0
  92. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +269 -0
  93. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BaselineView.swift +117 -0
  94. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BottomTabDemo.swift +89 -0
  95. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ButtonDemo.swift +100 -0
  96. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +126 -0
  97. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +63 -0
  98. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +20 -0
  99. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +93 -0
  100. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +107 -0
  101. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +124 -0
  102. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +14 -0
  103. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/HeaderUserDemo.swift +49 -0
  104. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +261 -0
  105. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +58 -0
  106. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +78 -0
  107. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +138 -0
  108. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +111 -0
  109. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +136 -0
  110. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +107 -0
  111. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +73 -0
  112. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +100 -0
  113. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +32 -0
  114. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +57 -0
  115. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +70 -0
  116. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +227 -0
  117. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +72 -0
  118. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +175 -0
  119. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +121 -0
  120. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +76 -0
  121. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +89 -0
  122. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +32 -0
  123. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +56 -0
  124. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +32 -0
  125. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +150 -0
  126. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +138 -0
  127. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +103 -0
  128. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +94 -0
  129. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +79 -0
  130. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +152 -0
  131. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +33 -0
  132. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +190 -0
  133. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +34 -0
  134. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +182 -0
  135. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +109 -0
  136. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +187 -0
  137. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +87 -0
  138. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +131 -0
  139. package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +50 -0
  140. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoModels.swift +15 -0
  141. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoRegistry.swift +73 -0
  142. package/package.json +1 -1
  143. package/publish.sh +50 -0
  144. package/scripts/gen-ios-color.mjs +136 -0
  145. package/build.gradle.kts +0 -11
  146. package/compose/build.gradle.kts +0 -186
  147. package/compose/build.gradle.kts.backup +0 -186
  148. package/compose/compose.podspec +0 -47
  149. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  150. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -123
  151. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  152. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  153. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  154. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  155. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  156. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  157. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  158. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  159. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  160. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  161. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  162. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  163. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  164. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -57
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -109
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -201
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -222
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -48
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -305
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -921
  176. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -121
  177. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -403
  178. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -85
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -340
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -198
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -357
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -123
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -94
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -136
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -224
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -148
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -188
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -116
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -452
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -172
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -255
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -235
  199. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -233
  200. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -259
  201. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -241
  202. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -364
  203. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  204. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  205. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  206. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -92
  207. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  208. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -352
  209. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -103
  210. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -338
  211. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -70
  212. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  213. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
  214. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -96
  215. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -348
  216. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -256
  217. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -494
  218. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -131
  219. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -215
  220. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -96
  221. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -531
  222. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -92
  223. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -135
  224. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -214
  225. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -590
  226. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -177
  227. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -192
  228. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -205
  229. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  230. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -239
  231. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -191
  232. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
  233. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  234. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  235. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  236. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -285
  237. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -2
  238. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -35
  239. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -2
  240. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -57
  241. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -68
  242. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  243. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -14
  244. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -50
  245. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  246. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -253
  247. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -133
  248. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -104
  249. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -145
  250. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -345
  251. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  252. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -556
  253. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -161
  254. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -243
  255. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  256. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -187
  257. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -315
  258. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -80
  259. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -306
  260. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -34
  261. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -370
  262. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -131
  263. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -167
  264. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -72
  265. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -66
  266. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  267. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -70
  268. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  269. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -105
  270. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -33
  271. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -186
  272. package/gradle/libs.versions.toml +0 -67
  273. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  274. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  275. package/gradle.properties +0 -26
  276. package/gradlew +0 -252
  277. package/gradlew.bat +0 -94
  278. package/settings.gradle.kts +0 -64
@@ -0,0 +1 @@
1
+ {"v":"5.10.2","fr":30,"ip":0,"op":20,"w":100,"h":100,"nm":"Spinner3.1_Refine","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":12,"ty":4,"nm":"loading 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":20}],"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2,"l":2},"a":{"a":0,"k":[44.124,44.124,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[90,90],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.996078431373,0.956862745098,0.980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[44.124,44.124],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20],"e":[0]},{"t":20}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[35],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[50],"e":[35]},{"t":20}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":20,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"loading 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0],"e":[360]},{"t":20}],"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2,"l":2},"a":{"a":0,"k":[44.124,44.124,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[90,90],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.835294117647,0.917647058824,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[44.124,44.124],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0],"e":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[20],"e":[0]},{"t":20}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[35],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[50],"e":[35]},{"t":20}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":20,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"base pink 2","sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2,"l":2},"a":{"a":0,"k":[44.124,44.124,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[90,90],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.996078431373,0.972549019608,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[44.124,44.124],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":20,"st":0,"ct":1,"bm":0}],"markers":[]}
@@ -0,0 +1,48 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct DemoScaffold<Content: View>: View {
5
+ let title: String
6
+ let content: Content
7
+
8
+ init(title: String, @ViewBuilder content: () -> Content) {
9
+ self.title = title
10
+ self.content = content()
11
+ }
12
+
13
+ var body: some View {
14
+ ScrollView {
15
+ VStack(alignment: .leading, spacing: 16) {
16
+ MomoText(title, typography: .headlineDefaultBold)
17
+ content
18
+ }
19
+ .frame(maxWidth: .infinity, alignment: .leading)
20
+ .padding(16)
21
+ }
22
+ .background(defaultTheme.colors.background.default.ignoresSafeArea())
23
+ .navigationTitle(title)
24
+ .navigationBarTitleDisplayMode(.inline)
25
+ }
26
+ }
27
+
28
+ struct DemoSection<Content: View>: View {
29
+ let title: String
30
+ let content: Content
31
+
32
+ init(_ title: String, @ViewBuilder content: () -> Content) {
33
+ self.title = title
34
+ self.content = content()
35
+ }
36
+
37
+ var body: some View {
38
+ VStack(alignment: .leading, spacing: 12) {
39
+ MomoText(title, typography: .headerDefaultBold)
40
+ content
41
+ }
42
+ .frame(maxWidth: .infinity, alignment: .leading)
43
+ .padding(16)
44
+ .background(defaultTheme.colors.background.surface)
45
+ .clipShape(RoundedRectangle(cornerRadius: Radius.S, style: .continuous))
46
+ }
47
+ }
48
+
@@ -0,0 +1,25 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct UIKitsBadgeDemoView: View {
5
+ var body: some View {
6
+ DemoScaffold(title: "Badge") {
7
+ DemoSection("Numeric") {
8
+ HStack(spacing: 12) {
9
+ Badge(label: "1")
10
+ Badge(label: "12")
11
+ Badge(label: "100")
12
+ }
13
+ }
14
+
15
+ DemoSection("Labels") {
16
+ HStack(spacing: 12) {
17
+ Badge(label: "New")
18
+ Badge(label: "Hot", backgroundColor: Colors.pink03)
19
+ Badge(label: "Sale", backgroundColor: Colors.orange03)
20
+ }
21
+ }
22
+ }
23
+ }
24
+ }
25
+
@@ -0,0 +1,26 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct UIKitsButtonDemoView: View {
5
+ var body: some View {
6
+ DemoScaffold(title: "Button") {
7
+ DemoSection("Types") {
8
+ MoMoUIKits.Button(title: "Primary Button", action: {})
9
+ MoMoUIKits.Button(title: "Secondary Button", action: {}, type: .secondary)
10
+ MoMoUIKits.Button(title: "Tonal Button", action: {}, type: .tonal)
11
+ MoMoUIKits.Button(title: "Outline Button", action: {}, type: .outline)
12
+ MoMoUIKits.Button(title: "Danger Button", action: {}, type: .danger)
13
+ MoMoUIKits.Button(title: "Text Button", action: {}, type: .text)
14
+ MoMoUIKits.Button(title: "Disabled Button", action: {}, type: .disabled)
15
+ }
16
+
17
+ DemoSection("Sizes and Loading") {
18
+ MoMoUIKits.Button(title: "Large", action: {}, size: .large)
19
+ MoMoUIKits.Button(title: "Medium", action: {}, size: .medium)
20
+ MoMoUIKits.Button(title: "Small", action: {}, size: .small)
21
+ MoMoUIKits.Button(title: "Loading", action: {}, loading: true)
22
+ }
23
+ }
24
+ }
25
+ }
26
+
@@ -0,0 +1,19 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct UIKitsCheckboxDemoView: View {
5
+ @State private var checked = true
6
+ @State private var unchecked = false
7
+
8
+ var body: some View {
9
+ DemoScaffold(title: "Checkbox") {
10
+ DemoSection("States") {
11
+ Checkbox($checked, title: "Checked")
12
+ Checkbox($unchecked, title: "Unchecked")
13
+ Checkbox(.constant(true), disabled: true, title: "Disabled checked")
14
+ Checkbox(.constant(true), indeterminate: true, title: "Indeterminate")
15
+ }
16
+ }
17
+ }
18
+ }
19
+
@@ -0,0 +1,33 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct UIKitsChipDemoView: View {
5
+ @State private var selected = "All"
6
+
7
+ var body: some View {
8
+ DemoScaffold(title: "Chip") {
9
+ DemoSection("Selectable") {
10
+ HStack(spacing: 8) {
11
+ chip("All")
12
+ chip("Active")
13
+ chip("Done")
14
+ }
15
+ }
16
+
17
+ DemoSection("Sizes") {
18
+ HStack(spacing: 8) {
19
+ Chip(label: "Large", size: .large)
20
+ Chip(label: "Small", size: .small)
21
+ Chip(label: "Selected", selected: true, size: .large)
22
+ }
23
+ }
24
+ }
25
+ }
26
+
27
+ private func chip(_ label: String) -> some View {
28
+ Chip(label: label, selected: selected == label) {
29
+ selected = label
30
+ }
31
+ }
32
+ }
33
+
@@ -0,0 +1,48 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct UIKitsInputDemoView: View {
5
+ @State private var text = ""
6
+ @State private var phone = "0987654321"
7
+ @State private var password = "momokits"
8
+
9
+ var body: some View {
10
+ DemoScaffold(title: "Input") {
11
+ DemoSection("Text Input") {
12
+ Input(
13
+ text: $text,
14
+ placeholder: "Enter text",
15
+ hintText: "Hint text",
16
+ onChangeText: { text = $0 }
17
+ )
18
+ Input(
19
+ text: $phone,
20
+ placeholder: "Phone number",
21
+ floatingValue: "Phone",
22
+ keyboardType: .phonePad,
23
+ onChangeText: { phone = $0 }
24
+ )
25
+ }
26
+
27
+ DemoSection("States") {
28
+ Input(
29
+ text: $password,
30
+ placeholder: "Password",
31
+ secureTextEntry: true,
32
+ onChangeText: { password = $0 }
33
+ )
34
+ Input(
35
+ text: .constant("Invalid value"),
36
+ placeholder: "Error",
37
+ error: "This field has an error"
38
+ )
39
+ Input(
40
+ text: .constant("Disabled value"),
41
+ placeholder: "Disabled",
42
+ disabled: true
43
+ )
44
+ }
45
+ }
46
+ }
47
+ }
48
+
@@ -0,0 +1,21 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct UIKitsPopupDemoView: View {
5
+ var body: some View {
6
+ DemoScaffold(title: "Popup Notify") {
7
+ DemoSection("Default") {
8
+ PopupNotify(
9
+ props: PopupNotifyProps(
10
+ title: "Payment successful",
11
+ description: "This popup demonstrates the native SwiftUI notification component.",
12
+ primary: PopupAction(title: "Done", onPress: {}),
13
+ secondary: PopupAction(title: "Later", onPress: {}),
14
+ onIconClose: {}
15
+ )
16
+ )
17
+ }
18
+ }
19
+ }
20
+ }
21
+
@@ -0,0 +1,17 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct UIKitsRadioDemoView: View {
5
+ @State private var selected: AnyHashable = "compose"
6
+
7
+ var body: some View {
8
+ DemoScaffold(title: "Radio") {
9
+ DemoSection("Options") {
10
+ Radio(value: "compose", groupValue: $selected, label: "Compose")
11
+ Radio(value: "swiftui", groupValue: $selected, label: "SwiftUI")
12
+ Radio(value: "disabled", groupValue: $selected, disabled: true, label: "Disabled")
13
+ }
14
+ }
15
+ }
16
+ }
17
+
@@ -0,0 +1,28 @@
1
+ import SwiftUI
2
+ import MoMoUIKits
3
+
4
+ struct UIKitsTypographyDemoView: View {
5
+ var body: some View {
6
+ DemoScaffold(title: "Typography") {
7
+ DemoSection("Headings") {
8
+ MomoText("Headline default bold", typography: .headlineDefaultBold)
9
+ MomoText("Header medium bold", typography: .headerMBold)
10
+ MomoText("Header default bold", typography: .headerDefaultBold)
11
+ }
12
+
13
+ DemoSection("Body") {
14
+ MomoText("Body default regular", typography: .bodyDefaultRegular)
15
+ MomoText("Description default regular", typography: .descriptionDefaultRegular)
16
+ MomoText("Label default medium", typography: .labelDefaultMedium)
17
+ }
18
+
19
+ DemoSection("Colors") {
20
+ MomoText("Primary text", typography: .bodyDefaultRegular, color: defaultTheme.colors.primary)
21
+ MomoText("Success text", typography: .bodyDefaultRegular, color: defaultTheme.colors.success.primary)
22
+ MomoText("Warning text", typography: .bodyDefaultRegular, color: defaultTheme.colors.warning.primary)
23
+ MomoText("Error text", typography: .bodyDefaultRegular, color: defaultTheme.colors.error.primary)
24
+ }
25
+ }
26
+ }
27
+ }
28
+
@@ -0,0 +1,31 @@
1
+ import Foundation
2
+ import MoMoUIKits
3
+
4
+ public struct MoMoUIKitsDemoContext {
5
+ public let appId: String
6
+ public let appCode: String
7
+ public let appName: String?
8
+ public let appIcon: String
9
+
10
+ public init(
11
+ appId: String = "",
12
+ appCode: String = "",
13
+ appName: String? = nil,
14
+ appIcon: String = ""
15
+ ) {
16
+ self.appId = appId
17
+ self.appCode = appCode
18
+ self.appName = appName
19
+ self.appIcon = appIcon
20
+ }
21
+
22
+ var miniAppContext: MiniAppContext {
23
+ MiniAppContext(
24
+ appId: appId,
25
+ appCode: appCode,
26
+ appName: appName,
27
+ appIcon: appIcon
28
+ )
29
+ }
30
+ }
31
+
@@ -0,0 +1,72 @@
1
+ import SwiftUI
2
+ import UIKit
3
+ import MoMoUIKits
4
+
5
+ public enum MoMoUIKitsDemoViewControllerFactory {
6
+ public static func make(
7
+ context: MoMoUIKitsDemoContext = MoMoUIKitsDemoContext(),
8
+ composeViewController: (() -> UIViewController)? = nil
9
+ ) -> UIViewController {
10
+ UIHostingController(
11
+ rootView: MoMoUIKitsDemoView(
12
+ context: context,
13
+ composeViewController: composeViewController
14
+ )
15
+ )
16
+ }
17
+ }
18
+
19
+ public struct MoMoUIKitsDemoView: View {
20
+ private let context: MoMoUIKitsDemoContext
21
+ private let composeViewController: (() -> UIViewController)?
22
+ @State private var mode: MoMoUIKitsDemoMode
23
+
24
+ public init(
25
+ context: MoMoUIKitsDemoContext = MoMoUIKitsDemoContext(),
26
+ composeViewController: (() -> UIViewController)? = nil
27
+ ) {
28
+ self.context = context
29
+ self.composeViewController = composeViewController
30
+ _mode = State(initialValue: composeViewController == nil ? .swiftUI : .compose)
31
+ }
32
+
33
+ public var body: some View {
34
+ VStack(spacing: 0) {
35
+ Picker("", selection: $mode) {
36
+ if composeViewController != nil {
37
+ Text("Compose").tag(MoMoUIKitsDemoMode.compose)
38
+ }
39
+ Text("SwiftUI").tag(MoMoUIKitsDemoMode.swiftUI)
40
+ }
41
+ .pickerStyle(.segmented)
42
+ .padding(.horizontal, 16)
43
+ .padding(.vertical, 12)
44
+ .background(Color(.systemBackground))
45
+
46
+ Group {
47
+ if mode == .compose, let composeViewController {
48
+ ComposeDemoHostView(makeViewController: composeViewController)
49
+ } else {
50
+ SwiftUIDemoBrowserView(context: context)
51
+ }
52
+ }
53
+ .frame(maxWidth: .infinity, maxHeight: .infinity)
54
+ }
55
+ }
56
+ }
57
+
58
+ private enum MoMoUIKitsDemoMode: String {
59
+ case compose
60
+ case swiftUI
61
+ }
62
+
63
+ private struct ComposeDemoHostView: UIViewControllerRepresentable {
64
+ let makeViewController: () -> UIViewController
65
+
66
+ func makeUIViewController(context: Context) -> UIViewController {
67
+ makeViewController()
68
+ }
69
+
70
+ func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
71
+ }
72
+
@@ -0,0 +1,110 @@
1
+ //
2
+ // AnimatedHeaderDemo.swift
3
+ // Example
4
+ //
5
+ // Usage demo for the animated (image) header. Mirrors Compose's
6
+ // `AnimatedHeaderUsage`: an image header configured with an aspect ratio +
7
+ // surface flag, over tall scrollable content that collapses the header.
8
+ //
9
+ // On iOS the header is supplied through the pushed screen's NavigationOptions
10
+ // (`animatedHeader:`) — options are fixed at push time (no live setOptions like
11
+ // Compose) — so the ratio/surface are chosen here and applied on "Show".
12
+ //
13
+
14
+ import MoMoUIKits
15
+ import SwiftUI
16
+
17
+ struct AnimatedHeaderDemo: View {
18
+ var body: some View {
19
+ if #available(iOS 16.0, *) {
20
+ AnimatedHeaderDemoContent()
21
+ } else {
22
+ Text("Animated header demo requires iOS 16+").padding()
23
+ }
24
+ }
25
+ }
26
+
27
+ @available(iOS 16.0, *)
28
+ struct AnimatedHeaderDemoContent: View {
29
+ @EnvironmentObject private var navigator: Navigator
30
+
31
+ @State private var ratio: AnimatedHeaderRatio = .ratio16_9
32
+ @State private var isSurface = true
33
+
34
+ private let imageUrl = "https://static.momocdn.net/app/img/booking/holiday/mid_atumn_dldl.jpeg"
35
+
36
+ var body: some View {
37
+ VStack(alignment: .leading, spacing: 20) {
38
+ MomoText("Aspect ratio", typography: .headerDefaultBold)
39
+ Picker("Ratio", selection: $ratio) {
40
+ Text("16:9").tag(AnimatedHeaderRatio.ratio16_9)
41
+ Text("1:1").tag(AnimatedHeaderRatio.ratio1_1)
42
+ Text("3:2").tag(AnimatedHeaderRatio.ratio3_2)
43
+ }
44
+ .pickerStyle(.segmented)
45
+
46
+ Toggle(isOn: $isSurface) {
47
+ MomoText("Surface")
48
+ }
49
+
50
+ MoMoUIKits.Button(
51
+ title: "Show Animated Header",
52
+ action: show,
53
+ type: .primary,
54
+ size: .large
55
+ )
56
+
57
+ Spacer()
58
+ }
59
+ .frame(maxWidth: .infinity, alignment: .leading)
60
+ .padding(16)
61
+ }
62
+
63
+ private func show() {
64
+ let ratio = ratio
65
+ let isSurface = isSurface
66
+ let url = imageUrl
67
+ navigator.push(
68
+ { AnimatedHeaderTargetScreen(ratio: ratio) },
69
+ options: NavigationOptions(
70
+ title: "Animated Header",
71
+ animatedHeader: AnimatedHeader(
72
+ aspectRatio: ratio,
73
+ isSurface: isSurface,
74
+ composable: { _ in
75
+ AnyView(
76
+ ImageView(url)
77
+ .frame(maxWidth: .infinity, maxHeight: .infinity)
78
+ .clipped()
79
+ )
80
+ }
81
+ )
82
+ )
83
+ )
84
+ }
85
+ }
86
+
87
+ // MARK: - Target screen (tall content under the image header)
88
+
89
+ @available(iOS 16.0, *)
90
+ private struct AnimatedHeaderTargetScreen: View {
91
+ @EnvironmentObject private var navigator: Navigator
92
+ let ratio: AnimatedHeaderRatio
93
+
94
+ var body: some View {
95
+ // A white rounded card that overlaps the hero image's lower part; the top
96
+ // inset under the image header is handled by StackScreen.
97
+ VStack(alignment: .leading, spacing: 16) {
98
+ MomoText("Scroll up to collapse the header", typography: .headerDefaultBold)
99
+ ForEach(0..<24, id: \.self) { i in
100
+ MomoText("Content row \(i + 1)")
101
+ .frame(maxWidth: .infinity, alignment: .leading)
102
+ }
103
+ MoMoUIKits.Button(title: "Go back", action: { navigator.pop() }, type: .secondary, size: .large)
104
+ }
105
+ .frame(maxWidth: .infinity, minHeight: UIScreen.main.bounds.height, alignment: .topLeading)
106
+ .padding(16)
107
+ .background(Colors.black01)
108
+ .clipShape(UnevenRoundedRectangle(topLeadingRadius: 16, topTrailingRadius: 16))
109
+ }
110
+ }
@@ -0,0 +1,93 @@
1
+ //
2
+ // AvatarDemo.swift
3
+ // Example
4
+ //
5
+
6
+ import SwiftUI
7
+ import MoMoUIKits
8
+
9
+ struct AvatarDemo: View {
10
+ var body: some View {
11
+ ScrollView {
12
+ VStack(alignment: .leading, spacing: 24) {
13
+ section("Size") {
14
+ HStack(alignment: .center, spacing: 8) {
15
+ Avatar(size: .size24)
16
+ Avatar(size: .size32)
17
+ Avatar(size: .size40)
18
+ Avatar(size: .size48)
19
+ Avatar(size: .size56)
20
+ Avatar(size: .size72)
21
+ }
22
+ }
23
+
24
+ section("Rounded vs Square") {
25
+ HStack(spacing: 8) {
26
+ Avatar(size: .size40, rounded: true)
27
+ Avatar(size: .size40, rounded: false)
28
+ }
29
+ }
30
+
31
+ section("Name (initials)") {
32
+ HStack(spacing: 8) {
33
+ Avatar(size: .size40, name: "Nguyen Van A")
34
+ Avatar(size: .size40, name: "John Doe")
35
+ Avatar(size: .size40, name: "MoMo")
36
+ }
37
+ }
38
+
39
+ section("Image") {
40
+ HStack(spacing: 8) {
41
+ Avatar(size: .size40, image: "https://i.pravatar.cc/150?img=1")
42
+ Avatar(size: .size56, image: "https://i.pravatar.cc/150?img=2")
43
+ Avatar(size: .size72, image: "https://i.pravatar.cc/150?img=3")
44
+ }
45
+ }
46
+
47
+ section("showIconMomo") {
48
+ HStack(spacing: 8) {
49
+ Avatar(size: .size40, showIconMomo: true)
50
+ Avatar(size: .size48, name: "MN", showIconMomo: true)
51
+ Avatar(size: .size56, image: "https://i.pravatar.cc/150?img=4", showIconMomo: true)
52
+ }
53
+ }
54
+
55
+ section("showIconSupport") {
56
+ HStack(spacing: 8) {
57
+ Avatar(size: .size40, showIconSupport: true)
58
+ Avatar(size: .size48, name: "CS", showIconSupport: true)
59
+ Avatar(size: .size56, image: "https://i.pravatar.cc/150?img=5", showIconSupport: true)
60
+ }
61
+ }
62
+
63
+ section("showIconMomo + showIconSupport") {
64
+ HStack(spacing: 8) {
65
+ Avatar(size: .size56, showIconMomo: true, showIconSupport: true)
66
+ Avatar(size: .size72, name: "NV", showIconMomo: true, showIconSupport: true)
67
+ }
68
+ }
69
+ }
70
+ .padding()
71
+ }
72
+ }
73
+
74
+ @ViewBuilder
75
+ private func section<Content: View>(
76
+ _ title: String,
77
+ @ViewBuilder content: () -> Content
78
+ ) -> some View {
79
+ VStack(alignment: .leading, spacing: 8) {
80
+ Text(title)
81
+ .font(.headline)
82
+ content()
83
+ }
84
+ }
85
+ }
86
+
87
+ #if DEBUG
88
+ struct AvatarDemo_Previews: PreviewProvider {
89
+ static var previews: some View {
90
+ AvatarDemo()
91
+ }
92
+ }
93
+ #endif