@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
@@ -1,198 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import androidx.compose.foundation.Canvas
4
- import androidx.compose.foundation.background
5
- import androidx.compose.foundation.border
6
- import androidx.compose.foundation.layout.Box
7
- import androidx.compose.foundation.layout.WindowInsets
8
- import androidx.compose.foundation.layout.asPaddingValues
9
- import androidx.compose.foundation.layout.fillMaxHeight
10
- import androidx.compose.foundation.layout.fillMaxSize
11
- import androidx.compose.foundation.layout.fillMaxWidth
12
- import androidx.compose.foundation.layout.height
13
- import androidx.compose.foundation.layout.navigationBars
14
- import androidx.compose.foundation.layout.padding
15
- import androidx.compose.foundation.layout.width
16
- import androidx.compose.runtime.Composable
17
- import androidx.compose.ui.Alignment
18
- import androidx.compose.ui.Modifier
19
- import androidx.compose.ui.geometry.Offset
20
- import androidx.compose.ui.graphics.Color
21
- import androidx.compose.ui.graphics.PathEffect
22
- import androidx.compose.ui.graphics.StrokeCap
23
- import androidx.compose.ui.unit.dp
24
- import io.ktor.util.Platform
25
- import vn.momo.kits.application.IsShowBaseLineDebug
26
- import vn.momo.kits.const.Colors
27
- import vn.momo.kits.modifier.conditional
28
- import vn.momo.kits.platform.getPlatformName
29
- import vn.momo.kits.platform.getStatusBarHeight
30
-
31
- /**
32
- * A debug overlay that draws danger/warning baseline guides on top of the screen.
33
- *
34
- * Highlights safe-area boundaries, header regions, and bottom navigation zones
35
- * using colored solid or dotted lines and semi-transparent red zones.
36
- *
37
- * @param enabled When `false` the composable renders nothing. Pass `false` when
38
- * your QC automation flag is active to suppress the overlay.
39
- */
40
- @Composable
41
- fun BaselineView(enabled: Boolean = true) {
42
- if (!enabled) return
43
-
44
- val bottomInsetHeight = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()
45
- val topInset = if (getPlatformName() == "Android") getStatusBarHeight() - 14.dp else getStatusBarHeight()
46
- val bottomInset = if (getPlatformName() == "iOS") minOf(bottomInsetHeight, 21.dp) else bottomInsetHeight
47
-
48
- Box(modifier = Modifier.fillMaxSize()) {
49
- // Danger zones
50
- Box(
51
- modifier = Modifier
52
- .fillMaxWidth()
53
- .height(topInset)
54
- .background(Color.Red.copy(alpha = 0.15f))
55
- )
56
- Box(
57
- modifier = Modifier
58
- .width(12.dp)
59
- .fillMaxHeight()
60
- .padding(top = topInset, bottom = bottomInset)
61
- .background(Color.Red.copy(alpha = 0.15f))
62
- )
63
- Box(
64
- modifier = Modifier
65
- .width(12.dp)
66
- .fillMaxHeight()
67
- .padding(top = topInset, bottom = bottomInset)
68
- .background(Color.Red.copy(alpha = 0.15f))
69
- .align(Alignment.TopEnd)
70
- )
71
- Box(
72
- modifier = Modifier
73
- .fillMaxWidth()
74
- .height(bottomInset)
75
- .background(Color.Red.copy(alpha = 0.15f))
76
- .align(Alignment.BottomCenter)
77
- )
78
-
79
- // Danger lines
80
- BaselineDottedLine(
81
- Modifier
82
- .padding(top = topInset)
83
- .fillMaxWidth(),
84
- isDotted = false,
85
- color = Color(0xFFE400FF)
86
- )
87
- BaselineDottedLine(
88
- Modifier
89
- .padding(top = topInset + 52.dp)
90
- .fillMaxWidth(),
91
- color = Color(0xFFE400FF)
92
- )
93
- BaselineDottedLine(
94
- Modifier
95
- .padding(top = topInset + 104.dp)
96
- .fillMaxWidth(),
97
- color = Color(0xFFE400FF)
98
- )
99
- BaselineDottedLine(
100
- Modifier
101
- .padding(bottom = bottomInset + 64.dp)
102
- .fillMaxWidth()
103
- .align(Alignment.BottomCenter),
104
- color = Color(0xFFE400FF)
105
- )
106
- BaselineDottedLine(
107
- Modifier
108
- .padding(bottom = bottomInset)
109
- .fillMaxWidth()
110
- .align(Alignment.BottomCenter),
111
- isDotted = false,
112
- color = Color(0xFFE400FF)
113
- )
114
- BaselineDottedLine(
115
- Modifier
116
- .padding(start = 12.dp)
117
- .fillMaxHeight(),
118
- orientation = BaselineOrientation.Vertical,
119
- isDotted = false,
120
- color = Color(0xFFE400FF)
121
- )
122
- BaselineDottedLine(
123
- Modifier
124
- .padding(end = 12.dp)
125
- .fillMaxHeight()
126
- .align(Alignment.BottomEnd),
127
- orientation = BaselineOrientation.Vertical,
128
- isDotted = false,
129
- color = Color(0xFFE400FF)
130
- )
131
-
132
- // Warning lines
133
- BaselineDottedLine(
134
- Modifier
135
- .padding(top = topInset + 26.dp)
136
- .fillMaxWidth(),
137
- color = Color(0xFFFF7A00)
138
- )
139
- BaselineDottedLine(
140
- Modifier
141
- .padding(bottom = bottomInset + 56.dp)
142
- .fillMaxWidth()
143
- .align(Alignment.BottomCenter),
144
- color = Color(0xFFFFCC00)
145
- )
146
- BaselineDottedLine(
147
- Modifier
148
- .padding(bottom = bottomInset + 8.dp)
149
- .fillMaxWidth()
150
- .align(Alignment.BottomCenter),
151
- color = Color(0xFFFFCC00)
152
- )
153
-
154
- // Header background warning lines
155
- BaselineDottedLine(
156
- Modifier
157
- .padding(start = 40.dp, top = topInset)
158
- .height(52.dp),
159
- color = Color(0xFF00C520),
160
- orientation = BaselineOrientation.Vertical
161
- )
162
- BaselineDottedLine(
163
- Modifier
164
- .padding(start = 48.dp, top = topInset)
165
- .height(52.dp),
166
- color = Color(0xFF00C520),
167
- orientation = BaselineOrientation.Vertical
168
- )
169
- }
170
- }
171
-
172
- enum class BaselineOrientation { Horizontal, Vertical }
173
-
174
- @Composable
175
- fun BaselineDottedLine(
176
- modifier: Modifier = Modifier,
177
- color: Color = Color.Red,
178
- orientation: BaselineOrientation = BaselineOrientation.Horizontal,
179
- isDotted: Boolean = true
180
- ) {
181
- Canvas(modifier = modifier) {
182
- val pathEffect = if (isDotted) PathEffect.dashPathEffect(floatArrayOf(8f, 8f)) else null
183
- drawLine(
184
- color = color,
185
- start = if (orientation == BaselineOrientation.Horizontal) Offset(
186
- 0f,
187
- size.height / 2
188
- ) else Offset(size.width / 2, 0f),
189
- end = if (orientation == BaselineOrientation.Horizontal) Offset(
190
- size.width,
191
- size.height / 2
192
- ) else Offset(size.width / 2, size.height),
193
- strokeWidth = 1.dp.toPx(),
194
- pathEffect = pathEffect,
195
- cap = StrokeCap.Round,
196
- )
197
- }
198
- }
@@ -1,357 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import androidx.compose.animation.core.animateDpAsState
4
- import androidx.compose.animation.core.animateFloatAsState
5
- import androidx.compose.animation.core.tween
6
- import androidx.compose.foundation.background
7
- import androidx.compose.foundation.border
8
- import androidx.compose.foundation.clickable
9
- import androidx.compose.foundation.interaction.MutableInteractionSource
10
- import androidx.compose.foundation.interaction.collectIsPressedAsState
11
- import androidx.compose.foundation.layout.Arrangement
12
- import androidx.compose.foundation.layout.Box
13
- import androidx.compose.foundation.layout.Row
14
- import androidx.compose.foundation.layout.fillMaxWidth
15
- import androidx.compose.foundation.layout.height
16
- import androidx.compose.foundation.layout.padding
17
- import androidx.compose.foundation.layout.size
18
- import androidx.compose.foundation.layout.wrapContentHeight
19
- import androidx.compose.foundation.shape.RoundedCornerShape
20
- import androidx.compose.runtime.Composable
21
- import androidx.compose.runtime.getValue
22
- import androidx.compose.runtime.remember
23
- import androidx.compose.ui.Alignment
24
- import androidx.compose.ui.Modifier
25
- import androidx.compose.ui.draw.alpha
26
- import androidx.compose.ui.draw.clip
27
- import androidx.compose.ui.graphics.Color
28
- import androidx.compose.ui.text.TextStyle
29
- import androidx.compose.ui.text.style.TextOverflow
30
- import androidx.compose.ui.unit.Dp
31
- import androidx.compose.ui.unit.dp
32
- import vn.momo.kits.application.IsShowBaseLineDebug
33
- import vn.momo.kits.const.AppTheme
34
- import vn.momo.kits.const.Colors
35
- import vn.momo.kits.const.Radius
36
- import vn.momo.kits.const.Spacing
37
- import vn.momo.kits.const.Typography
38
- import vn.momo.kits.modifier.conditional
39
- import vn.momo.kits.platform.LottieAnimation
40
-
41
- enum class ButtonType {
42
- PRIMARY,
43
- SECONDARY,
44
- TONAL,
45
- OUTLINE,
46
- DANGER,
47
- TEXT,
48
- DISABLED
49
- }
50
-
51
- data class ButtonSpecs(
52
- val height: Dp,
53
- val radius: Dp,
54
- val padding: Dp,
55
- val width: Dp,
56
- )
57
-
58
- enum class Size(val value: ButtonSpecs) {
59
- LARGE(
60
- ButtonSpecs(
61
- height = 48.dp,
62
- radius = Radius.S,
63
- padding = Spacing.L,
64
- width = 128.dp
65
- )
66
- ),
67
- MEDIUM(
68
- ButtonSpecs(
69
- height = 36.dp,
70
- radius = Radius.S,
71
- padding = Spacing.M,
72
- width = 80.dp
73
- )
74
- ),
75
- SMALL(
76
- ButtonSpecs(
77
- height = 28.dp,
78
- radius = Radius.S,
79
- padding = Spacing.S,
80
- width = 60.dp
81
- )
82
- )
83
- }
84
-
85
- private val styleCache = mapOf(
86
- Size.LARGE to Typography.actionDefaultBold,
87
- Size.MEDIUM to Typography.actionSBold,
88
- Size.SMALL to Typography.actionXsBold
89
- )
90
-
91
- private val iconSizeCache = mapOf(
92
- Size.LARGE to 24.dp,
93
- Size.MEDIUM to 16.dp,
94
- Size.SMALL to 16.dp
95
- )
96
-
97
- private val iconSpaceCache = mapOf(
98
- Size.SMALL to Spacing.XS,
99
- Size.MEDIUM to Spacing.S,
100
- Size.LARGE to Spacing.S
101
- )
102
-
103
- fun getStyle(size: Size): TextStyle {
104
- return styleCache[size] ?: Typography.actionDefaultBold
105
- }
106
-
107
- fun getIconSize(size: Size): Dp = iconSizeCache[size] ?: 24.dp
108
- fun getIconSpace(size: Size): Dp = iconSpaceCache[size] ?: Spacing.S
109
-
110
- @Composable
111
- fun getTextColor(loading: Boolean, type: ButtonType): Color {
112
- val theme = AppTheme.current
113
-
114
- return remember(type, theme, loading) {
115
- when (type) {
116
- ButtonType.DISABLED -> theme.colors.text.disable
117
- ButtonType.PRIMARY -> Colors.black_01
118
- ButtonType.SECONDARY -> theme.colors.text.default
119
- ButtonType.OUTLINE -> theme.colors.primary
120
- ButtonType.TONAL -> theme.colors.primary
121
- ButtonType.DANGER -> Colors.black_01
122
- ButtonType.TEXT -> theme.colors.primary
123
- }.withLoading(loading)
124
- }
125
- }
126
-
127
- @Composable
128
- fun RenderTitle(size: Size, title: String = "", textColor: Color) {
129
- val style = remember(size) { getStyle(size) }
130
- Text(
131
- style = style,
132
- text = title,
133
- color = textColor,
134
- overflow = TextOverflow.Ellipsis,
135
- maxLines = 1
136
- )
137
- }
138
-
139
- @Composable
140
- fun RenderIcon(
141
- size: Size,
142
- isIconLeft: Boolean,
143
- useTintColor: Boolean = true,
144
- icon: String = "",
145
- forceLoading: Boolean = false,
146
- bgColor: Color? = null,
147
- textColor: Color? = null,
148
- ) {
149
- val iconSize = remember(size) { getIconSize(size) }
150
- val margin = remember(size) { getIconSpace(size) }
151
- val color = if (useTintColor) textColor else Color.Unspecified
152
-
153
- val modifier = Modifier.padding(
154
- start = if (isIconLeft) 0.dp else margin,
155
- end = if (isIconLeft) margin else 0.dp
156
- )
157
-
158
- if (forceLoading) {
159
- Box(modifier) {
160
- LottieAnimation(
161
- modifier = Modifier.size(iconSize),
162
- bgColor = bgColor,
163
- tintColor = color,
164
- path = "files/lottie_circle_loader"
165
- )
166
- }
167
- } else if (icon.isNotEmpty()) {
168
- Icon(
169
- source = icon,
170
- color = color,
171
- size = iconSize,
172
- modifier = modifier
173
- )
174
- }
175
- }
176
-
177
- private fun shouldLoadingOnLeft(iconLeft: String, iconRight: String): Boolean {
178
- val hasLeft = iconLeft.isNotEmpty()
179
- val hasRight = iconRight.isNotEmpty()
180
- return when {
181
- !hasLeft && !hasRight -> true
182
- hasLeft && !hasRight -> true
183
- !hasLeft && hasRight -> false
184
- hasLeft && hasRight -> false
185
- else -> true
186
- }
187
- }
188
-
189
- @Composable
190
- fun getTypeStyle(
191
- type: ButtonType,
192
- color: Color? = AppTheme.current.colors.primary,
193
- size: Size,
194
- bgColor: Color,
195
- ): Modifier {
196
- val theme = AppTheme.current
197
- val radius = remember(size) { size.value.radius }
198
- val modifier = Modifier.background(bgColor)
199
-
200
- return remember(type, color, theme, radius, bgColor) {
201
- when (type) {
202
- ButtonType.DISABLED -> modifier
203
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
204
-
205
- ButtonType.PRIMARY -> modifier
206
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
207
-
208
- ButtonType.SECONDARY -> modifier
209
- .border(1.dp, theme.colors.border.default, RoundedCornerShape(radius))
210
-
211
- ButtonType.OUTLINE -> modifier
212
- .border(1.dp, color ?: theme.colors.primary, RoundedCornerShape(radius))
213
-
214
- ButtonType.TONAL -> modifier
215
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
216
-
217
- ButtonType.DANGER -> modifier
218
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
219
-
220
- ButtonType.TEXT -> modifier
221
- }
222
- }
223
- }
224
-
225
- @Composable
226
- fun getButtonBackgroundColor(
227
- loading: Boolean,
228
- type: ButtonType
229
- ): Color {
230
- val theme = AppTheme.current
231
-
232
- return remember(loading, type, theme) {
233
- when (type) {
234
- ButtonType.DISABLED -> theme.colors.background.disable.withLoading(loading)
235
- ButtonType.PRIMARY -> theme.colors.primary.withLoading(loading)
236
- ButtonType.SECONDARY -> theme.colors.background.surface.withLoading(loading)
237
- ButtonType.OUTLINE -> theme.colors.background.surface.withLoading(loading)
238
- ButtonType.TONAL -> theme.colors.background.tonal.withLoading(loading)
239
- ButtonType.DANGER -> theme.colors.error.primary.withLoading(loading)
240
- ButtonType.TEXT -> Color.Unspecified
241
- }
242
- }
243
- }
244
-
245
- fun Color.withLoading(loading: Boolean): Color =
246
- this.copy(alpha = if (loading) 0.75f else 1f)
247
-
248
- @Composable
249
- fun Button(
250
- onClick: () -> Unit,
251
- type: ButtonType = ButtonType.PRIMARY,
252
- size: Size = Size.LARGE,
253
- iconRight: String = "",
254
- iconLeft: String = "",
255
- title: String = "Button",
256
- loading: Boolean = false,
257
- useTintColor: Boolean = true,
258
- isFull: Boolean = true,
259
- modifier: Modifier = Modifier,
260
- ) {
261
- val radius = remember(size) { size.value.radius }
262
- val isEnabled = remember(type) { type != ButtonType.DISABLED }
263
- val loadingOnLeft = remember(iconLeft, iconRight) {
264
- shouldLoadingOnLeft(iconLeft, iconRight)
265
- }
266
-
267
- val sizeSpecs = remember(size) { size.value }
268
-
269
- val interactionSource = remember { MutableInteractionSource() }
270
- val isPressed by interactionSource.collectIsPressedAsState()
271
-
272
- val animatedPadding by animateDpAsState(
273
- targetValue = if (isPressed && isEnabled && !loading) 2.dp else 0.dp,
274
- animationSpec = tween(100),
275
- label = "pressPadding"
276
- )
277
-
278
- val targetAlpha = if (isPressed && isEnabled && !loading) 0.5f else 1f
279
- val alpha by animateFloatAsState(
280
- targetValue = targetAlpha,
281
- animationSpec = tween(100),
282
- label = "buttonPressAlpha"
283
- )
284
-
285
- val clickableModifier =
286
- if (isEnabled && !loading) {
287
- modifier
288
- .clip(RoundedCornerShape(radius))
289
- .clickable(
290
- enabled = isEnabled && !loading,
291
- interactionSource = interactionSource,
292
- indication = null,
293
- onClick = onClick
294
- )
295
- .alpha(alpha)
296
- } else {
297
- modifier
298
- .clip(RoundedCornerShape(radius))
299
- }
300
-
301
- val bgColor = getButtonBackgroundColor(loading, type)
302
- val textColor = getTextColor(loading, type)
303
-
304
- val rootModifier = if (isFull) {
305
- Modifier
306
- .fillMaxWidth()
307
- .wrapContentHeight()
308
- } else {
309
- Modifier
310
- }
311
-
312
- Box(
313
- modifier = rootModifier.then(clickableModifier),
314
- contentAlignment = Alignment.Center
315
- ) {
316
- // Visual background (shrinks on press)
317
- Box(
318
- modifier = Modifier
319
- .matchParentSize()
320
- .padding(horizontal = animatedPadding)
321
- .clip(RoundedCornerShape(radius))
322
- .then(getTypeStyle(type, size = size, bgColor = bgColor))
323
- .conditional(IsShowBaseLineDebug) {
324
- border(1.dp, Colors.blue_03)
325
- }
326
- )
327
-
328
- // Content
329
- Row(
330
- modifier = Modifier
331
- .padding(horizontal = sizeSpecs.padding)
332
- .height(sizeSpecs.height),
333
- horizontalArrangement = Arrangement.Center,
334
- verticalAlignment = Alignment.CenterVertically,
335
- ) {
336
- RenderIcon(
337
- size = size,
338
- isIconLeft = true,
339
- useTintColor = useTintColor,
340
- icon = iconLeft,
341
- forceLoading = loading && loadingOnLeft,
342
- bgColor = bgColor,
343
- textColor = textColor
344
- )
345
- RenderTitle(size, title, textColor = textColor)
346
- RenderIcon(
347
- size = size,
348
- isIconLeft = false,
349
- useTintColor = useTintColor,
350
- icon = iconRight,
351
- forceLoading = loading && !loadingOnLeft,
352
- bgColor = bgColor,
353
- textColor = textColor
354
- )
355
- }
356
- }
357
- }
@@ -1,123 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import androidx.compose.animation.core.animateFloatAsState
4
- import androidx.compose.animation.core.tween
5
- import androidx.compose.foundation.border
6
- import androidx.compose.foundation.layout.Box
7
- import androidx.compose.foundation.layout.PaddingValues
8
- import androidx.compose.foundation.layout.fillMaxWidth
9
- import androidx.compose.foundation.pager.HorizontalPager
10
- import androidx.compose.foundation.pager.rememberPagerState
11
- import androidx.compose.runtime.Composable
12
- import androidx.compose.runtime.LaunchedEffect
13
- import androidx.compose.runtime.getValue
14
- import androidx.compose.runtime.mutableStateOf
15
- import androidx.compose.runtime.remember
16
- import androidx.compose.runtime.setValue
17
- import androidx.compose.runtime.snapshotFlow
18
- import androidx.compose.ui.Modifier
19
- import androidx.compose.ui.graphics.graphicsLayer
20
- import androidx.compose.ui.unit.dp
21
- import kotlinx.coroutines.delay
22
- import kotlinx.coroutines.isActive
23
- import vn.momo.kits.application.IsShowBaseLineDebug
24
- import vn.momo.kits.const.Colors
25
- import vn.momo.kits.modifier.conditional
26
- import kotlin.math.absoluteValue
27
-
28
- @Composable
29
- fun Carousel(
30
- itemCount: Int,
31
- modifier: Modifier = Modifier,
32
- loop: Boolean = false,
33
- autoplay: Boolean = false,
34
- autoplayInterval: Long = 3000L,
35
- enableSnap: Boolean = true,
36
- scrollEnabled: Boolean = true,
37
- inactiveSlideOpacity: Float = 1f,
38
- inactiveSlideScale: Float = 1f,
39
- contentPadding: PaddingValues = PaddingValues(0.dp),
40
- onSnapToItem: (Int) -> Unit = {},
41
- onScrollIndexChanged: (Int) -> Unit = {},
42
- content: @Composable (index: Int) -> Unit,
43
- ) {
44
- if (itemCount <= 0) return
45
-
46
- val virtualPageCount = if (loop) itemCount * 1000 else itemCount
47
- val startPage = if (loop) (virtualPageCount / 2) - ((virtualPageCount / 2) % itemCount) else 0
48
-
49
- val pagerState = rememberPagerState(initialPage = startPage) { virtualPageCount }
50
-
51
- // Map virtual page to real index
52
- val realIndex: (Int) -> Int = { page -> page % itemCount }
53
-
54
- // Track user interaction for autoplay pause
55
- var isUserScrolling by remember { mutableStateOf(false) }
56
-
57
- // Autoplay
58
- if (autoplay && itemCount > 1) {
59
- LaunchedEffect(autoplayInterval, isUserScrolling) {
60
- if (isUserScrolling) return@LaunchedEffect
61
- while (isActive) {
62
- delay(autoplayInterval)
63
- if (!isUserScrolling) {
64
- val nextPage = pagerState.currentPage + 1
65
- if (nextPage < virtualPageCount) {
66
- pagerState.animateScrollToPage(nextPage)
67
- }
68
- }
69
- }
70
- }
71
- }
72
-
73
- // Track scroll state for callbacks
74
- LaunchedEffect(pagerState) {
75
- snapshotFlow { pagerState.isScrollInProgress }.collect { scrolling ->
76
- isUserScrolling = scrolling
77
- }
78
- }
79
-
80
- LaunchedEffect(pagerState) {
81
- snapshotFlow { pagerState.currentPage }.collect { page ->
82
- val real = realIndex(page)
83
- onSnapToItem(real)
84
- onScrollIndexChanged(real)
85
- }
86
- }
87
-
88
- HorizontalPager(
89
- state = pagerState,
90
- modifier = modifier
91
- .fillMaxWidth()
92
- .conditional(IsShowBaseLineDebug) { border(1.dp, Colors.blue_03) },
93
- contentPadding = contentPadding,
94
- userScrollEnabled = scrollEnabled,
95
- beyondViewportPageCount = if (loop) 1 else 0,
96
- ) { page ->
97
- val real = realIndex(page)
98
-
99
- val pageOffset = ((pagerState.currentPage - page) + pagerState.currentPageOffsetFraction).absoluteValue
100
-
101
- val scale by animateFloatAsState(
102
- targetValue = if (pageOffset < 0.5f) 1f else inactiveSlideScale,
103
- animationSpec = tween(150),
104
- label = "carouselScale"
105
- )
106
- val alpha by animateFloatAsState(
107
- targetValue = if (pageOffset < 0.5f) 1f else inactiveSlideOpacity,
108
- animationSpec = tween(150),
109
- label = "carouselAlpha"
110
- )
111
-
112
- Box(
113
- modifier = Modifier
114
- .graphicsLayer {
115
- scaleX = scale
116
- scaleY = scale
117
- this.alpha = alpha
118
- }
119
- ) {
120
- content(real)
121
- }
122
- }
123
- }