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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/.claude/settings.local.json +55 -0
  2. package/build.gradle.kts +11 -0
  3. package/compose/build.gradle.kts +186 -0
  4. package/compose/build.gradle.kts.backup +186 -0
  5. package/compose/compose.podspec +47 -0
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +123 -0
  8. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  9. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  10. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  11. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  12. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  13. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  14. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  15. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  16. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  17. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  18. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  19. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  20. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  21. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +57 -0
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +109 -0
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +201 -0
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +222 -0
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +48 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +305 -0
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +921 -0
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +121 -0
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +403 -0
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +85 -0
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +340 -0
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +198 -0
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +357 -0
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +94 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +136 -0
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +543 -0
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +148 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +188 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +116 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +452 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +172 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +255 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +235 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +233 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +259 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +241 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +364 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +92 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +352 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +103 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +70 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +17 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +96 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +96 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +92 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +135 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +214 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +590 -0
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +177 -0
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +205 -0
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +239 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +191 -0
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +306 -0
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +285 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +35 -0
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +57 -0
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +68 -0
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +14 -0
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +253 -0
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +133 -0
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +104 -0
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +145 -0
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +345 -0
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +556 -0
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +161 -0
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +243 -0
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +187 -0
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +315 -0
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +80 -0
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +306 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +34 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +370 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +131 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +167 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +72 -0
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +66 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +70 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +105 -0
  127. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +33 -0
  128. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +186 -0
  129. package/gradle/libs.versions.toml +67 -0
  130. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  131. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  132. package/gradle.properties +26 -0
  133. package/gradlew +252 -0
  134. package/gradlew.bat +94 -0
  135. package/ios/Application/Components.swift +34 -43
  136. package/ios/Application/FloatingButton.swift +10 -8
  137. package/ios/Application/Navigation/BottomTab/BottomTab.swift +102 -0
  138. package/ios/Application/Navigation/BottomTab/BottomTabBar.swift +215 -0
  139. package/ios/Application/Navigation/BottomTab/CurvedContainer.swift +65 -0
  140. package/ios/Application/Navigation/HeaderBackProps.swift +66 -0
  141. package/ios/Application/Navigation/HeaderTitle.swift +57 -0
  142. package/ios/Application/Navigation/HeaderUser.swift +209 -0
  143. package/ios/Application/Navigation/NavigationContainer.swift +151 -0
  144. package/ios/Application/Navigation/NavigationOptions.swift +109 -0
  145. package/ios/Application/Navigation/Navigator.swift +360 -0
  146. package/ios/Application/Navigation/Overplay/BottomSheet.swift +176 -0
  147. package/ios/Application/Navigation/Overplay/ModalScreen.swift +68 -0
  148. package/ios/Application/Navigation/Overplay/SnackBar.swift +144 -0
  149. package/ios/Application/Navigation/component/Header.swift +178 -0
  150. package/ios/Application/Navigation/component/HeaderBackground.swift +83 -0
  151. package/ios/Application/Navigation/component/HeaderColor.swift +65 -0
  152. package/ios/Application/StackScreen.swift +449 -0
  153. package/ios/Avatar/Avatar.swift +193 -0
  154. package/ios/Badge/Badge.swift +11 -13
  155. package/ios/Badge/BadgeRibbon.swift +12 -19
  156. package/ios/BaselineView/BaselineView.swift +163 -0
  157. package/ios/Button/Button.swift +62 -23
  158. package/ios/Carousel/Carousel.swift +181 -0
  159. package/ios/Checkbox/Checkbox.swift +14 -12
  160. package/ios/Chip/Chip.swift +23 -9
  161. package/ios/Collapse/Collapse.swift +182 -0
  162. package/ios/Colors+Radius+Spacing/Colors.swift +1 -1
  163. package/ios/Colors+Radius+Spacing/Theme.swift +295 -0
  164. package/ios/DateTimePicker/DateTimePicker.swift +210 -0
  165. package/ios/DateTimePicker/DateTimePickerTypes.swift +55 -0
  166. package/ios/DateTimePicker/DateTimePickerUtils.swift +167 -0
  167. package/ios/DateTimePicker/WheelPicker.swift +161 -0
  168. package/ios/Divider/Divider.swift +16 -0
  169. package/ios/Icon/Icon.swift +6 -1
  170. package/ios/IconButton/IconButton.swift +112 -0
  171. package/ios/Information/Information.swift +151 -0
  172. package/ios/Input/Input.swift +42 -25
  173. package/ios/Input/InputPhoneNumber.swift +21 -19
  174. package/ios/Input/InputSearch.swift +101 -45
  175. package/ios/Input/InputTextArea.swift +67 -40
  176. package/ios/InputDropDown/InputDropDown.swift +198 -0
  177. package/ios/InputMoney/InputMoney.swift +335 -0
  178. package/ios/InputOTP/InputOTP.swift +210 -0
  179. package/ios/Loader/Loader.swift +113 -0
  180. package/ios/MoMoUIKits.podspec +5 -0
  181. package/ios/OTPKeyboard/KeyboardButton.swift +1 -1
  182. package/ios/Pagination/PaginationDot.swift +61 -0
  183. package/ios/Pagination/PaginationNumber.swift +35 -0
  184. package/ios/Pagination/PaginationScroll.swift +101 -0
  185. package/ios/Pagination/PaginationWhiteDot.swift +37 -0
  186. package/ios/Popup/PopupDisplay.swift +10 -12
  187. package/ios/Popup/PopupInput.swift +2 -6
  188. package/ios/Popup/PopupNotify.swift +219 -0
  189. package/ios/ProgressInfo/ProgressInfo.swift +294 -0
  190. package/ios/Radio/Radio.swift +70 -0
  191. package/ios/Rating/Rating.swift +82 -0
  192. package/ios/Skeleton/Skeleton.swift +99 -0
  193. package/ios/Slider/Slider.swift +237 -0
  194. package/ios/Stepper/Stepper.swift +220 -0
  195. package/ios/Steps/Steps.swift +451 -0
  196. package/ios/SuggestAction/SuggestAction.swift +97 -0
  197. package/ios/Swipeable/SwipeCell.swift +185 -0
  198. package/ios/Swipeable/SwipeCellModel.swift +21 -0
  199. package/ios/TabView/TabView.swift +530 -0
  200. package/ios/Tag/Tag.swift +98 -0
  201. package/ios/Template/TrustBanner/TrustBanner.swift +2 -0
  202. package/ios/Title/Title.swift +269 -0
  203. package/ios/Tooltip/Tooltip.swift +482 -0
  204. package/ios/Typography/Text.swift +86 -24
  205. package/ios/Typography/Typography.swift +31 -6
  206. package/ios/Uploader/Uploader.swift +183 -0
  207. package/ios/native-kits.podspec +58 -8
  208. package/ios-demo/MoMoUIKitsDemo.podspec +18 -0
  209. package/ios-demo/README.md +120 -0
  210. package/ios-demo/Resources/dot_loading.json +558 -0
  211. package/ios-demo/Resources/icon.json +4052 -0
  212. package/ios-demo/Resources/lottie_circle_loader.json +1 -0
  213. package/ios-demo/Sources/MoMoUIKitsDemo/DemoScaffold.swift +48 -0
  214. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsBadgeDemoView.swift +25 -0
  215. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsButtonDemoView.swift +26 -0
  216. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsCheckboxDemoView.swift +19 -0
  217. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsChipDemoView.swift +33 -0
  218. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsInputDemoView.swift +48 -0
  219. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsPopupDemoView.swift +21 -0
  220. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsRadioDemoView.swift +17 -0
  221. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsTypographyDemoView.swift +28 -0
  222. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoContext.swift +31 -0
  223. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoFactory.swift +72 -0
  224. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AnimatedHeaderDemo.swift +110 -0
  225. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +93 -0
  226. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +269 -0
  227. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BaselineView.swift +117 -0
  228. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BottomTabDemo.swift +89 -0
  229. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ButtonDemo.swift +100 -0
  230. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +126 -0
  231. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +63 -0
  232. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +20 -0
  233. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +93 -0
  234. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +107 -0
  235. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +124 -0
  236. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +14 -0
  237. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/HeaderUserDemo.swift +49 -0
  238. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +261 -0
  239. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +58 -0
  240. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +78 -0
  241. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +138 -0
  242. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +111 -0
  243. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +136 -0
  244. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +107 -0
  245. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +73 -0
  246. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +100 -0
  247. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +32 -0
  248. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +57 -0
  249. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +70 -0
  250. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +227 -0
  251. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +72 -0
  252. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +175 -0
  253. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +121 -0
  254. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +76 -0
  255. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +89 -0
  256. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +32 -0
  257. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +56 -0
  258. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +32 -0
  259. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +150 -0
  260. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +138 -0
  261. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +103 -0
  262. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +94 -0
  263. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +79 -0
  264. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +152 -0
  265. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +33 -0
  266. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +190 -0
  267. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +34 -0
  268. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +182 -0
  269. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +109 -0
  270. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +187 -0
  271. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +87 -0
  272. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +131 -0
  273. package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +50 -0
  274. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoModels.swift +15 -0
  275. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoRegistry.swift +73 -0
  276. package/local.properties +8 -0
  277. package/package.json +1 -1
  278. package/publish.sh +50 -0
  279. package/scripts/gen-ios-color.mjs +136 -0
  280. package/settings.gradle.kts +64 -0
  281. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +0 -32
  282. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  283. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  284. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +0 -16
  285. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
  286. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -5
  287. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
  288. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
  289. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
  290. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
  291. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
  292. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +0 -58
  293. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +0 -58
  294. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -60
  295. package/ios/Typography/MomoFontScale.swift +0 -36
@@ -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