@momo-kits/native-kits 0.167.1-sizescale.2-debug → 0.168.1-beta.1-debug

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/CLAUDE.md +45 -3
  2. package/README.md +2 -2
  3. package/compose/build.gradle.kts +9 -1
  4. package/compose/build.gradle.kts.backup +8 -0
  5. package/compose/compose.podspec +1 -1
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +3 -4
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/ReservedRegions.android.kt +6 -0
  8. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +353 -113
  9. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +2 -2
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +20 -21
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +2 -1
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +4 -2
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +1 -1
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +24 -14
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +1 -1
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +1 -1
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +9 -6
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +11 -12
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +4 -9
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +2 -2
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +10 -9
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +6 -6
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +55 -22
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +12 -1
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +7 -9
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +1 -1
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +16 -9
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +13 -5
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +3 -2
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +14 -6
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +19 -21
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +2 -2
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +6 -3
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +3 -1
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +7 -15
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +11 -15
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +10 -4
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +7 -23
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +13 -11
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +21 -9
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +309 -0
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +11 -9
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +43 -4
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +8 -0
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +10 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +8 -7
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +6 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +197 -60
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +134 -81
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +54 -62
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoBarCompression.kt +98 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoTabBar.kt +312 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +126 -29
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +34 -14
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +3 -3
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +1 -2
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +116 -26
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +4 -2
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +2 -3
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +192 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +2 -1
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +3 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ReservedRegions.kt +13 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +13 -0
  65. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +1 -3
  66. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +10 -11
  67. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/ReservedRegions.ios.kt +94 -0
  68. package/gradle/libs.versions.toml +1 -1
  69. package/gradle.properties +1 -1
  70. package/ios/Application/ApplicationEnvironment.swift +17 -0
  71. package/ios/Application/MaxApi.swift +30 -3
  72. package/ios/Avatar/Avatar.swift +4 -3
  73. package/ios/Badge/Badge.swift +6 -4
  74. package/ios/Badge/BadgeDot.swift +1 -1
  75. package/ios/Badge/BadgeRibbon.swift +0 -1
  76. package/ios/Button/Button.swift +15 -12
  77. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +64 -18
  78. package/ios/Carousel/Carousel.swift +29 -12
  79. package/ios/Checkbox/Checkbox.swift +7 -3
  80. package/ios/Chip/Chip.swift +5 -4
  81. package/ios/Collapse/Collapse.swift +70 -19
  82. package/ios/Colors+Radius+Spacing/Colors.swift +10 -1
  83. package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
  84. package/ios/DateTimePicker/DateTimePicker.swift +54 -20
  85. package/ios/DateTimePicker/WheelPicker.swift +103 -105
  86. package/ios/Divider/Divider.swift +37 -4
  87. package/ios/Extensions/Color++.swift +38 -9
  88. package/ios/Extensions/OptionalEnvironmentObject.swift +12 -0
  89. package/ios/Extensions/SkeletonUICompat.swift +11 -0
  90. package/ios/Icon/Icon.swift +21 -23
  91. package/ios/Icon/Icons.swift +1329 -0
  92. package/ios/IconButton/IconButton.swift +15 -7
  93. package/ios/Image/Image.swift +7 -23
  94. package/ios/Information/Information.swift +27 -9
  95. package/ios/Input/ErrorView.swift +2 -2
  96. package/ios/Input/Input.swift +160 -147
  97. package/ios/Input/InputPhoneNumber.swift +12 -9
  98. package/ios/Input/InputSearch.swift +107 -77
  99. package/ios/Input/InputTextArea.swift +128 -145
  100. package/ios/InputDropDown/InputDropDown.swift +10 -7
  101. package/ios/InputMoney/InputMoney.swift +33 -11
  102. package/ios/InputOTP/InputOTP.swift +22 -12
  103. package/ios/Layout/Card.swift +50 -0
  104. package/ios/Layout/GridContext.swift +187 -3
  105. package/ios/Layout/Item.swift +5 -4
  106. package/ios/Layout/ScreenLayout.swift +380 -0
  107. package/ios/Layout/Section.swift +4 -100
  108. package/ios/Loader/Loader.swift +5 -9
  109. package/ios/Lottie/LottieView.swift +14 -2
  110. package/ios/{Application/Navigation/Overplay → Navigation}/BottomSheet.swift +169 -29
  111. package/ios/Navigation/BottomTab/BottomTab.swift +332 -0
  112. package/ios/{Application/Navigation → Navigation}/BottomTab/BottomTabBar.swift +18 -7
  113. package/ios/Navigation/BottomTab/DuoBarCompression.swift +105 -0
  114. package/ios/Navigation/BottomTab/DuoTabBar.swift +304 -0
  115. package/ios/{Application → Navigation/Component}/FloatingButton.swift +43 -54
  116. package/ios/Navigation/Component/Header.swift +545 -0
  117. package/ios/Navigation/Component/HeaderBackground.swift +133 -0
  118. package/ios/Navigation/Component/HeaderJourney.swift +73 -0
  119. package/ios/Navigation/Component/HeaderLocation.swift +48 -0
  120. package/ios/Navigation/Component/HeaderRight.swift +425 -0
  121. package/ios/Navigation/Component/HeaderTitle.swift +36 -0
  122. package/ios/{Application/Navigation → Navigation/Component}/HeaderUser.swift +21 -24
  123. package/ios/Navigation/Component/SideBar.swift +183 -0
  124. package/ios/{Application/Navigation/Overplay → Navigation/Component}/SnackBar.swift +8 -8
  125. package/ios/Navigation/HostBackGestureBridge.swift +78 -0
  126. package/ios/{Application/Navigation/Overplay → Navigation}/ModalScreen.swift +9 -2
  127. package/ios/Navigation/Navigation.swift +204 -0
  128. package/ios/Navigation/NavigationContainer.swift +195 -0
  129. package/ios/{Application/Navigation → Navigation}/Navigator.swift +207 -107
  130. package/ios/Navigation/StackScreen.swift +934 -0
  131. package/ios/Navigation/StackTransition.swift +400 -0
  132. package/ios/Navigation/SwipeBackHaptic.swift +33 -0
  133. package/ios/{Application/Navigation → Navigation}/Tracking/ScreenTracker.swift +12 -5
  134. package/ios/OTPKeyboard/OTPKeyboard.swift +8 -11
  135. package/ios/Pagination/PaginationScroll.swift +2 -2
  136. package/ios/Popup/PopupDisplay.swift +72 -135
  137. package/ios/Popup/PopupInput.swift +10 -13
  138. package/ios/Popup/PopupLayout.swift +140 -0
  139. package/ios/Popup/PopupNotify.swift +59 -69
  140. package/ios/Popup/PopupPromotion.swift +31 -47
  141. package/ios/PopupView/FullscreenPopup.swift +13 -19
  142. package/ios/PopupView/PopupView.swift +1 -1
  143. package/ios/PopupView/Utils++.swift +0 -8
  144. package/ios/ProgressInfo/ProgressInfo.swift +4 -2
  145. package/ios/Radio/Radio.swift +2 -1
  146. package/ios/Rating/Rating.swift +9 -1
  147. package/ios/Resources/dot_loading.json +558 -0
  148. package/ios/Resources/lottie_circle_loader.json +1 -0
  149. package/ios/ScrollIndicator/ScrollIndicator.swift +11 -10
  150. package/ios/Skeleton/Skeleton.swift +22 -27
  151. package/ios/Slider/Slider.swift +16 -18
  152. package/ios/Stepper/Stepper.swift +6 -1
  153. package/ios/Steps/Steps.swift +8 -6
  154. package/ios/SuggestAction/SuggestAction.swift +5 -0
  155. package/ios/Swipeable/SwipeCell.swift +10 -6
  156. package/ios/Switch/Switch.swift +22 -20
  157. package/ios/TabView/TabView.swift +102 -21
  158. package/ios/Tag/Tag.swift +15 -4
  159. package/ios/Template/Logo/Logo.swift +2 -1
  160. package/ios/Template/TrustBanner/TrustBanner.swift +106 -54
  161. package/ios/Title/Title.swift +6 -17
  162. package/ios/Tooltip/Tooltip.swift +29 -14
  163. package/ios/Typography/FontScale.swift +3 -3
  164. package/ios/Typography/Text.swift +81 -19
  165. package/ios/Uploader/Uploader.swift +3 -1
  166. package/ios/native-kits.podspec +2 -1
  167. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  168. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +1 -1
  169. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DuoTabDemo.swift +80 -0
  170. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +2 -0
  171. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IPhoneDuoDemo.swift +173 -0
  172. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +77 -1
  173. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +1 -0
  174. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +2 -2
  175. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +2 -0
  176. package/local.properties +2 -2
  177. package/package.json +1 -1
  178. package/scripts/gen-ios-icons.mjs +36 -0
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitSizeScale.kt +0 -56
  192. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +0 -32
  193. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  194. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  195. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +0 -16
  196. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
  197. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -5
  198. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
  199. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
  200. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
  201. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
  202. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
  203. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +0 -58
  204. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +0 -58
  205. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -60
  206. package/ios/Application/Components.swift +0 -270
  207. package/ios/Application/ComposeApi.swift +0 -22
  208. package/ios/Application/HeaderRight.swift +0 -306
  209. package/ios/Application/Navigation/BottomTab/BottomTab.swift +0 -104
  210. package/ios/Application/Navigation/HeaderBackProps.swift +0 -66
  211. package/ios/Application/Navigation/HeaderTitle.swift +0 -57
  212. package/ios/Application/Navigation/NavigationContainer.swift +0 -213
  213. package/ios/Application/Navigation/NavigationOptions.swift +0 -109
  214. package/ios/Application/Navigation/NavigatorManager.swift +0 -22
  215. package/ios/Application/Navigation/component/Header.swift +0 -178
  216. package/ios/Application/Navigation/component/HeaderBackground.swift +0 -83
  217. package/ios/Application/Navigation/component/HeaderColor.swift +0 -65
  218. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +0 -11
  219. package/ios/Application/Navigation/component/NavigationFooter.swift +0 -90
  220. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +0 -196
  221. package/ios/Application/Screen.swift +0 -250
  222. package/ios/Application/StackScreen.swift +0 -492
  223. /package/ios/{Application/Navigation → Navigation}/BottomTab/CurvedContainer.swift +0 -0
@@ -1,378 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.animation.core.Animatable
4
- import androidx.compose.animation.core.animateFloatAsState
5
- import androidx.compose.animation.core.tween
6
- import androidx.compose.foundation.ScrollState
7
- import androidx.compose.foundation.background
8
- import androidx.compose.foundation.gestures.detectTapGestures
9
- import androidx.compose.foundation.layout.*
10
- import androidx.compose.foundation.rememberScrollState
11
- import androidx.compose.foundation.verticalScroll
12
- import androidx.compose.runtime.*
13
- import androidx.compose.ui.Alignment
14
- import androidx.compose.ui.Modifier
15
- import androidx.compose.ui.graphics.Color
16
- import androidx.compose.ui.input.pointer.pointerInput
17
- import androidx.compose.ui.layout.LayoutCoordinates
18
- import androidx.compose.ui.layout.onGloballyPositioned
19
- import androidx.compose.ui.platform.LocalDensity
20
- import androidx.compose.ui.platform.LocalSoftwareKeyboardController
21
- import androidx.compose.ui.unit.Dp
22
- import androidx.compose.ui.unit.IntOffset
23
- import androidx.compose.ui.unit.dp
24
- import androidx.compose.ui.zIndex
25
- import kotlinx.coroutines.*
26
- import vn.momo.kits.components.InputSearchProps
27
- import vn.momo.kits.const.AppNavigationBar
28
- import vn.momo.kits.const.AppTheme
29
- import vn.momo.kits.const.Colors
30
- import vn.momo.kits.const.Spacing
31
- import vn.momo.kits.modifier.conditional
32
- import vn.momo.kits.modifier.DeprecatedModifier
33
- import vn.momo.kits.modifier.shadow
34
- import vn.momo.kits.navigation.component.SnackBar
35
- import vn.momo.kits.platform.supportsImePadding
36
- import vn.momo.kits.utils.getAppStatusBarHeight
37
- import vn.momo.kits.utils.getNavigationBarHeight
38
- import kotlin.time.Duration.Companion.milliseconds
39
-
40
- enum class HeaderType {
41
- DEFAULT,
42
- EXTENDED,
43
- NONE
44
- }
45
-
46
- const val HEADER_HEIGHT = 52
47
-
48
- @Deprecated("Use NavigationContainer(StackScreen) instead", ReplaceWith("NavigationContainer(StackScreen)"))
49
- @Composable
50
- fun Screen(
51
- backgroundColor: Color? = null,
52
- tintColor: Color? = null,
53
- headerTransparent: Boolean = false,
54
- fullScreenContent: Boolean = false,
55
- isBack: Boolean = true,
56
- headerType: HeaderType = HeaderType.DEFAULT,
57
- verticalArrangement: Arrangement.Vertical = Arrangement.Top,
58
- horizontalAlignment: Alignment.Horizontal = Alignment.Start,
59
- title: String = "Stack",
60
- titlePosition: TitlePosition = TitlePosition.LEFT,
61
- goBack: (() -> Unit)? = null,
62
- scrollable: Boolean = true,
63
- scrollState: ScrollState = rememberScrollState(),
64
- onContentLayout: ((LayoutCoordinates) -> Unit)? = null,
65
- useAvoidKeyboard: Boolean = true,
66
- footer: @Composable (() -> Unit)? = null,
67
- headerRight: @Composable (() -> Unit)? = null,
68
- fabProps: FabProps? = null,
69
- animatedHeader: AnimatedHeader? = null,
70
- layoutOffset: Dp = 56.dp,
71
- inputSearchProps: InputSearchProps? = null,
72
- useAnimationSearch: Boolean = false,
73
- headerRightWidth: Dp = 0.dp,
74
- content: @Composable () -> Unit,
75
- ) {
76
- val statusBarHeight = getAppStatusBarHeight()
77
- val keyboardController = LocalSoftwareKeyboardController.current
78
-
79
- val isKeyboardVisible = isKeyboardVisible()
80
- val indicator = getNavigationBarHeight()
81
- val bottomPadding = if (isKeyboardVisible) 0.dp else indicator
82
-
83
- val headerHeight = if (animatedHeader !== null)
84
- with(LocalDensity.current) { layoutOffset.roundToPx() }
85
- else HEADER_HEIGHT
86
- val opacity by animateFloatAsState(
87
- targetValue = ((scrollState.value.toFloat() / headerHeight)).coerceIn(0f, 1f),
88
- )
89
-
90
- val headerAnimated =
91
- @Composable {
92
- Box(
93
- modifier = Modifier
94
- .fillMaxWidth()
95
- .aspectRatio(animatedHeader?.aspectRatio?.value ?: AnimatedHeaderRatio.RATIO_16_9.value)
96
- ) {
97
- animatedHeader?.composable?.invoke(scrollState.value)
98
- }
99
- }
100
- val helper = remember { ScreenHelper() }
101
-
102
- DisposableEffect(Unit) {
103
- onDispose { helper.dispose() }
104
- }
105
-
106
- CompositionLocalProvider(
107
- LocalScreenHelper provides helper
108
- ) {
109
- Box(
110
- Modifier.fillMaxSize()
111
- .background(backgroundColor ?: AppTheme.current.colors.background.default)
112
- .conditional(useAvoidKeyboard && supportsImePadding()) {
113
- imePadding()
114
- }.then(DeprecatedModifier())
115
- ) {
116
- val footerHeightPx = remember { mutableStateOf(0) }
117
-
118
- Box(Modifier.zIndex(1f)) {
119
- if (animatedHeader === null) {
120
- HeaderBackground(
121
- headerType = headerType,
122
- scrollState = scrollState.value,
123
- headerTransparent = headerTransparent
124
- )
125
- }
126
- }
127
-
128
- Box(Modifier.zIndex(5f)) {
129
- Header(
130
- headerType = headerType,
131
- title = title,
132
- titlePosition = titlePosition,
133
- headerRight = headerRight,
134
- headerRightWidth = headerRightWidth,
135
- goBack = goBack,
136
- opacity = opacity,
137
- animatedHeader = animatedHeader,
138
- inputSearchProps = inputSearchProps,
139
- scrollState = scrollState.value,
140
- useAnimationSearch = useAnimationSearch,
141
- tintColor = tintColor
142
- )
143
- }
144
-
145
- Box(Modifier.zIndex(2f).fillMaxSize()){
146
- Column(
147
- modifier = Modifier.fillMaxSize()
148
- .padding( top = when {
149
- animatedHeader != null -> 0.dp
150
- headerType == HeaderType.NONE -> 0.dp
151
- fullScreenContent -> 0.dp
152
- else -> statusBarHeight + HEADER_HEIGHT.dp
153
- })
154
- .pointerInput(Unit) {
155
- detectTapGestures(onTap = {
156
- keyboardController?.hide()
157
- })
158
- }
159
- .zIndex(1f),
160
- ) {
161
-
162
- Column(
163
- modifier = Modifier
164
- .conditional(scrollable) { weight(1f) }
165
- .conditional(onContentLayout != null) {
166
- onGloballyPositioned(onContentLayout ?: {})
167
- }
168
- .conditional(scrollable) { verticalScroll(scrollState) },
169
- verticalArrangement = verticalArrangement,
170
- horizontalAlignment = horizontalAlignment
171
- ) {
172
- Box {
173
- if (animatedHeader !== null) headerAnimated()
174
- Column {
175
- if (animatedHeader !== null) {
176
- Spacer(modifier = Modifier.padding(top = statusBarHeight + HEADER_HEIGHT.dp + layoutOffset))
177
- }
178
-
179
- if (useAnimationSearch && inputSearchProps != null && headerType == HeaderType.EXTENDED) {
180
- Spacer(modifier = Modifier.padding(top = (HEADER_HEIGHT.dp + Spacing.S)))
181
- }
182
- content()
183
- }
184
- }
185
- }
186
-
187
- footer?.let {
188
- val footerHeight = with(LocalDensity.current) { footerHeightPx.value.toDp() }
189
- Spacer(Modifier.height(footerHeight))
190
- }
191
- }
192
- }
193
-
194
- Box(Modifier.zIndex(4f).align(Alignment.BottomCenter)) {
195
- footer?.let {
196
- Footer(
197
- footer = footer,
198
- bottom = bottomPadding,
199
- onFooterMeasured = { footerHeightPx.value = it }
200
- )
201
- }
202
- }
203
-
204
- Column (Modifier.zIndex(6f)) {
205
- if (fabProps != null) {
206
- FloatingButton(
207
- scrollPosition = fabProps.scrollState?.value ?: scrollState.value,
208
- onClick = fabProps.onClick,
209
- containerColor = AppTheme.current.colors.primary,
210
- bottom = fabProps.bottom
211
- ?: if (footer != null) bottomPadding + 76.dp else bottomPadding + 12.dp,
212
- icon = fabProps.icon,
213
- iconColor = fabProps.iconColor,
214
- text = fabProps.label,
215
- size = fabProps.size,
216
- position = fabProps.position ?: FABPosition.END,
217
- )
218
- }
219
- }
220
-
221
- Box(
222
- modifier = Modifier
223
- .align(Alignment.BottomCenter)
224
- .zIndex(3f)
225
- ) {
226
- ScreenSnackBarHost(if (footer == null) 0 else footerHeightPx.value)
227
- }
228
- }
229
- }
230
- }
231
-
232
- @Composable
233
- internal fun isKeyboardVisible(): Boolean {
234
- val ime = WindowInsets.ime
235
- val density = LocalDensity.current
236
- val bottom = ime.getBottom(density)
237
- return bottom > 0
238
- }
239
-
240
- @Composable
241
- fun Footer(
242
- footer: @Composable (() -> Unit)? = null,
243
- bottom: Dp = 0.dp,
244
- onFooterMeasured: ((Int) -> Unit)? = null
245
- ) {
246
- Box(
247
- Modifier
248
- .shadow(
249
- color = Colors.black_20.copy(alpha = 0.05f),
250
- blurRadius = 24f,
251
- offsetX = 0.dp,
252
- offsetY = (-4).dp
253
- )
254
- .background(AppTheme.current.colors.background.surface)
255
- .onGloballyPositioned {
256
- onFooterMeasured?.invoke(it.size.height)
257
- }
258
-
259
- ) {
260
- Box(
261
- Modifier.fillMaxWidth()
262
- .padding(bottom = bottom)
263
- .padding(vertical = Spacing.S, horizontal = Spacing.M)
264
- ) {
265
- footer?.invoke()
266
- }
267
- }
268
- }
269
-
270
-
271
- class ScreenHelper {
272
-
273
- private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
274
-
275
- internal var snackBarState by mutableStateOf<SnackBarData?>(null)
276
-
277
- internal var requestHide by mutableStateOf(false)
278
-
279
- fun showSnackBar(snackBar: SnackBar, onDismiss: (() -> Unit)? = null) {
280
- scope.launch {
281
- requestHide = false
282
- snackBarState = SnackBarData(snackBar, onDismiss)
283
- }
284
- }
285
-
286
- fun hideSnackBar() {
287
- scope.launch {
288
- requestHide = true
289
- }
290
- }
291
-
292
- internal fun removeSnackBarNow() {
293
- snackBarState = null
294
- requestHide = false
295
- }
296
-
297
- fun dispose() {
298
- scope.cancel()
299
- }
300
- }
301
- data class SnackBarData(
302
- val type: SnackBar,
303
- val onDismiss: (() -> Unit)?
304
- )
305
-
306
- val LocalScreenHelper = staticCompositionLocalOf<ScreenHelper> {
307
- error("No Screen helper provided")
308
- }
309
-
310
- @Composable
311
- internal fun ScreenSnackBarHost(footerHeightPx: Int) {
312
- val helper = LocalScreenHelper.current
313
- val snackBarData = helper.snackBarState ?: return
314
- val density = LocalDensity.current
315
- val navigationBar = AppNavigationBar.current
316
-
317
- val footerHeight = if (footerHeightPx > 0) {
318
- footerHeightPx
319
- } else {
320
- with(density) {
321
- navigationBar.toPx()
322
- }
323
- }.toInt()
324
-
325
- var startPosition by remember { mutableStateOf(Float.MAX_VALUE) }
326
- val targetPosition = 0f
327
-
328
- var offsetY by remember { mutableStateOf(Animatable(startPosition)) }
329
-
330
- LaunchedEffect(startPosition) {
331
- if (startPosition != Float.MAX_VALUE){
332
- offsetY.snapTo(startPosition)
333
- offsetY.animateTo(targetPosition, tween(350))
334
- }
335
- }
336
-
337
- LaunchedEffect(helper.requestHide) {
338
- if (helper.requestHide) {
339
- offsetY.animateTo(startPosition, tween(200))
340
- helper.removeSnackBarNow()
341
- snackBarData.onDismiss?.invoke()
342
- }
343
- }
344
-
345
- LaunchedEffect(snackBarData.type.duration) {
346
- val duration = snackBarData.type.duration
347
- if (duration != null) {
348
- delay(duration.milliseconds)
349
- helper.hideSnackBar()
350
- }
351
- }
352
-
353
- DisposableEffect(Unit) {
354
- onDispose { snackBarData.onDismiss?.invoke() }
355
- }
356
-
357
- Box(
358
- modifier = Modifier
359
- .offset { IntOffset(0, offsetY.value.toInt() - footerHeight) }
360
- .onGloballyPositioned {
361
- if (startPosition != it.size.height.toFloat()) {
362
- startPosition = it.size.height.toFloat()
363
- offsetY = Animatable(startPosition)
364
- }
365
- }
366
- .fillMaxWidth()
367
- ) {
368
- when (val type = snackBarData.type) {
369
- is SnackBar.Custom -> type.content()
370
- is SnackBar.Toast -> {}
371
- }
372
- }
373
- }
374
-
375
-
376
-
377
-
378
-
@@ -1,69 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.animation.animateColorAsState
4
- import androidx.compose.animation.core.animateFloatAsState
5
- import androidx.compose.runtime.Composable
6
- import androidx.compose.runtime.getValue
7
- import androidx.compose.ui.graphics.Color
8
- import androidx.compose.ui.unit.Dp
9
- import androidx.compose.ui.unit.dp
10
- import vn.momo.kits.const.AppTheme
11
- import vn.momo.kits.const.Colors
12
- import vn.momo.kits.platform.getScreenDimensions
13
-
14
- data class HeaderAnimations(
15
- val opacity: Float,
16
- val backgroundSearch: Color,
17
- val translateX: Float,
18
- val width: Float,
19
- val translateY: Float
20
- )
21
-
22
- private const val SCREEN_PADDING = 12
23
- private const val BACK_WIDTH = 28
24
-
25
- @Deprecated("Use vn.momo.kits.navigation.component.Header instead", ReplaceWith("vn.momo.kits.navigation.component.Header"))
26
- @Composable
27
- internal fun useHeaderSearchAnimation(
28
- opacityAni: Float,
29
- scrollState: Int,
30
- headerRightWidth: Dp,
31
- isBack: Boolean
32
- ): HeaderAnimations {
33
- val screenWidth = getScreenDimensions().width
34
- val leftPosition = if (isBack) (BACK_WIDTH + 20).dp else 12.dp
35
- val searchWidth = screenWidth - (SCREEN_PADDING * 2)
36
-
37
- val backgroundSearch by animateColorAsState(
38
- targetValue = animateColor(
39
- Colors.black_01,
40
- AppTheme.current.colors.background.default,
41
- opacityAni
42
- ),
43
- )
44
-
45
- val animatedTranslateX by animateFloatAsState(
46
- targetValue = (scrollState / HEADER_HEIGHT * 1f).coerceIn(
47
- 0f,
48
- 1f
49
- ) * (leftPosition.value - 12) + 12,
50
- )
51
-
52
- val animatedWidth by animateFloatAsState(
53
- targetValue = (scrollState / HEADER_HEIGHT * 1f).coerceIn(
54
- 0f,
55
- 1f
56
- ) * ((searchWidth - leftPosition.value - headerRightWidth.value + 12) - searchWidth) + searchWidth,
57
- )
58
-
59
- val animatedTranslateY by animateFloatAsState(
60
- targetValue = (1 - (scrollState / HEADER_HEIGHT * 1f).coerceIn(0f, 1f)) * HEADER_HEIGHT
61
- )
62
- return HeaderAnimations(
63
- opacity = opacityAni,
64
- backgroundSearch = backgroundSearch,
65
- translateX = animatedTranslateX,
66
- width = animatedWidth,
67
- translateY = animatedTranslateY
68
- )
69
- }
@@ -1,56 +0,0 @@
1
- package vn.momo.kits.const
2
-
3
- import androidx.compose.runtime.Composable
4
- import androidx.compose.runtime.CompositionLocalProvider
5
- import androidx.compose.runtime.getValue
6
- import androidx.compose.runtime.mutableStateOf
7
- import androidx.compose.runtime.setValue
8
- import androidx.compose.runtime.staticCompositionLocalOf
9
- import androidx.compose.ui.platform.LocalDensity
10
- import androidx.compose.ui.unit.Density
11
- import vn.momo.kits.platform.ProvideOsFontScale
12
-
13
- // App-wide size scale (OS-zoom like): sizes (width/height/radius/icon…) grow by [rate] while spacing
14
- // and text keep their original size. Seeded by the host like KitFontScale; snapshot state, so a write
15
- // recomposes every container and relayouts without remounting screens.
16
- //
17
- // How: containers multiply LocalDensity.density by [rate] (every .dp grows) and divide fontScale by
18
- // [rate] (sp text unchanged). Spacing tokens divide by [rate] so padding/margin render unchanged.
19
- object KitSizeScale {
20
- var rate by mutableStateOf(1f)
21
- private set
22
-
23
- fun update(rate: Float) {
24
- this.rate = if (rate > 0f) rate else 1f
25
- }
26
- }
27
-
28
- // Scale already applied to LocalDensity by an enclosing container (1 = none), so nested containers
29
- // don't apply it twice and platform values in real units (screen size, OS font scale) can be converted.
30
- internal val LocalSizeScale = staticCompositionLocalOf { 1f }
31
-
32
- // Extra scale the next ProvideSizeScale adds on top of the current density: KitSizeScale.rate at the
33
- // root container, 1 inside an already scaled one. Divide real-unit Dp (host-passed insets) by it.
34
- @Composable
35
- internal fun pendingSizeScale(): Float = KitSizeScale.rate / LocalSizeScale.current
36
-
37
- // Root wrapper of every container: live OS font scale first, then the size scale on top of it.
38
- @Composable
39
- internal fun ProvideKitScale(content: @Composable () -> Unit) {
40
- ProvideOsFontScale { ProvideSizeScale(content) }
41
- }
42
-
43
- @Composable
44
- private fun ProvideSizeScale(content: @Composable () -> Unit) {
45
- val applied = LocalSizeScale.current
46
- val rate = KitSizeScale.rate
47
- val density = LocalDensity.current
48
- CompositionLocalProvider(
49
- LocalDensity provides Density(
50
- density = density.density / applied * rate,
51
- fontScale = density.fontScale * applied / rate,
52
- ),
53
- LocalSizeScale provides rate,
54
- content = content,
55
- )
56
- }
@@ -1,32 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Scheme
3
- version = "1.3">
4
- <BuildAction>
5
- <BuildActionEntries>
6
- <BuildActionEntry
7
- buildForRunning = "YES">
8
- <BuildableReference
9
- BuildableIdentifier = "primary"
10
- BlueprintIdentifier = "A6A920D22B2ADD1E00C1A11F"
11
- BuildableName = "Example"
12
- BlueprintName = "Example"
13
- ReferencedContainer = "container:Example.xcodeproj">
14
- </BuildableReference>
15
- </BuildActionEntry>
16
- </BuildActionEntries>
17
- </BuildAction>
18
- <LaunchAction
19
- useCustomWorkingDirectory = "NO"
20
- buildConfiguration = "Debug"
21
- allowLocationSimulation = "YES">
22
- <BuildableProductRunnable>
23
- <BuildableReference
24
- BuildableIdentifier = "primary"
25
- BlueprintIdentifier = "A6A920D22B2ADD1E00C1A11F"
26
- BuildableName = "Example"
27
- BlueprintName = "Example"
28
- ReferencedContainer = "container:Example.xcodeproj">
29
- </BuildableReference>
30
- </BuildableProductRunnable>
31
- </LaunchAction>
32
- </Scheme>
@@ -1,14 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>SchemeUserState</key>
6
- <dict>
7
- <key>Example.xcscheme</key>
8
- <dict>
9
- <key>orderHint</key>
10
- <integer>7</integer>
11
- </dict>
12
- </dict>
13
- </dict>
14
- </plist>
@@ -1,16 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>BuildLocationStyle</key>
6
- <string>UseAppPreferences</string>
7
- <key>CustomBuildLocationType</key>
8
- <string>RelativeToDerivedData</string>
9
- <key>DerivedDataCustomLocation</key>
10
- <string>DerivedData</string>
11
- <key>DerivedDataLocationStyle</key>
12
- <string>WorkspaceRelativePath</string>
13
- <key>ShowSharedSchemesAutomaticallyEnabled</key>
14
- <true/>
15
- </dict>
16
- </plist>
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Bucket
3
- uuid = "6B3C387A-E951-41D1-A42C-FB6E447A46BA"
4
- type = "0"
5
- version = "2.0">
6
- </Bucket>
@@ -1,5 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict />
5
- </plist>
@@ -1,58 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Scheme
3
- LastUpgradeVersion = "1600"
4
- version = "1.3">
5
- <BuildAction
6
- parallelizeBuildables = "YES"
7
- buildImplicitDependencies = "YES">
8
- <BuildActionEntries>
9
- <BuildActionEntry
10
- buildForTesting = "YES"
11
- buildForRunning = "YES"
12
- buildForProfiling = "YES"
13
- buildForArchiving = "YES"
14
- buildForAnalyzing = "YES">
15
- <BuildableReference
16
- BuildableIdentifier = "primary"
17
- BlueprintIdentifier = "3B6FB503A75BF5BC1FA6F30BC06B9D28"
18
- BuildableName = "MoMoUIKits.framework"
19
- BlueprintName = "MoMoUIKits"
20
- ReferencedContainer = "container:Pods.xcodeproj">
21
- </BuildableReference>
22
- </BuildActionEntry>
23
- </BuildActionEntries>
24
- </BuildAction>
25
- <TestAction
26
- buildConfiguration = "Debug"
27
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
- shouldUseLaunchSchemeArgsEnv = "YES">
30
- <Testables>
31
- </Testables>
32
- </TestAction>
33
- <LaunchAction
34
- buildConfiguration = "Debug"
35
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
- launchStyle = "0"
38
- useCustomWorkingDirectory = "NO"
39
- ignoresPersistentStateOnLaunch = "NO"
40
- debugDocumentVersioning = "YES"
41
- debugServiceExtension = "internal"
42
- allowLocationSimulation = "YES">
43
- </LaunchAction>
44
- <ProfileAction
45
- buildConfiguration = "Release"
46
- shouldUseLaunchSchemeArgsEnv = "YES"
47
- savedToolIdentifier = ""
48
- useCustomWorkingDirectory = "NO"
49
- debugDocumentVersioning = "YES">
50
- </ProfileAction>
51
- <AnalyzeAction
52
- buildConfiguration = "Debug">
53
- </AnalyzeAction>
54
- <ArchiveAction
55
- buildConfiguration = "Release"
56
- revealArchiveInOrganizer = "YES">
57
- </ArchiveAction>
58
- </Scheme>