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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/CLAUDE.md +36 -8
  2. package/README.md +2 -2
  3. package/ios/Application/ApplicationEnvironment.swift +17 -0
  4. package/ios/Application/MaxApi.swift +12 -3
  5. package/ios/Avatar/Avatar.swift +4 -3
  6. package/ios/Badge/Badge.swift +6 -4
  7. package/ios/Badge/BadgeDot.swift +1 -1
  8. package/ios/Badge/BadgeRibbon.swift +0 -1
  9. package/ios/Button/Button.swift +15 -12
  10. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +64 -18
  11. package/ios/Carousel/Carousel.swift +29 -12
  12. package/ios/Checkbox/Checkbox.swift +7 -3
  13. package/ios/Chip/Chip.swift +5 -4
  14. package/ios/Collapse/Collapse.swift +70 -19
  15. package/ios/Colors+Radius+Spacing/Colors.swift +10 -1
  16. package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
  17. package/ios/DateTimePicker/DateTimePicker.swift +54 -20
  18. package/ios/DateTimePicker/WheelPicker.swift +103 -105
  19. package/ios/Divider/Divider.swift +37 -4
  20. package/ios/Extensions/Color++.swift +38 -9
  21. package/ios/Extensions/OptionalEnvironmentObject.swift +12 -0
  22. package/ios/Extensions/SkeletonUICompat.swift +11 -0
  23. package/ios/Icon/Icon.swift +21 -23
  24. package/ios/Icon/Icons.swift +1329 -0
  25. package/ios/IconButton/IconButton.swift +15 -7
  26. package/ios/Image/Image.swift +7 -23
  27. package/ios/Information/Information.swift +27 -9
  28. package/ios/Input/ErrorView.swift +2 -2
  29. package/ios/Input/Input.swift +160 -147
  30. package/ios/Input/InputPhoneNumber.swift +12 -9
  31. package/ios/Input/InputSearch.swift +102 -75
  32. package/ios/Input/InputTextArea.swift +128 -145
  33. package/ios/InputDropDown/InputDropDown.swift +10 -7
  34. package/ios/InputMoney/InputMoney.swift +33 -11
  35. package/ios/InputOTP/InputOTP.swift +22 -12
  36. package/ios/Layout/Card.swift +50 -0
  37. package/ios/Layout/GridContext.swift +187 -3
  38. package/ios/Layout/Item.swift +5 -4
  39. package/ios/Layout/ScreenLayout.swift +380 -0
  40. package/ios/Layout/Section.swift +4 -100
  41. package/ios/Loader/Loader.swift +5 -9
  42. package/ios/Lottie/LottieView.swift +14 -2
  43. package/ios/{Application/Navigation/Overplay → Navigation}/BottomSheet.swift +128 -9
  44. package/ios/Navigation/BottomTab/BottomTab.swift +185 -0
  45. package/ios/{Application/Navigation → Navigation}/BottomTab/BottomTabBar.swift +15 -7
  46. package/ios/Navigation/BottomTab/DuoBarCompression.swift +105 -0
  47. package/ios/Navigation/BottomTab/DuoTabBar.swift +304 -0
  48. package/ios/{Application → Navigation/Component}/FloatingButton.swift +14 -3
  49. package/ios/Navigation/Component/Header.swift +531 -0
  50. package/ios/Navigation/Component/HeaderBackground.swift +133 -0
  51. package/ios/Navigation/Component/HeaderJourney.swift +73 -0
  52. package/ios/Navigation/Component/HeaderLocation.swift +48 -0
  53. package/ios/Navigation/Component/HeaderRight.swift +377 -0
  54. package/ios/Navigation/Component/HeaderTitle.swift +36 -0
  55. package/ios/{Application/Navigation → Navigation/Component}/HeaderUser.swift +21 -24
  56. package/ios/Navigation/Component/SideBar.swift +183 -0
  57. package/ios/{Application/Navigation/Overplay → Navigation/Component}/SnackBar.swift +5 -6
  58. package/ios/Navigation/HostBackGestureBridge.swift +78 -0
  59. package/ios/{Application/Navigation/Overplay → Navigation}/ModalScreen.swift +5 -2
  60. package/ios/Navigation/Navigation.swift +204 -0
  61. package/ios/Navigation/NavigationContainer.swift +194 -0
  62. package/ios/{Application/Navigation → Navigation}/Navigator.swift +177 -91
  63. package/ios/Navigation/StackScreen.swift +820 -0
  64. package/ios/Navigation/StackTransition.swift +400 -0
  65. package/ios/Navigation/SwipeBackHaptic.swift +33 -0
  66. package/ios/{Application/Navigation → Navigation}/Tracking/ScreenTracker.swift +12 -5
  67. package/ios/OTPKeyboard/OTPKeyboard.swift +8 -11
  68. package/ios/Pagination/PaginationScroll.swift +2 -2
  69. package/ios/Popup/PopupDisplay.swift +72 -136
  70. package/ios/Popup/PopupInput.swift +10 -13
  71. package/ios/Popup/PopupLayout.swift +140 -0
  72. package/ios/Popup/PopupNotify.swift +56 -73
  73. package/ios/Popup/PopupPromotion.swift +31 -47
  74. package/ios/PopupView/FullscreenPopup.swift +13 -19
  75. package/ios/PopupView/PopupView.swift +1 -1
  76. package/ios/PopupView/Utils++.swift +0 -8
  77. package/ios/ProgressInfo/ProgressInfo.swift +4 -2
  78. package/ios/Radio/Radio.swift +2 -1
  79. package/ios/Rating/Rating.swift +9 -1
  80. package/ios/Resources/dot_loading.json +558 -0
  81. package/ios/Resources/lottie_circle_loader.json +1 -0
  82. package/ios/ScrollIndicator/ScrollIndicator.swift +11 -10
  83. package/ios/Skeleton/Skeleton.swift +22 -27
  84. package/ios/Slider/Slider.swift +16 -18
  85. package/ios/Stepper/Stepper.swift +6 -1
  86. package/ios/Steps/Steps.swift +8 -6
  87. package/ios/SuggestAction/SuggestAction.swift +5 -0
  88. package/ios/Swipeable/SwipeCell.swift +10 -6
  89. package/ios/Switch/Switch.swift +22 -20
  90. package/ios/TabView/TabView.swift +102 -21
  91. package/ios/Tag/Tag.swift +15 -4
  92. package/ios/Template/Logo/Logo.swift +2 -1
  93. package/ios/Template/TrustBanner/TrustBanner.swift +106 -54
  94. package/ios/Title/Title.swift +6 -17
  95. package/ios/Tooltip/Tooltip.swift +29 -14
  96. package/ios/Typography/Text.swift +61 -19
  97. package/ios/Uploader/Uploader.swift +3 -1
  98. package/ios/native-kits.podspec +2 -1
  99. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  100. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +1 -1
  101. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DuoTabDemo.swift +80 -0
  102. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +1 -0
  103. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IPhoneDuoDemo.swift +173 -0
  104. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +77 -1
  105. package/package.json +1 -1
  106. package/scripts/gen-ios-icons.mjs +36 -0
  107. package/build.gradle.kts +0 -11
  108. package/compose/build.gradle.kts +0 -190
  109. package/compose/build.gradle.kts.backup +0 -190
  110. package/compose/compose.podspec +0 -47
  111. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  112. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  113. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  114. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  115. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -151
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -831
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -189
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -475
  149. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  150. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -266
  151. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
  152. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  153. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -264
  154. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  155. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  156. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  157. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  158. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  159. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  160. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  161. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -334
  162. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -98
  163. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
  164. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -552
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
  176. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  177. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  178. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -16
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -297
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -54
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -50
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +0 -157
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -41
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  199. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  200. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  201. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  202. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  203. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -299
  204. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +0 -58
  205. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -129
  206. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  207. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -205
  208. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  209. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  210. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -622
  211. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  212. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  213. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -175
  214. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -232
  215. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  216. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  217. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -381
  218. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -83
  219. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -105
  220. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -74
  221. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -347
  222. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -37
  223. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -363
  224. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +0 -169
  225. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  226. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  227. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  228. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  229. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  230. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -71
  231. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  232. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  233. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  234. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -118
  235. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -40
  236. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -45
  237. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  238. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  239. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  240. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -213
  241. package/gradle/libs.versions.toml +0 -69
  242. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  243. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  244. package/gradle.properties +0 -26
  245. package/gradlew +0 -252
  246. package/gradlew.bat +0 -94
  247. package/ios/Application/Components.swift +0 -270
  248. package/ios/Application/ComposeApi.swift +0 -22
  249. package/ios/Application/HeaderRight.swift +0 -306
  250. package/ios/Application/Navigation/BottomTab/BottomTab.swift +0 -104
  251. package/ios/Application/Navigation/HeaderBackProps.swift +0 -66
  252. package/ios/Application/Navigation/HeaderTitle.swift +0 -57
  253. package/ios/Application/Navigation/NavigationContainer.swift +0 -213
  254. package/ios/Application/Navigation/NavigationOptions.swift +0 -109
  255. package/ios/Application/Navigation/NavigatorManager.swift +0 -22
  256. package/ios/Application/Navigation/component/Header.swift +0 -178
  257. package/ios/Application/Navigation/component/HeaderBackground.swift +0 -83
  258. package/ios/Application/Navigation/component/HeaderColor.swift +0 -65
  259. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +0 -11
  260. package/ios/Application/Navigation/component/NavigationFooter.swift +0 -90
  261. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +0 -196
  262. package/ios/Application/Screen.swift +0 -250
  263. package/ios/Application/StackScreen.swift +0 -492
  264. package/ios-demo/README.md +0 -120
  265. package/settings.gradle.kts +0 -64
  266. /package/ios/{Application/Navigation → Navigation}/BottomTab/CurvedContainer.swift +0 -0
@@ -1,169 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import androidx.compose.animation.*
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.foundation.ScrollState
9
- import androidx.compose.foundation.background
10
- import androidx.compose.foundation.border
11
- import androidx.compose.foundation.interaction.MutableInteractionSource
12
- import androidx.compose.foundation.layout.*
13
- import androidx.compose.material3.AlertDialogDefaults
14
- import androidx.compose.material3.FloatingActionButton
15
- import androidx.compose.material3.FloatingActionButtonDefaults
16
- import androidx.compose.material3.FloatingActionButtonElevation
17
- import androidx.compose.runtime.*
18
- import androidx.compose.runtime.saveable.rememberSaveable
19
- import androidx.compose.ui.Alignment
20
- import androidx.compose.ui.Modifier
21
- import androidx.compose.ui.graphics.Color
22
- import androidx.compose.ui.unit.Dp
23
- import androidx.compose.ui.unit.dp
24
- import kotlinx.coroutines.delay
25
- import kotlinx.coroutines.flow.MutableStateFlow
26
- import kotlinx.coroutines.flow.collectLatest
27
- import kotlinx.coroutines.launch
28
- import vn.momo.kits.application.IsShowBaseLineDebug
29
- import vn.momo.kits.components.Icon
30
- import vn.momo.kits.components.Text
31
- import vn.momo.kits.const.Colors
32
- import vn.momo.kits.const.Typography
33
- import vn.momo.kits.modifier.conditional
34
- import kotlin.time.Duration.Companion.milliseconds
35
-
36
- enum class FABSize { SMALL, DEFAULT }
37
- enum class FABPosition { END, CENTER }
38
-
39
- data class FloatingButtonProps(
40
- val icon: String,
41
- val iconColor: Color? = null,
42
- val label: String? = null,
43
- val onClick: () -> Unit,
44
- val size: FABSize = FABSize.DEFAULT,
45
- val bottom: Dp? = null,
46
- val scrollState: ScrollState? = null,
47
- val position: FABPosition? = FABPosition.END,
48
- )
49
-
50
- private val FabSmallSize = 36.dp
51
- private val FabDefaultSize = 48.dp
52
- private val FabExpandedWidth = 80.dp
53
- private val FabIconSizeSmall = 12.dp
54
- private val FabIconSizeDefault = 24.dp
55
- private val FabPaddingHorizontal = 12.dp
56
-
57
- @Composable
58
- internal fun FloatingButton(
59
- scrollPosition: Int,
60
- bottom: Dp,
61
- onClick: () -> Unit,
62
- containerColor: Color,
63
- contentColor: Color = containerColor,
64
- icon: String,
65
- iconColor: Color? = null,
66
- text: String? = null,
67
- elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(4.dp),
68
- size: FABSize = FABSize.DEFAULT,
69
- position: FABPosition = FABPosition.END,
70
- keyboardSize: Dp = 0.dp,
71
- ) {
72
- val scrollStateFlow = remember { MutableStateFlow(scrollPosition) }
73
- var lastScrollPosition by rememberSaveable { mutableStateOf(0) }
74
- var isExpanded by rememberSaveable { mutableStateOf(false) }
75
-
76
- val coroutineScope = rememberCoroutineScope()
77
-
78
- // Animations
79
- val baseSize = if (size == FABSize.SMALL) FabSmallSize else FabDefaultSize
80
- val width by animateDpAsState(
81
- targetValue = if (isExpanded && text != null) FabExpandedWidth else baseSize,
82
- animationSpec = tween(100, easing = CubicBezierEasing(0.2f, 0.2f, 0.2f, 0.2f))
83
- )
84
-
85
- // Scroll listener
86
- LaunchedEffect(text) {
87
- if (text != null) {
88
- coroutineScope.launch {
89
- scrollStateFlow.collectLatest { newScroll ->
90
- isExpanded = newScroll <= lastScrollPosition
91
- delay(100.milliseconds)
92
- lastScrollPosition = newScroll
93
- }
94
- }
95
- }
96
- }
97
-
98
- LaunchedEffect(scrollPosition) {
99
- scrollStateFlow.value = scrollPosition
100
- }
101
-
102
- Box(
103
- modifier = Modifier
104
- .fillMaxSize()
105
- .padding(end = 12.dp, bottom = bottom)
106
- .offset(y = -keyboardSize)
107
- .background(Color.Transparent),
108
- contentAlignment = if (position == FABPosition.END) Alignment.BottomEnd else Alignment.BottomCenter,
109
- ) {
110
- FloatingActionButton(
111
- onClick = onClick,
112
- shape = AlertDialogDefaults.shape,
113
- containerColor = containerColor,
114
- contentColor = contentColor,
115
- elevation = elevation,
116
- interactionSource = remember { MutableInteractionSource() },
117
- modifier = Modifier
118
- .sizeIn(minWidth = width)
119
- .height(baseSize)
120
- .conditional(IsShowBaseLineDebug) {
121
- border(1.dp, Colors.blue_03)
122
- }
123
- ) {
124
- Row(
125
- modifier = Modifier.padding(
126
- start = if (isExpanded) FabPaddingHorizontal else 0.dp,
127
- end = if (isExpanded) FabPaddingHorizontal else 0.dp,
128
- ),
129
- verticalAlignment = Alignment.CenterVertically,
130
- horizontalArrangement = if (isExpanded) Arrangement.Start else Arrangement.Center
131
- ) {
132
- Icon(
133
- source = icon,
134
- size = if (size == FABSize.SMALL) FabIconSizeSmall else FabIconSizeDefault,
135
- color = iconColor ?: Color.White
136
- )
137
-
138
- AnimatedVisibility(
139
- visible = isExpanded,
140
- enter = fadeInExpandAnimation,
141
- exit = fadeOutShrinkAnimation,
142
- ) {
143
- Row {
144
- Spacer(Modifier.width(12.dp))
145
- Text(
146
- text = text ?: "",
147
- color = Color.White,
148
- style = Typography.actionDefaultBold
149
- )
150
- }
151
- }
152
- }
153
- }
154
- }
155
- }
156
-
157
- private val fadeOutShrinkAnimation = fadeOut(
158
- animationSpec = tween(100, easing = LinearEasing)
159
- ) + shrinkHorizontally(
160
- animationSpec = tween(100, easing = LinearEasing),
161
- shrinkTowards = Alignment.Start
162
- )
163
-
164
- private val fadeInExpandAnimation = fadeIn(
165
- animationSpec = tween(100, easing = LinearEasing)
166
- ) + expandHorizontally(
167
- animationSpec = tween(100, easing = LinearEasing),
168
- expandFrom = Alignment.Start
169
- )
@@ -1,381 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import vn.momo.kits.modifier.InternalApi
4
-
5
- import androidx.compose.animation.core.animateFloatAsState
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.Row
11
- import androidx.compose.foundation.layout.Spacer
12
- import androidx.compose.foundation.layout.fillMaxWidth
13
- import androidx.compose.foundation.layout.height
14
- import androidx.compose.foundation.layout.offset
15
- import androidx.compose.foundation.layout.padding
16
- import androidx.compose.foundation.layout.size
17
- import androidx.compose.foundation.layout.width
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.ui.Alignment
23
- import androidx.compose.ui.Modifier
24
- import androidx.compose.ui.draw.clipToBounds
25
- import androidx.compose.ui.graphics.graphicsLayer
26
- import androidx.compose.ui.graphics.Brush
27
- import androidx.compose.ui.graphics.Color
28
- import androidx.compose.ui.layout.onGloballyPositioned
29
- import androidx.compose.ui.platform.LocalDensity
30
- import androidx.compose.ui.text.style.TextAlign
31
- import androidx.compose.ui.unit.Dp
32
- import androidx.compose.ui.unit.dp
33
- import vn.momo.kits.components.Icon
34
- import vn.momo.kits.components.Image
35
- import vn.momo.kits.components.InputSearchProps
36
- import vn.momo.kits.const.AppTheme
37
- import vn.momo.kits.const.Colors
38
- import vn.momo.kits.components.PopupNotifyProps
39
- import vn.momo.kits.application.IsShowBaseLineDebug
40
- import vn.momo.kits.const.Spacing
41
- import vn.momo.kits.layout.getScreenLayout
42
- import vn.momo.kits.modifier.activeOpacityClickable
43
- import vn.momo.kits.modifier.conditional
44
- import vn.momo.kits.modifier.setAutomationId
45
- import vn.momo.kits.navigation.LocalHeaderRightWidthPx
46
- import vn.momo.kits.navigation.LocalNavigator
47
- import vn.momo.kits.navigation.LocalOptions
48
- import vn.momo.kits.navigation.LocalScrollState
49
- import vn.momo.kits.navigation.getInputSearchType
50
- import vn.momo.kits.platform.getScreenDimensions
51
- import vn.momo.kits.utils.horizontalSafeAreaPadding
52
-
53
- @InternalApi
54
- const val HEADER_HEIGHT = 52
55
- internal enum class InputSearchType { None, Header, Animated }
56
- enum class TitlePosition { LEFT, CENTER }
57
-
58
- private val HEADER_ACTIONS_WIDTH = 172.dp
59
-
60
- @Suppress("FrequentlyChangingValue")
61
- @Composable
62
- internal fun headerOpacity(): Float {
63
- val options = LocalOptions.current
64
- val scrollState = LocalScrollState.current
65
- val opacityHeight = when (val header = options.headerType) {
66
- is HeaderType.Animated -> with(LocalDensity.current) { header.layoutOffSet.roundToPx() }
67
- else -> HEADER_HEIGHT
68
- }
69
- val opacity by animateFloatAsState(
70
- targetValue = when {
71
- options.headerType is HeaderType.Transparent -> 0f
72
- opacityHeight <= 0 -> if (scrollState.value > 0) 1f else 0f
73
- else -> (scrollState.value / opacityHeight.toFloat()).coerceIn(0f, 1f)
74
- }
75
- )
76
- return opacity
77
- }
78
-
79
- // Back button and toolkit share the bar with the title unless the iPhone Duo side bar holds them.
80
- @Composable
81
- internal fun headerTitleMaxWidth(): Dp {
82
- val layout = getScreenLayout()
83
- if (layout.sideBar != null) return layout.contentWidth - Spacing.M * 2
84
- return getScreenDimensions().width.dp - HEADER_ACTIONS_WIDTH
85
- }
86
-
87
- @Composable
88
- internal fun Header(onBackHandler: (() -> Unit)? = null) {
89
- val options = LocalOptions.current
90
- val navigator = LocalNavigator.current
91
- val headerRightWidthPx = LocalHeaderRightWidthPx.current
92
- val inputSearchType = getInputSearchType(options)
93
- val layout = getScreenLayout()
94
- val useSideBar = layout.sideBar != null
95
- val opacity = headerOpacity()
96
-
97
- val headerColor = getHeaderColor(options.headerType, opacity, options.tintColor, Colors.black_17)
98
-
99
- val animatedAlpha by animateFloatAsState(targetValue = opacity, label = "BackgroundAlpha")
100
-
101
- val background = if (options.headerType is HeaderType.Transparent)
102
- options.backgroundColor ?: AppTheme.current.colors.background.surface
103
- else
104
- AppTheme.current.colors.background.surface
105
-
106
- if (options.headerType == HeaderType.None) return
107
-
108
- val titlePosition = options.titlePosition
109
- val titleColor = headerColor.tintIconColor
110
- .copy(alpha = if (inputSearchType == InputSearchType.Animated) 1f - animatedAlpha else 1f)
111
- // Centered title needs a full-width overlay to stay screen-centered, not boxed between back button and header right.
112
- val centerTitle = titlePosition == TitlePosition.CENTER && options.headerTitle is HeaderTitle.Default
113
-
114
- val headerImage = AppTheme.current.assets.headerBackground
115
- .takeUnless { options.headerType is HeaderType.Transparent }
116
-
117
- Box(
118
- Modifier.height(layout.headerHeight)
119
- .fillMaxWidth()
120
- .conditional(headerImage.isNullOrEmpty()) {
121
- background(background.copy(alpha = animatedAlpha))
122
- }
123
- .conditional(IsShowBaseLineDebug) {
124
- border(1.dp, Colors.blue_03)
125
- },
126
- contentAlignment = Alignment.BottomCenter
127
- ) {
128
- if (!headerImage.isNullOrEmpty()) {
129
- Box(
130
- Modifier
131
- .matchParentSize()
132
- .clipToBounds()
133
- .graphicsLayer { alpha = animatedAlpha }
134
- .background(background)
135
- ) {
136
- Image(
137
- source = headerImage,
138
- loading = false,
139
- modifier = Modifier
140
- .fillMaxWidth()
141
- .wrapContentHeight(Alignment.Top, unbounded = true)
142
- .height(HEADER_BACKGROUND_HEIGHT),
143
- )
144
- }
145
- }
146
- Row(
147
- modifier = Modifier.height(layout.headerBarHeight)
148
- .fillMaxWidth()
149
- .horizontalSafeAreaPadding()
150
- .padding(horizontal = Spacing.M),
151
- verticalAlignment = Alignment.CenterVertically,
152
- horizontalArrangement = Arrangement.SpaceBetween
153
- ) {
154
- if (!options.hiddenBack && !useSideBar) {
155
- BackButton(
156
- borderColor = headerColor.borderColor,
157
- backgroundButton = headerColor.backgroundButton,
158
- tintIconColor = headerColor.tintIconColor,
159
- onBackHandler = {
160
- navigator.onBackSafe { }
161
- }
162
- )
163
- Spacer(Modifier.width(Spacing.S))
164
- }
165
-
166
- if (centerTitle) {
167
- Spacer(Modifier.weight(1f))
168
- } else {
169
- HeaderContent(
170
- headerTitle = options.headerTitle,
171
- tintIconColor = titleColor,
172
- titlePosition = titlePosition,
173
- modifier = Modifier.weight(1f)
174
- )
175
- }
176
- Box(Modifier.onGloballyPositioned {
177
- if(headerRightWidthPx.intValue != it.size.width) headerRightWidthPx.intValue = it.size.width
178
- }){
179
- if (!(useSideBar && options.headerRight is HeaderRight.Toolkit)) {
180
- HeaderRight(options.headerRight, options.tintColor, headerColor)
181
- }
182
- }
183
- }
184
- if (centerTitle) {
185
- Box(
186
- modifier = Modifier.height(layout.headerBarHeight)
187
- .fillMaxWidth()
188
- .horizontalSafeAreaPadding()
189
- .padding(horizontal = Spacing.M),
190
- contentAlignment = Alignment.Center
191
- ) {
192
- HeaderContent(
193
- headerTitle = options.headerTitle,
194
- tintIconColor = titleColor,
195
- titlePosition = titlePosition,
196
- modifier = Modifier.fillMaxWidth()
197
- )
198
- }
199
- }
200
- VerticalShadow(opacity)
201
- }
202
- }
203
-
204
- @Composable
205
- private fun BackButton(borderColor: Color, backgroundButton: Color, tintIconColor: Color, onBackHandler: () -> Unit){
206
- Box(
207
- modifier = Modifier
208
- .size(28.dp)
209
- .background(backgroundButton, RoundedCornerShape(100))
210
- .border(width = 0.2.dp, color = borderColor, shape = RoundedCornerShape(100))
211
- .activeOpacityClickable(onClick = onBackHandler)
212
- .padding(Spacing.XS)
213
- .setAutomationId("btn_navigation_back"),
214
- contentAlignment = Alignment.Center
215
- ) {
216
- Icon(
217
- source = "arrow-back",
218
- color = tintIconColor,
219
- size = 20.dp,
220
- )
221
- }
222
- }
223
-
224
- @Composable
225
- internal fun HeaderContent(
226
- headerTitle: HeaderTitle,
227
- tintIconColor: Color,
228
- titlePosition: TitlePosition = TitlePosition.LEFT,
229
- modifier: Modifier = Modifier,
230
- ){
231
- Box(
232
- modifier = modifier,
233
- contentAlignment = if (titlePosition == TitlePosition.CENTER) Alignment.Center else Alignment.CenterStart
234
- ) {
235
- when (headerTitle){
236
- is HeaderTitle.Default -> {
237
- HeaderTitle(
238
- title = headerTitle.title,
239
- color = tintIconColor,
240
- modifier = Modifier.fillMaxWidth(fraction = if (titlePosition == TitlePosition.CENTER) 0.5f else 1f),
241
- textAlign = if (titlePosition == TitlePosition.CENTER) TextAlign.Center else TextAlign.Start
242
- )
243
- }
244
- is HeaderTitle.Journey -> {
245
- HeaderJourney(
246
- data = headerTitle,
247
- tintIconColor = tintIconColor
248
- )
249
- }
250
- is HeaderTitle.Location -> {
251
- HeaderLocation(
252
- data = headerTitle,
253
- tintIconColor = tintIconColor
254
- )
255
- }
256
- is HeaderTitle.User -> {
257
- HeaderUser(
258
- data = headerTitle
259
- )
260
- }
261
- }
262
- }
263
- }
264
-
265
- @Composable
266
- internal fun VerticalShadow(opacity: Float){
267
- if(opacity == 1f){
268
- Box(modifier = Modifier
269
- .fillMaxWidth()
270
- .height(6.dp)
271
- .offset(x = 0.dp, y = 6.dp)
272
- .background(
273
- brush = Brush.verticalGradient(
274
- colors = listOf(Color.Black.copy(alpha = 0.05f), Color.Transparent)
275
- )
276
- )
277
- )
278
- }
279
- }
280
-
281
- sealed class HeaderTitle {
282
- class Default(val title: String) : HeaderTitle()
283
-
284
- class User(
285
- val title: String,
286
- val subTitle: String? = null,
287
- val image: List<String>? = null,
288
- val dotColor: Color? = null,
289
- val tintColor: Color? = null,
290
- val onPress: (() -> Unit)? = null,
291
- val icons: List<String> = emptyList(),
292
- val isLoading: Boolean = false
293
- ) : HeaderTitle()
294
-
295
- class Location(
296
- val description: String? = null,
297
- val location: String,
298
- val tintColor: String? = null,
299
- val onPress: (() -> Unit)? = null,
300
- val isLoading: Boolean = false
301
- ) : HeaderTitle()
302
-
303
- class Journey(
304
- val start: String,
305
- val end: String? = null,
306
- val description: String? = null,
307
- val icon: String,
308
- val iconColor: String? = null,
309
- val tintColor: String? = null,
310
- val onPress: (() -> Unit)? = null,
311
- val isLoading: Boolean = false
312
- ) : HeaderTitle()
313
- }
314
-
315
- sealed class HeaderType {
316
- interface DefaultOrExtended {
317
- val useAnimated: Boolean
318
- val inputSearchProps: InputSearchProps?
319
- }
320
-
321
- data class Default(
322
- override val useAnimated: Boolean = false,
323
- override val inputSearchProps: InputSearchProps? = null
324
- ) : HeaderType(), DefaultOrExtended
325
-
326
- data class Extended(
327
- override val useAnimated: Boolean = false,
328
- override val inputSearchProps: InputSearchProps? = null
329
- ) : HeaderType(), DefaultOrExtended
330
-
331
- data object None : HeaderType()
332
-
333
- data class Animated(
334
- val aspectRatio: AnimatedHeaderRatio = AnimatedHeaderRatio.RATIO_16_9,
335
- val isSurface: Boolean = true,
336
- val layoutOffSet: Dp = 56.dp,
337
- val height: Dp? = null,
338
- val composable: @Composable (scrollState: Int) -> Unit = {}
339
- ) : HeaderType()
340
-
341
- data class Transparent(
342
- val isFullScreenContent: Boolean = false
343
- ) : HeaderType()
344
- }
345
-
346
- data class HeaderBackProps(
347
- val preventBack: PopupNotifyProps? = null,
348
- )
349
-
350
- @InternalApi
351
- data class HeaderColor(val tintIconColor: Color, val backgroundButton: Color, val borderColor: Color)
352
- internal fun getHeaderColor(headerType: HeaderType, opacity: Float, tintColor: Color?, defaultColor: Color): HeaderColor{
353
- return if(headerType is HeaderType.Animated) {
354
- if (opacity == 1f || !headerType.isSurface)
355
- HeaderColor(
356
- tintIconColor = Colors.black_17,
357
- backgroundButton = Colors.black_01.copy(alpha = 0.6f),
358
- borderColor = Colors.black_20.copy(alpha = 0.2f)
359
- )
360
- else
361
- HeaderColor(
362
- tintIconColor = Colors.black_01,
363
- backgroundButton = Colors.black_20.copy(alpha = 0.6f),
364
- borderColor = Color.Transparent
365
- )
366
- }
367
- else {
368
- if (tintColor == Colors.black_01)
369
- HeaderColor(
370
- tintIconColor = tintColor,
371
- backgroundButton = Colors.black_20.copy(alpha = 0.6f),
372
- borderColor = Colors.black_01.copy(alpha = 0.2f)
373
- )
374
- else
375
- HeaderColor(
376
- tintIconColor = tintColor ?: defaultColor,
377
- backgroundButton = Colors.black_01.copy(alpha = 0.6f),
378
- borderColor = Colors.black_20.copy(alpha = 0.2f)
379
- )
380
- }
381
- }
@@ -1,83 +0,0 @@
1
- package vn.momo.kits.navigation.component
2
-
3
- import androidx.compose.animation.core.animateFloatAsState
4
- import androidx.compose.foundation.background
5
- import androidx.compose.foundation.layout.Box
6
- import androidx.compose.foundation.layout.fillMaxSize
7
- import androidx.compose.foundation.layout.fillMaxWidth
8
- import androidx.compose.foundation.layout.height
9
- import androidx.compose.runtime.Composable
10
- import androidx.compose.runtime.getValue
11
- import androidx.compose.ui.Modifier
12
- import androidx.compose.ui.geometry.Offset
13
- import androidx.compose.ui.graphics.Brush
14
- import androidx.compose.ui.graphics.Color
15
- import androidx.compose.ui.platform.LocalDensity
16
- import androidx.compose.ui.unit.dp
17
- import vn.momo.kits.components.Image
18
- import vn.momo.kits.const.AppTheme
19
- import vn.momo.kits.layout.getScreenLayout
20
- import vn.momo.kits.modifier.conditional
21
- import vn.momo.kits.navigation.LocalOptions
22
- import vn.momo.kits.navigation.LocalScrollState
23
-
24
- enum class AnimatedHeaderRatio(val value: Float){
25
- RATIO_16_9(16f / 9f),
26
- RATIO_1_1(1f),
27
- RATIO_3_2(3f / 2f)
28
- }
29
-
30
- internal val HEADER_BACKGROUND_HEIGHT = 154.dp
31
-
32
- @Suppress("FrequentlyChangingValue")
33
- @Composable
34
- internal fun HeaderBackground() {
35
- val density = LocalDensity.current
36
- val theme = AppTheme.current
37
- val options = LocalOptions.current
38
- val scrollState = LocalScrollState.current
39
- val backgroundColor = options.backgroundColor ?: AppTheme.current.colors.background.default
40
-
41
- val minHeight = getScreenLayout().headerHeight
42
- val maxHeight = HEADER_BACKGROUND_HEIGHT
43
- val opacity by animateFloatAsState(
44
- targetValue = (1 - (scrollState.value * 1f / HEADER_HEIGHT * 1f)).coerceIn(0f, 1f),
45
- )
46
-
47
- val color = if (opacity == 0f) backgroundColor else Color(0xFFFDCADE)
48
- val height = when (options.headerType) {
49
- is HeaderType.Default -> minHeight
50
- is HeaderType.Extended -> {
51
- if (AppTheme.current.isHeaderImage()){
52
- if (opacity == 0f) minHeight else maxHeight
53
- } else {
54
- maxHeight
55
- }
56
- }
57
- else -> 0.dp
58
- }
59
-
60
- Box(Modifier.fillMaxWidth().height(height).background(backgroundColor)) {
61
- Box(Modifier
62
- .height(maxHeight)
63
- .fillMaxWidth()
64
- .conditional(!theme.isHeaderImage()) {
65
- background(Brush.linearGradient(
66
- colors = listOf(
67
- color,
68
- backgroundColor
69
- ),
70
- start = Offset(0f, 0f),
71
- end = Offset(0f, with(density) { maxHeight.toPx() })
72
- )
73
- )
74
- }
75
- ){
76
- if (!theme.isHeaderImage()) return@Box
77
- Image(
78
- source = theme.assets.headerBackground!!,
79
- modifier = Modifier.fillMaxSize(),
80
- )
81
- }
82
- }
83
- }