@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,161 +0,0 @@
1
- package vn.momo.kits.navigation.bottomtab
2
-
3
- import androidx.compose.animation.core.tween
4
- import androidx.compose.animation.fadeIn
5
- import androidx.compose.animation.fadeOut
6
- import androidx.compose.animation.scaleIn
7
- import androidx.compose.animation.scaleOut
8
- import androidx.compose.foundation.background
9
- import androidx.compose.foundation.layout.Box
10
- import androidx.compose.foundation.layout.Column
11
- import androidx.compose.foundation.layout.Spacer
12
- import androidx.compose.foundation.layout.fillMaxSize
13
- import androidx.compose.foundation.layout.fillMaxWidth
14
- import androidx.compose.foundation.layout.height
15
- import androidx.compose.foundation.layout.padding
16
- import androidx.compose.runtime.Composable
17
- import androidx.compose.runtime.LaunchedEffect
18
- import androidx.compose.ui.Alignment
19
- import androidx.compose.ui.Modifier
20
- import androidx.compose.ui.unit.dp
21
- import androidx.navigation.compose.NavHost
22
- import androidx.navigation.compose.composable
23
- import androidx.navigation.compose.rememberNavController
24
- import vn.momo.kits.const.AppNavigationBar
25
- import vn.momo.kits.const.AppTheme
26
- import vn.momo.kits.const.Spacing
27
- import vn.momo.kits.navigation.LocalNavigation
28
- import vn.momo.kits.navigation.LocalNavigator
29
- import vn.momo.kits.navigation.NavigationOptions
30
- import vn.momo.kits.navigation.StackScreen
31
- import vn.momo.kits.navigation.component.HeaderType
32
- import vn.momo.kits.platform.getScreenHeight
33
-
34
- private var bottomTabOptionItems : MutableList<NavigationOptions?> = mutableListOf()
35
- fun setBottomTabOption(index: Int, options: NavigationOptions){
36
- if (index in bottomTabOptionItems.indices) {
37
- bottomTabOptionItems[index] = options
38
- }
39
- }
40
- fun getBottomTabOption(index: Int): NavigationOptions? {
41
- return if (index in bottomTabOptionItems.indices) {
42
- bottomTabOptionItems[index]
43
- } else null
44
- }
45
-
46
- @Composable
47
- fun BottomTab(
48
- items: List<BottomTabItem>,
49
- floatingButton: BottomTabFloatingButton? = null
50
- ) {
51
- val navigation = LocalNavigation.current
52
- val navigator = LocalNavigator.current
53
- val navController = rememberNavController()
54
-
55
- bottomTabOptionItems = items.mapIndexed { index, item ->
56
- item.options ?: NavigationOptions()
57
- }.toMutableList()
58
-
59
-
60
- LaunchedEffect(Unit){
61
- navigation.setOptions(
62
- headerType = HeaderType.None
63
- )
64
- }
65
-
66
- Box(modifier = Modifier.fillMaxWidth().height(getScreenHeight()), contentAlignment = Alignment.BottomCenter) {
67
- Box(modifier = Modifier
68
- .fillMaxSize()
69
- .padding(bottom = BOTTOM_TAB_BAR_HEIGHT.dp + AppNavigationBar.current)
70
- ) {
71
- NavHost(
72
- navController = navController,
73
- startDestination = "option0"
74
- ) {
75
- items.forEachIndexed { index, item ->
76
- composable(
77
- route = "option$index",
78
- enterTransition = {
79
- fadeIn(animationSpec = tween(200)) +
80
- scaleIn(
81
- initialScale = 0.97f,
82
- animationSpec = tween(200)
83
- )
84
- },
85
- exitTransition = {
86
- fadeOut(animationSpec = tween(200)) +
87
- scaleOut(
88
- targetScale = 0.97f,
89
- animationSpec = tween(200)
90
- )
91
- },
92
- popEnterTransition = {
93
- fadeIn(animationSpec = tween(200)) +
94
- scaleIn(
95
- initialScale = 0.97f,
96
- animationSpec = tween(200)
97
- )
98
- },
99
- popExitTransition = {
100
- fadeOut(animationSpec = tween(200)) +
101
- scaleOut(
102
- targetScale = 0.97f,
103
- animationSpec = tween(200)
104
- )
105
- }
106
- ) {
107
- val option = getBottomTabOption(index)
108
-
109
- StackScreen(
110
- content = item.screen,
111
- navigationOptions = option,
112
- bottomTabIndex = index,
113
- onBackHandler = {
114
- if (index != 0) {
115
- navController.popBackStack(
116
- navController.graph.startDestinationRoute!!,
117
- inclusive = false
118
- )
119
- } else {
120
- navigator.pop()
121
- }
122
- }
123
- )
124
- }
125
- }
126
- }
127
- }
128
- Column {
129
- BottomTabBar(
130
- items = items,
131
- floatingButton = floatingButton,
132
- navController = navController,
133
- onTabSelected = {
134
- val currentRoute = navController.currentBackStackEntry?.destination?.route
135
- val targetRoute = "option$it"
136
- if (currentRoute != targetRoute){
137
- navController.navigate(targetRoute)
138
- }
139
- }
140
- )
141
- Spacer(modifier = Modifier.fillMaxWidth().height(AppNavigationBar.current + Spacing.S).background(AppTheme.current.colors.background.surface))
142
- }
143
- }
144
- }
145
-
146
- data class BottomTabItem(
147
- val name: String,
148
- val label: String,
149
- val icon: String,
150
- val showDot: Boolean = false,
151
- val badgeLabel: String? = null,
152
- val screen: @Composable () -> Unit,
153
- val options: NavigationOptions? = null,
154
- val initialParams: Any? = null
155
- )
156
-
157
- data class BottomTabFloatingButton(
158
- val icon: String,
159
- val label: String,
160
- val onPress: () -> Unit,
161
- )
@@ -1,243 +0,0 @@
1
- package vn.momo.kits.navigation.bottomtab
2
-
3
- import androidx.compose.animation.core.FastOutSlowInEasing
4
- import androidx.compose.animation.core.animateDpAsState
5
- import androidx.compose.animation.core.tween
6
- import androidx.compose.foundation.background
7
- import androidx.compose.foundation.border
8
- import androidx.compose.foundation.layout.Arrangement
9
- import androidx.compose.foundation.layout.Box
10
- import androidx.compose.foundation.layout.Column
11
- import androidx.compose.foundation.layout.Row
12
- import androidx.compose.foundation.layout.RowScope
13
- import androidx.compose.foundation.layout.Spacer
14
- import androidx.compose.foundation.layout.fillMaxSize
15
- import androidx.compose.foundation.layout.fillMaxWidth
16
- import androidx.compose.foundation.layout.height
17
- import androidx.compose.foundation.layout.offset
18
- import androidx.compose.foundation.layout.padding
19
- import androidx.compose.foundation.layout.size
20
- import androidx.compose.foundation.layout.width
21
- import androidx.compose.foundation.shape.CircleShape
22
- import androidx.compose.foundation.shape.RoundedCornerShape
23
- import androidx.compose.runtime.Composable
24
- import androidx.compose.runtime.getValue
25
- import androidx.compose.ui.Alignment
26
- import androidx.compose.ui.Modifier
27
- import androidx.compose.ui.draw.clip
28
- import androidx.compose.ui.graphics.Brush
29
- import androidx.compose.ui.graphics.Color
30
- import androidx.compose.ui.text.style.TextAlign
31
- import androidx.compose.ui.text.style.TextOverflow
32
- import androidx.compose.ui.unit.dp
33
- import androidx.navigation.NavController
34
- import androidx.navigation.compose.currentBackStackEntryAsState
35
- import vn.momo.kits.components.Badge
36
- import vn.momo.kits.components.Icon
37
- import vn.momo.kits.components.Text
38
- import vn.momo.kits.const.AppTheme
39
- import vn.momo.kits.const.Colors
40
- import vn.momo.kits.const.Radius
41
- import vn.momo.kits.const.Spacing
42
- import vn.momo.kits.application.IsShowBaseLineDebug
43
- import vn.momo.kits.components.BadgeDot
44
- import vn.momo.kits.components.DotSize
45
- import vn.momo.kits.const.Typography
46
- import vn.momo.kits.modifier.conditional
47
- import vn.momo.kits.modifier.noFeedbackClickable
48
- import vn.momo.kits.platform.getScreenDimensions
49
-
50
- val floatingButtonWidth = 75.dp
51
- const val BOTTOM_TAB_BAR_HEIGHT = 64
52
-
53
- @Composable
54
- fun BottomTabBar(
55
- items: List<BottomTabItem>,
56
- floatingButton: BottomTabFloatingButton? = null,
57
- navController: NavController,
58
- onTabSelected: (Int) -> Unit,
59
- ) {
60
- val currentRoute = navController.currentBackStackEntryAsState().value?.destination?.route
61
- val selectedIndex = items.indexOfFirst { "option${items.indexOf(it)}" == currentRoute }
62
-
63
- val screenWidth = getScreenDimensions().width.dp
64
- val mid = items.size / 2
65
-
66
- val tabWidth = if (floatingButton != null) {
67
- (screenWidth - floatingButtonWidth) / items.size
68
- } else {
69
- screenWidth / items.size
70
- }
71
- val adjustSize = if(floatingButton != null && selectedIndex >= mid) floatingButtonWidth else 0.dp
72
- val targetOffset = tabWidth * selectedIndex + tabWidth / 2 - screenWidth / 2 + adjustSize
73
-
74
- val indicatorOffsetX by animateDpAsState(
75
- targetValue = targetOffset,
76
- animationSpec = tween(durationMillis = 250, easing = FastOutSlowInEasing),
77
- label = "IndicatorX"
78
- )
79
-
80
- Box(
81
- contentAlignment = Alignment.BottomCenter
82
- ) {
83
- Row(
84
- modifier = Modifier
85
- .fillMaxWidth()
86
- .height(BOTTOM_TAB_BAR_HEIGHT.dp)
87
- .background(AppTheme.current.colors.background.surface)
88
- .conditional(IsShowBaseLineDebug) {
89
- border(1.dp, Colors.blue_03)
90
- },
91
- horizontalArrangement = Arrangement.SpaceAround,
92
- ) {
93
- if (floatingButton == null) {
94
- renderTabBarItem(items, 0, items.size, selectedIndex, onTabSelected)
95
- } else {
96
- renderTabBarItem(items, 0, mid, selectedIndex, onTabSelected)
97
- Spacer(modifier = Modifier.width(floatingButtonWidth).padding(horizontal = Spacing.XXS))
98
- renderTabBarItem(items, mid, items.size, selectedIndex, onTabSelected)
99
- }
100
- }
101
-
102
- Box(modifier = Modifier
103
- .offset(x = indicatorOffsetX, y = (-BOTTOM_TAB_BAR_HEIGHT + 2).dp)
104
- .height(2.dp)
105
- .width(44.dp)
106
- .background(
107
- color = AppTheme.current.colors.primary ,
108
- shape = RoundedCornerShape(bottomStart = 2.dp, bottomEnd = 2.dp)
109
- )
110
- )
111
-
112
- Box(modifier = Modifier
113
- .fillMaxWidth()
114
- .height(6.dp)
115
- .offset(x = 0.dp, y = (-BOTTOM_TAB_BAR_HEIGHT).dp)
116
- .background(
117
- brush = Brush.verticalGradient(
118
- colors = listOf(Color.Transparent, Color.Black.copy(alpha = 0.05f))
119
- )
120
- )
121
- )
122
- floatingButton?.let { FloatingButton(it) }
123
- }
124
- }
125
-
126
- @Composable
127
- fun RowScope.renderTabBarItem(
128
- items: List<BottomTabItem>,
129
- fromIndex: Int,
130
- toIndex: Int,
131
- selectedIndex: Int,
132
- onTabSelected: (Int) -> Unit
133
- ){
134
- for (index in fromIndex until toIndex) {
135
- Box(modifier = Modifier.weight(1f)) {
136
- TabBarItem(
137
- item = items[index],
138
- selected = index == selectedIndex,
139
- onClick = { onTabSelected(index) }
140
- )
141
- }
142
- }
143
- }
144
-
145
- @Composable
146
- fun TabBarItem(item: BottomTabItem, selected: Boolean, onClick: () -> Unit) {
147
- fun isNumber(label: String): Boolean {
148
- val numberRegex = "^\\d+$".toRegex()
149
- return numberRegex.matches(label)
150
- }
151
- fun formatLabel(label: String): String? {
152
- if (isNumber(label) && label.toInt() == 0) {
153
- return null
154
- }
155
- return label
156
- }
157
- val badgeLabel = item.badgeLabel?.let { formatLabel(it) }
158
-
159
- Box(modifier = Modifier
160
- .fillMaxSize()
161
- .padding(horizontal = Spacing.XXS)
162
- .conditional(IsShowBaseLineDebug) {
163
- border(1.dp, Colors.blue_03)
164
- }
165
- .noFeedbackClickable {
166
- onClick()
167
- },
168
- contentAlignment = Alignment.BottomStart
169
- ){
170
- Column(
171
- modifier = Modifier
172
- .fillMaxSize()
173
- .padding(horizontal = Spacing.S, vertical = Spacing.S)
174
- .noFeedbackClickable {
175
- onClick()
176
- },
177
- horizontalAlignment = Alignment.CenterHorizontally,
178
- verticalArrangement = Arrangement.Center
179
- ) {
180
- Icon(
181
- source = item.icon,
182
- size = 28.dp,
183
- modifier = Modifier.padding(Spacing.XS),
184
- color = if (selected) AppTheme.current.colors.primary else AppTheme.current.colors.text.hint)
185
- Text(
186
- text = item.label,
187
- color = if (selected) AppTheme.current.colors.primary else AppTheme.current.colors.text.hint,
188
- style = if (selected) Typography.labelXsMedium else Typography.descriptionXsRegular,
189
- maxLines = 1,
190
- overflow = TextOverflow.Ellipsis
191
- )
192
- }
193
- if (badgeLabel != null) {
194
- if (badgeLabel.isEmpty())
195
- BadgeDot(
196
- size = DotSize.Small,
197
- modifier = Modifier.offset(x = 50.dp, y = (-48).dp)
198
- )
199
- else
200
- Badge(badgeLabel, modifier = Modifier.offset(x = 44.dp, y = (-42).dp))
201
- }
202
- }
203
- }
204
-
205
- @Composable
206
- fun FloatingButton(data: BottomTabFloatingButton) {
207
- Column(
208
- modifier = Modifier
209
- .width(floatingButtonWidth)
210
- .padding(horizontal = Spacing.XXS, vertical = Spacing.S)
211
- .conditional(IsShowBaseLineDebug) {
212
- border(1.dp, Colors.blue_03)
213
- }
214
- .noFeedbackClickable {
215
- data.onPress()
216
- },
217
- verticalArrangement = Arrangement.Bottom,
218
- horizontalAlignment = Alignment.CenterHorizontally
219
-
220
- ){
221
- CurvedContainer()
222
- Box(
223
- modifier = Modifier
224
- .size(48.dp)
225
- .clip(CircleShape)
226
- .background(AppTheme.current.colors.primary),
227
- contentAlignment = Alignment.Center
228
- ) {
229
- Icon(source = data.icon, color = Color.White, size = 28.dp)
230
- }
231
- Spacer(modifier = Modifier.height(4.dp))
232
- Text(
233
- text = data.label,
234
- style = Typography.labelXsMedium,
235
- color = Colors.black_01,
236
- textAlign = TextAlign.Center,
237
- modifier = Modifier
238
- .height(14.dp)
239
- .fillMaxWidth()
240
- .background(AppTheme.current.colors.primary, shape = RoundedCornerShape(size = Radius.XL))
241
- )
242
- }
243
- }
@@ -1,86 +0,0 @@
1
- package vn.momo.kits.navigation.bottomtab
2
-
3
- import androidx.compose.foundation.Canvas
4
- import androidx.compose.foundation.layout.Box
5
- import androidx.compose.foundation.layout.height
6
- import androidx.compose.foundation.layout.offset
7
- import androidx.compose.foundation.layout.width
8
- import androidx.compose.runtime.Composable
9
- import androidx.compose.ui.Alignment
10
- import androidx.compose.ui.Modifier
11
- import androidx.compose.ui.graphics.Path
12
- import androidx.compose.ui.platform.LocalDensity
13
- import androidx.compose.ui.unit.Dp
14
- import androidx.compose.ui.unit.IntOffset
15
- import androidx.compose.ui.unit.dp
16
- import androidx.compose.ui.zIndex
17
- import vn.momo.kits.const.AppTheme
18
-
19
- @Composable
20
- fun CurvedContainer(
21
- circleSize: Dp = 48.dp,
22
- tabBarItemIconSize: Dp = 28.dp,
23
- circleOverSize: Dp = 2.dp,
24
- width: Dp = 71.dp,
25
- height: Dp = 16.dp
26
- ) {
27
- val theme = AppTheme.current
28
- val density = LocalDensity.current
29
- val widthPx = with(density) { width.toPx()}
30
-
31
- val circleSizePx = with(density) { circleSize.toPx() }
32
- val tabBarItemIconSizePx = with(density) { tabBarItemIconSize.toPx() }
33
- val circleOverSizePx = with(density) { circleOverSize.toPx() }
34
-
35
- val circlePositionTop = circleSizePx - tabBarItemIconSizePx - 10f
36
- val circleOverTop = circlePositionTop + circleOverSizePx
37
- val circleR = circleSizePx / 2
38
- val circleOverR = circleR + circleOverSizePx
39
-
40
- val centerX = widthPx / 2
41
-
42
- val curvedPath = getPath(
43
- circleOverTop = circleOverTop,
44
- centerX = centerX,
45
- circleOverR = circleOverR,
46
- widthPx = widthPx
47
- )
48
-
49
- Box(
50
- contentAlignment = Alignment.BottomCenter
51
- ){
52
- Canvas(
53
- modifier = Modifier
54
- .width(width)
55
- .height(height)
56
- .offset{ IntOffset(x = 0, y = 24) }
57
- .zIndex(-1f)
58
- ) {
59
- drawPath(path = curvedPath, color = theme.colors.background.surface)
60
- }
61
- }
62
- }
63
-
64
- private fun getPath(circleOverTop: Float, centerX: Float, circleOverR: Float, widthPx: Float): Path{
65
- return Path().apply {
66
- moveTo(0f, circleOverTop)
67
- lineTo(centerX - circleOverR - 40f, circleOverTop)
68
-
69
- cubicTo(
70
- centerX - circleOverR, circleOverTop,
71
- centerX - circleOverR, 0f,
72
- centerX, 0f
73
- )
74
-
75
- cubicTo(
76
- centerX + circleOverR, 0f,
77
- centerX + circleOverR, circleOverTop,
78
- centerX + circleOverR + 40f, circleOverTop
79
- )
80
-
81
- lineTo(widthPx, circleOverTop)
82
- lineTo(widthPx, 60f)
83
- lineTo(0f, 60f)
84
- close()
85
- }
86
- }
@@ -1,187 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import androidx.compose.animation.AnimatedVisibility
4
- import androidx.compose.animation.core.CubicBezierEasing
5
- import androidx.compose.animation.core.LinearEasing
6
- import androidx.compose.animation.core.animateDpAsState
7
- import androidx.compose.animation.core.tween
8
- import androidx.compose.animation.expandHorizontally
9
- import androidx.compose.animation.fadeIn
10
- import androidx.compose.animation.fadeOut
11
- import androidx.compose.animation.shrinkHorizontally
12
- import androidx.compose.foundation.ScrollState
13
- import androidx.compose.foundation.background
14
- import androidx.compose.foundation.border
15
- import androidx.compose.foundation.interaction.MutableInteractionSource
16
- import androidx.compose.foundation.layout.Arrangement
17
- import androidx.compose.foundation.layout.Box
18
- import androidx.compose.foundation.layout.Row
19
- import androidx.compose.foundation.layout.Spacer
20
- import androidx.compose.foundation.layout.fillMaxSize
21
- import androidx.compose.foundation.layout.height
22
- import androidx.compose.foundation.layout.offset
23
- import androidx.compose.foundation.layout.padding
24
- import androidx.compose.foundation.layout.sizeIn
25
- import androidx.compose.foundation.layout.width
26
- import androidx.compose.material3.AlertDialogDefaults
27
- import androidx.compose.material3.FloatingActionButton
28
- import androidx.compose.material3.FloatingActionButtonDefaults
29
- import androidx.compose.material3.FloatingActionButtonElevation
30
- import androidx.compose.runtime.Composable
31
- import androidx.compose.runtime.LaunchedEffect
32
- import androidx.compose.runtime.getValue
33
- import androidx.compose.runtime.mutableStateOf
34
- import androidx.compose.runtime.remember
35
- import androidx.compose.runtime.rememberCoroutineScope
36
- import androidx.compose.runtime.saveable.rememberSaveable
37
- import androidx.compose.runtime.setValue
38
- import androidx.compose.ui.Alignment
39
- import androidx.compose.ui.Modifier
40
- import androidx.compose.ui.graphics.Color
41
- import androidx.compose.ui.unit.Dp
42
- import androidx.compose.ui.unit.dp
43
- import kotlinx.coroutines.delay
44
- import kotlinx.coroutines.flow.MutableStateFlow
45
- import kotlinx.coroutines.flow.collectLatest
46
- import kotlinx.coroutines.launch
47
- import vn.momo.kits.application.IsShowBaseLineDebug
48
- import vn.momo.kits.components.Icon
49
- import vn.momo.kits.components.Text
50
- import vn.momo.kits.const.Colors
51
- import vn.momo.kits.const.Typography
52
- import vn.momo.kits.modifier.conditional
53
-
54
- enum class FABSize { SMALL, DEFAULT }
55
- enum class FABPosition { END, CENTER }
56
-
57
- data class FloatingButtonProps(
58
- val icon: String,
59
- val iconColor: Color? = null,
60
- val label: String? = null,
61
- val onClick: () -> Unit,
62
- val size: FABSize = FABSize.DEFAULT,
63
- val bottom: Dp? = null,
64
- val scrollState: ScrollState? = null,
65
- val position: FABPosition? = FABPosition.END,
66
- )
67
-
68
- private val FabSmallSize = 36.dp
69
- private val FabDefaultSize = 48.dp
70
- private val FabExpandedWidth = 80.dp
71
- private val FabIconSizeSmall = 12.dp
72
- private val FabIconSizeDefault = 24.dp
73
- private val FabPaddingHorizontal = 12.dp
74
-
75
- @Composable
76
- fun FloatingButton(
77
- scrollPosition: Int,
78
- bottom: Dp,
79
- onClick: () -> Unit,
80
- containerColor: Color,
81
- contentColor: Color = containerColor,
82
- icon: String,
83
- iconColor: Color? = null,
84
- text: String? = null,
85
- elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(4.dp),
86
- size: FABSize = FABSize.DEFAULT,
87
- position: FABPosition = FABPosition.END,
88
- keyboardSize: Dp = 0.dp,
89
- ) {
90
- val scrollStateFlow = remember { MutableStateFlow(scrollPosition) }
91
- var lastScrollPosition by rememberSaveable { mutableStateOf(0) }
92
- var isExpanded by rememberSaveable { mutableStateOf(false) }
93
-
94
- val coroutineScope = rememberCoroutineScope()
95
-
96
- // Animations
97
- val baseSize = if (size == FABSize.SMALL) FabSmallSize else FabDefaultSize
98
- val width by animateDpAsState(
99
- targetValue = if (isExpanded && text != null) FabExpandedWidth else baseSize,
100
- animationSpec = tween(100, easing = CubicBezierEasing(0.2f, 0.2f, 0.2f, 0.2f))
101
- )
102
-
103
- // Scroll listener
104
- LaunchedEffect(text) {
105
- if (text != null) {
106
- coroutineScope.launch {
107
- scrollStateFlow.collectLatest { newScroll ->
108
- isExpanded = newScroll <= lastScrollPosition
109
- delay(100)
110
- lastScrollPosition = newScroll
111
- }
112
- }
113
- }
114
- }
115
-
116
- LaunchedEffect(scrollPosition) {
117
- scrollStateFlow.value = scrollPosition
118
- }
119
-
120
- Box(
121
- modifier = Modifier
122
- .fillMaxSize()
123
- .padding(end = 12.dp, bottom = bottom)
124
- .offset(y = -keyboardSize)
125
- .background(Color.Transparent),
126
- contentAlignment = if (position == FABPosition.END) Alignment.BottomEnd else Alignment.BottomCenter,
127
- ) {
128
- FloatingActionButton(
129
- onClick = onClick,
130
- shape = AlertDialogDefaults.shape,
131
- containerColor = containerColor,
132
- contentColor = contentColor,
133
- elevation = elevation,
134
- interactionSource = remember { MutableInteractionSource() },
135
- modifier = Modifier
136
- .sizeIn(minWidth = width)
137
- .height(baseSize)
138
- .conditional(IsShowBaseLineDebug) {
139
- border(1.dp, Colors.blue_03)
140
- }
141
- ) {
142
- Row(
143
- modifier = Modifier.padding(
144
- start = if (isExpanded) FabPaddingHorizontal else 0.dp,
145
- end = if (isExpanded) FabPaddingHorizontal else 0.dp,
146
- ),
147
- verticalAlignment = Alignment.CenterVertically,
148
- horizontalArrangement = if (isExpanded) Arrangement.Start else Arrangement.Center
149
- ) {
150
- Icon(
151
- source = icon,
152
- size = if (size == FABSize.SMALL) FabIconSizeSmall else FabIconSizeDefault,
153
- color = iconColor ?: Color.White
154
- )
155
-
156
- AnimatedVisibility(
157
- visible = isExpanded,
158
- enter = fadeInExpandAnimation,
159
- exit = fadeOutShrinkAnimation,
160
- ) {
161
- Row {
162
- Spacer(Modifier.width(12.dp))
163
- Text(
164
- text = text ?: "",
165
- color = Color.White,
166
- style = Typography.actionDefaultBold
167
- )
168
- }
169
- }
170
- }
171
- }
172
- }
173
- }
174
-
175
- private val fadeOutShrinkAnimation = fadeOut(
176
- animationSpec = tween(100, easing = LinearEasing)
177
- ) + shrinkHorizontally(
178
- animationSpec = tween(100, easing = LinearEasing),
179
- shrinkTowards = Alignment.Start
180
- )
181
-
182
- private val fadeInExpandAnimation = fadeIn(
183
- animationSpec = tween(100, easing = LinearEasing)
184
- ) + expandHorizontally(
185
- animationSpec = tween(100, easing = LinearEasing),
186
- expandFrom = Alignment.Start
187
- )