@momo-kits/native-kits 0.167.1-beta.3-debug → 0.167.1-beta.4

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 (144) hide show
  1. package/.claude/settings.local.json +14 -0
  2. package/ios/native-kits.podspec +1 -1
  3. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  4. package/package.json +1 -1
  5. package/build.gradle.kts +0 -11
  6. package/compose/build.gradle.kts +0 -190
  7. package/compose/build.gradle.kts.backup +0 -190
  8. package/compose/compose.podspec +0 -47
  9. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  10. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  11. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  12. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  13. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -151
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -831
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -189
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -475
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -266
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -264
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -328
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -97
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -552
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -16
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -296
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -52
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -38
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -39
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -299
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +0 -58
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -129
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -201
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -595
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -175
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -225
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -358
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -83
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -106
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -75
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -309
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -37
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -364
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -71
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -105
  131. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -40
  132. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -45
  133. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  134. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  135. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  136. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -213
  137. package/gradle/libs.versions.toml +0 -69
  138. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  139. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  140. package/gradle.properties +0 -26
  141. package/gradlew +0 -252
  142. package/gradlew.bat +0 -94
  143. package/ios-demo/README.md +0 -120
  144. package/settings.gradle.kts +0 -64
@@ -1,52 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.foundation.background
4
- import androidx.compose.foundation.layout.*
5
- import androidx.compose.foundation.shape.RoundedCornerShape
6
- import androidx.compose.runtime.Composable
7
- import androidx.compose.ui.Modifier
8
- import androidx.compose.ui.graphics.Color
9
- import androidx.compose.ui.unit.dp
10
- import androidx.compose.ui.zIndex
11
- import vn.momo.kits.components.InputSearch
12
- import vn.momo.kits.components.InputSearchProps
13
- import vn.momo.kits.const.Radius
14
- import vn.momo.kits.const.Spacing
15
-
16
- @Composable
17
- internal fun AnimationSearchInput(
18
- animations: HeaderAnimations,
19
- inputSearchProps: InputSearchProps
20
- ) {
21
- Box(
22
- modifier = Modifier
23
- .fillMaxWidth()
24
- .offset(
25
- x = animations.translateX.dp,
26
- y = animations.translateY.dp
27
- )
28
- ) {
29
- Box(
30
- modifier = Modifier
31
- .height(HEADER_HEIGHT.dp)
32
- .padding(vertical = Spacing.S)
33
- .zIndex(1f)
34
- ) {
35
- Box(
36
- modifier = Modifier
37
- .width(animations.width.dp)
38
- .background(
39
- color = animations.backgroundSearch,
40
- shape = RoundedCornerShape(Radius.XL)
41
- )
42
- ) {
43
- InputSearch(
44
- inputSearchProps = inputSearchProps.copy(
45
- showButtonText = false,
46
- backgroundColor = Color.Transparent
47
- )
48
- )
49
- }
50
- }
51
- }
52
- }
@@ -1,124 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.runtime.Immutable
4
- import androidx.compose.runtime.getValue
5
- import androidx.compose.runtime.mutableStateOf
6
- import androidx.compose.runtime.setValue
7
- import androidx.compose.runtime.staticCompositionLocalOf
8
- import vn.momo.kits.components.TrustBannerData
9
-
10
- @Immutable
11
- data class FeatureFlags(
12
- val showBaseLineDebug: Boolean? = false,
13
- )
14
-
15
- @Immutable
16
- data class DesignSystemConfig(
17
- val trustBanner: TrustBannerData? = null,
18
- val headerBar: String? = null,
19
- val headerGradient: String? = null,
20
- )
21
-
22
- // App-wide holder seeded by the host (same pattern as KitFontScale), so direct NavigationContainer
23
- // callers get the config without passing it. Snapshot state: a config fetched after first frame recomposes.
24
- object KitDesignSystemConfig {
25
- var config by mutableStateOf<DesignSystemConfig?>(null)
26
- private set
27
-
28
- fun update(config: DesignSystemConfig?) {
29
- this.config = config
30
- }
31
- }
32
-
33
- @Immutable
34
- data class MiniAppContext(
35
- val appIcon: String = "",
36
- val appName: Any? = null,
37
- val appId: String = "",
38
- val appCode: String = "",
39
- val description: Any? = null,
40
- val support: Map<String, Any?> = emptyMap(),
41
- val toolkitConfig: Map<String, Any?> = emptyMap(),
42
- val providerId: String = "",
43
- val permissions: List<Map<String, Any>>? = emptyList(),
44
- val features: FeatureFlags? = null,
45
- val scaleSizeMaxRate: Float? = null,
46
- val userScaleRate: Float? = null,
47
- val useOSScaleRate: Boolean? = null,
48
- ) {
49
- companion object {
50
-
51
- fun toMap(context: MiniAppContext?): Map<String, Any?> = mapOf(
52
- "icon" to (context?.appIcon ?: ""),
53
- "name" to context?.appName,
54
- "appId" to (context?.appId ?: ""),
55
- "code" to (context?.appCode ?: ""),
56
- "description" to (context?.description ?: ""),
57
- "support" to (context?.support ?: emptyMap()),
58
- "toolkitConfig" to (context?.toolkitConfig ?: emptyMap()),
59
- "providerId" to (context?.providerId ?: ""),
60
- "permissions" to (context?.permissions ?: emptyList()),
61
- )
62
-
63
- fun merge(parent: MiniAppContext?, child: MiniAppContext?): MiniAppContext? {
64
- if (parent == null && child == null) return null
65
- if (parent == null) return child
66
- if (child == null) return parent
67
-
68
- return MiniAppContext(
69
- appIcon = parent.appIcon.ifBlank { child.appIcon },
70
- appName = parent.appName ?: child.appName,
71
- appId = parent.appId.ifBlank { child.appId },
72
- appCode = parent.appCode.ifBlank { child.appCode },
73
- description = parent.description ?: child.description,
74
- support = mergeMaps(parent.support, child.support),
75
- toolkitConfig = mergeMaps(parent.toolkitConfig, child.toolkitConfig),
76
- providerId = parent.providerId.ifBlank { child.providerId },
77
- permissions = if (!parent.permissions.isNullOrEmpty()) parent.permissions else child.permissions,
78
- features = mergeFeatureFlags(parent.features, child.features),
79
- scaleSizeMaxRate = parent.scaleSizeMaxRate ?: child.scaleSizeMaxRate,
80
- userScaleRate = parent.userScaleRate ?: child.userScaleRate,
81
- useOSScaleRate = parent.useOSScaleRate ?: child.useOSScaleRate,
82
- )
83
- }
84
-
85
- private fun mergeMaps(parent: Map<String, Any?>, child: Map<String, Any?>): Map<String, Any?> {
86
- return child + parent
87
- }
88
-
89
- private fun mergeFeatureFlags(parent: FeatureFlags?, child: FeatureFlags?): FeatureFlags? {
90
- if (parent == null && child == null) return null
91
- if (parent == null) return child
92
- if (child == null) return parent
93
-
94
- return FeatureFlags(
95
- showBaseLineDebug = parent.showBaseLineDebug ?: child.showBaseLineDebug
96
- )
97
- }
98
- }
99
- }
100
-
101
- @Immutable
102
- data class ComponentInformation(
103
- val componentName: String? = null,
104
- val componentId: String? = null,
105
- val params: Map<String,Any?>? = null,
106
- val action: String? = null
107
- )
108
-
109
- var IsShowBaseLineDebug = false
110
-
111
- val LocalContext = staticCompositionLocalOf<MiniAppContext?> {
112
- null
113
- }
114
-
115
- val LocalComponentInformation = staticCompositionLocalOf<ComponentInformation?> {
116
- null
117
- }
118
-
119
- val LocalDesignSystemConfig = staticCompositionLocalOf<DesignSystemConfig?> {
120
- null
121
- }
122
-
123
- @Deprecated("Max font scale is fixed at MAX_FONT_SCALE (1.5); this CompositionLocal is no longer read.")
124
- val ScaleSizeMaxRate = staticCompositionLocalOf<Float?> { null }
@@ -1,183 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.animation.*
4
- import androidx.compose.animation.core.CubicBezierEasing
5
- import androidx.compose.animation.core.animateDpAsState
6
- import androidx.compose.animation.core.tween
7
- import androidx.compose.foundation.ScrollState
8
- import androidx.compose.foundation.background
9
- import androidx.compose.foundation.interaction.MutableInteractionSource
10
- import androidx.compose.foundation.layout.*
11
- import androidx.compose.material3.AlertDialogDefaults.shape
12
- import androidx.compose.material3.FloatingActionButton
13
- import androidx.compose.material3.FloatingActionButtonDefaults
14
- import androidx.compose.runtime.*
15
- import androidx.compose.runtime.saveable.rememberSaveable
16
- import androidx.compose.ui.Alignment
17
- import androidx.compose.ui.Modifier
18
- import androidx.compose.ui.graphics.Color
19
- import androidx.compose.ui.unit.Dp
20
- import androidx.compose.ui.unit.dp
21
- import androidx.compose.ui.zIndex
22
- import kotlinx.coroutines.delay
23
- import kotlinx.coroutines.flow.MutableStateFlow
24
- import kotlinx.coroutines.flow.collectLatest
25
- import kotlinx.coroutines.launch
26
- import vn.momo.kits.components.Icon
27
- import vn.momo.kits.components.Text
28
- import vn.momo.kits.const.Typography
29
- import kotlin.time.Duration.Companion.milliseconds
30
-
31
- enum class FABSize {
32
- SMALL,
33
- DEFAULT,
34
- }
35
-
36
- enum class FABPosition {
37
- END,
38
- CENTER,
39
- }
40
-
41
- data class FabProps(
42
- val icon: String,
43
- val iconColor: Color? = null,
44
- val label: String? = null,
45
- val onClick: () -> Unit,
46
- val size: FABSize = FABSize.DEFAULT,
47
- val bottom: Dp? = null,
48
- val scrollState: ScrollState? = null,
49
- val position: FABPosition? = FABPosition.END,
50
- )
51
-
52
- @Deprecated("Use vn.momo.kits.navigation.FloatingButton instead", ReplaceWith("vn.momo.kits.navigation.FloatingButton"))
53
- @Composable
54
- internal fun FloatingButton(
55
- scrollPosition: Int,
56
- bottom: Dp,
57
- onClick: () -> Unit,
58
- containerColor: Color,
59
- contentColor: Color = containerColor,
60
- icon: String,
61
- iconColor: Color? = null,
62
- text: String? = null,
63
- elevation: androidx.compose.material3.FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(
64
- 4.dp,
65
- 4.dp,
66
- 4.dp,
67
- 4.dp
68
- ),
69
- size: FABSize = FABSize.DEFAULT,
70
- position: FABPosition = FABPosition.END,
71
- keyboardSize: Dp = 0.dp,
72
- ) {
73
- val scrollPositionStateFlow = remember { MutableStateFlow(scrollPosition) }
74
- var lastScrollPosition by rememberSaveable { mutableStateOf(0) }
75
- val coroutineScope = rememberCoroutineScope()
76
- var isExpanded by rememberSaveable { mutableStateOf(false) }
77
-
78
- val startPadding = if (isExpanded) 12.dp else 0.dp
79
- val endPadding = if (isExpanded) 12.dp else 0.dp
80
- val widthIn = if ((size === FABSize.SMALL)) 36.dp else 48.dp
81
-
82
-
83
- val width = animateDpAsState(
84
- targetValue = if (isExpanded && text != null) 80.dp else widthIn,
85
- animationSpec = tween(
86
- durationMillis = 200,
87
- easing = CubicBezierEasing(0.2f, 0.2f, 0.2f, 0.2f),
88
- )
89
- )
90
-
91
- LaunchedEffect(text) {
92
- if (text != null) {
93
- coroutineScope.launch {
94
- scrollPositionStateFlow
95
- .collectLatest { debouncedScrollPosition ->
96
- isExpanded = debouncedScrollPosition > lastScrollPosition
97
- delay(300.milliseconds)
98
- lastScrollPosition = debouncedScrollPosition
99
-
100
- }
101
- }
102
- }
103
- }
104
-
105
- LaunchedEffect(scrollPosition) {
106
- scrollPositionStateFlow.value = scrollPosition
107
- }
108
-
109
- Box(
110
- Modifier
111
- .fillMaxSize()
112
- .padding(end = 12.dp, bottom = bottom)
113
- .offset(y = -keyboardSize)
114
- .background(Color.Transparent)
115
- .zIndex(10f),
116
- contentAlignment = if (position == FABPosition.END) Alignment.BottomEnd else Alignment.BottomCenter,
117
- ) {
118
- FloatingActionButton(
119
- onClick = onClick,
120
- shape = shape,
121
- containerColor = containerColor,
122
- contentColor = contentColor,
123
- elevation = elevation,
124
- interactionSource = remember { MutableInteractionSource() },
125
- modifier = Modifier
126
- .sizeIn(minWidth = width.value)
127
- .height(widthIn)
128
- ) {
129
- Row(
130
- modifier = Modifier.padding(start = startPadding, end = endPadding),
131
- verticalAlignment = Alignment.CenterVertically,
132
- horizontalArrangement = if (isExpanded) Arrangement.Start else Arrangement.Center
133
- ) {
134
- Icon(
135
- icon,
136
- size = if (size === FABSize.SMALL) 12.dp else 24.dp,
137
- color = iconColor ?: Color.White
138
- )
139
- AnimatedVisibility(
140
- visible = isExpanded,
141
- enter = ExtendedFabExpandAnimation,
142
- exit = ExtendedFabCollapseAnimation,
143
- ) {
144
- Row {
145
- Spacer(Modifier.width(12.dp))
146
- Text(
147
- text ?: "",
148
- color = Color.White,
149
- style = Typography.actionDefaultBold
150
- )
151
- }
152
- }
153
- }
154
- }
155
- }
156
- }
157
-
158
- private val ExtendedFabCollapseAnimation = fadeOut(
159
- animationSpec = tween(
160
- durationMillis = 800,
161
- easing = CubicBezierEasing(0.0f, 0.0f, 1.0f, 1.0f),
162
- )
163
- ) + shrinkHorizontally(
164
- animationSpec = tween(
165
- durationMillis = 500,
166
- easing = CubicBezierEasing(0.2f, 0.0f, 0.0f, 1.0f),
167
- ),
168
- shrinkTowards = Alignment.Start,
169
- )
170
-
171
- private val ExtendedFabExpandAnimation = fadeIn(
172
- animationSpec = tween(
173
- durationMillis = 200,
174
- delayMillis = 100,
175
- easing = CubicBezierEasing(0.0f, 0.0f, 1.0f, 1.0f),
176
- ),
177
- ) + expandHorizontally(
178
- animationSpec = tween(
179
- durationMillis = 500,
180
- easing = CubicBezierEasing(0.2f, 0.0f, 0.0f, 1.0f),
181
- ),
182
- expandFrom = Alignment.Start,
183
- )
@@ -1,207 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.animation.core.animateFloatAsState
4
- import androidx.compose.foundation.background
5
- import androidx.compose.foundation.border
6
- import androidx.compose.foundation.clickable
7
- import androidx.compose.foundation.layout.*
8
- import androidx.compose.foundation.shape.RoundedCornerShape
9
- import androidx.compose.runtime.*
10
- import androidx.compose.ui.Alignment
11
- import androidx.compose.ui.Modifier
12
- import androidx.compose.ui.graphics.Color
13
- import androidx.compose.ui.graphics.graphicsLayer
14
- import androidx.compose.ui.text.style.TextAlign
15
- import androidx.compose.ui.unit.Dp
16
- import androidx.compose.ui.unit.dp
17
- import androidx.compose.ui.zIndex
18
- import kotlinx.coroutines.flow.distinctUntilChanged
19
- import kotlinx.coroutines.flow.map
20
- import vn.momo.kits.components.Icon
21
- import vn.momo.kits.components.InputSearch
22
- import vn.momo.kits.components.InputSearchProps
23
- import vn.momo.kits.const.AppTheme
24
- import vn.momo.kits.const.Colors
25
- import vn.momo.kits.const.Spacing
26
- import vn.momo.kits.modifier.conditional
27
- import vn.momo.kits.modifier.setAutomationId
28
- import vn.momo.kits.utils.getAppStatusBarHeight
29
-
30
- data class HeaderColor(val tintIconColor: Color, val backgroundButton: Color, val borderColor: Color)
31
- fun getHeaderColor(animatedHeader: AnimatedHeader?, opacity: Float, tintColor: Color?, defaultColor: Color): HeaderColor{
32
- return if(animatedHeader !== null)
33
- if (opacity == 1f || !animatedHeader.isSurface)
34
- HeaderColor(
35
- tintIconColor = Colors.black_17,
36
- backgroundButton = Colors.black_01.copy(alpha = 0.6f),
37
- borderColor = Colors.black_20.copy(alpha = 0.2f)
38
- )
39
- else
40
- HeaderColor(
41
- tintIconColor = Colors.black_01,
42
- backgroundButton = Colors.black_20.copy(alpha = 0.6f),
43
- borderColor = Color.Transparent
44
- )
45
- else
46
- if (tintColor == Colors.black_01)
47
- HeaderColor(
48
- tintIconColor = tintColor,
49
- backgroundButton = Colors.black_20.copy(alpha = 0.6f),
50
- borderColor = Colors.black_01.copy(alpha = 0.2f)
51
- )
52
- else
53
- HeaderColor(
54
- tintIconColor = tintColor ?: defaultColor,
55
- backgroundButton = Colors.black_01.copy(alpha = 0.6f),
56
- borderColor = Colors.black_20.copy(alpha = 0.2f)
57
- )
58
- }
59
-
60
- @Deprecated("Use vn.momo.kits.navigation.component.Header instead", ReplaceWith("vn.momo.kits.navigation.component.Header"))
61
- @Composable
62
- internal fun Header(
63
- headerType: HeaderType = HeaderType.DEFAULT,
64
- titlePosition: TitlePosition,
65
- title: String,
66
- headerRight: @Composable (() -> Unit)? = null,
67
- goBack: (() -> Unit)? = null,
68
- opacity: Float = 1f,
69
- animatedHeader: AnimatedHeader? = null,
70
- scrollState: Int = 0,
71
- inputSearchProps: InputSearchProps? = null,
72
- headerRightWidth: Dp = 0.dp,
73
- useAnimationSearch: Boolean = false,
74
- tintColor: Color? = null
75
- ) {
76
- val statusBarHeight = getAppStatusBarHeight()
77
- val color = getHeaderColor(animatedHeader, opacity, tintColor, AppTheme.current.colors.text.default)
78
- val tintIconColor = color.tintIconColor
79
- val backgroundButton = color.backgroundButton
80
- val borderColor = color.borderColor
81
-
82
- var colorFraction by remember { mutableStateOf(0f) }
83
-
84
- LaunchedEffect(scrollState) {
85
- snapshotFlow { scrollState }
86
- .map { (it / 50f).coerceIn(0f, 1f) }
87
- .distinctUntilChanged()
88
- .collect { fraction -> colorFraction = fraction }
89
- }
90
- val animations = useHeaderSearchAnimation(
91
- opacityAni = opacity,
92
- scrollState = scrollState,
93
- headerRightWidth = headerRightWidth,
94
- isBack = goBack != null
95
- )
96
-
97
- val backgroundSearch = animateColor(
98
- Colors.black_01,
99
- AppTheme.current.colors.background.default,
100
- colorFraction
101
- )
102
-
103
- val searchAnimationEnable =
104
- inputSearchProps != null && useAnimationSearch && headerType == HeaderType.EXTENDED
105
- val animatedAlpha by animateFloatAsState(targetValue = opacity, label = "BackgroundAlpha")
106
-
107
- if (headerType != HeaderType.NONE) {
108
- BoxWithConstraints(
109
- Modifier.height(statusBarHeight + HEADER_HEIGHT.dp)
110
- .fillMaxWidth()
111
- .conditional(animatedHeader !== null) { background(Color.White.copy(alpha = animatedAlpha)) }
112
- .zIndex(10f),
113
- contentAlignment = Alignment.BottomCenter
114
- ) {
115
- Row(
116
- modifier = Modifier.height(HEADER_HEIGHT.dp)
117
- .fillMaxWidth()
118
- .padding(horizontal = Spacing.M),
119
- verticalAlignment = Alignment.CenterVertically,
120
- horizontalArrangement = Arrangement.SpaceBetween
121
- ) {
122
- Box {
123
- if (goBack != null) {
124
- Box(
125
- modifier = Modifier
126
- .size(28.dp)
127
- .then(
128
- Modifier.border(
129
- 0.2.dp,
130
- borderColor,
131
- RoundedCornerShape(100)
132
- )
133
- )
134
- .background(
135
- backgroundButton,
136
- RoundedCornerShape(100)
137
- )
138
- .clickable(
139
- onClick = goBack
140
- )
141
- .padding(Spacing.XS)
142
- .setAutomationId("btn_navigation_back"),
143
- contentAlignment = Alignment.Center
144
- ) {
145
- Icon(
146
- source = "arrow-back",
147
- color = tintIconColor,
148
- size = 20.dp,
149
- )
150
- }
151
- }
152
- }
153
-
154
- if (useAnimationSearch || inputSearchProps == null) {
155
- if(headerRight == null){
156
- HeaderRight(opacity = opacity, animatedHeader = animatedHeader, tintColor = tintColor)
157
- } else {
158
- headerRight.invoke()
159
- }
160
- }
161
- }
162
-
163
- // Title
164
- Row(
165
- modifier = Modifier.height(HEADER_HEIGHT.dp)
166
- .fillMaxWidth()
167
- .padding(horizontal = Spacing.M),
168
- verticalAlignment = Alignment.CenterVertically,
169
- ) {
170
- if (goBack != null && titlePosition == TitlePosition.LEFT) {
171
- Spacer(Modifier.width(40.dp))
172
- }
173
- if (inputSearchProps != null && !useAnimationSearch) {
174
- InputSearch(inputSearchProps = inputSearchProps.copy(backgroundColor = backgroundSearch))
175
- } else {
176
- Box(
177
- Modifier.weight(1f).graphicsLayer {
178
- alpha = if (useAnimationSearch) {
179
- 1f - (opacity)
180
- } else {
181
- 1f
182
- }
183
- },
184
- contentAlignment = if (titlePosition == TitlePosition.LEFT) Alignment.TopStart else Alignment.Center
185
- ) {
186
- HeaderTitle(
187
- title = title,
188
- color = tintIconColor,
189
- modifier = Modifier
190
- .setAutomationId("title_navigation_header")
191
- .fillMaxWidth(fraction = if(titlePosition == TitlePosition.LEFT) 0.7f else 0.5f)
192
- ,
193
- textAlign = if(titlePosition == TitlePosition.LEFT) TextAlign.Start else TextAlign.Center
194
- )
195
- }
196
- }
197
- }
198
-
199
- if (searchAnimationEnable) {
200
- AnimationSearchInput(
201
- animations = animations,
202
- inputSearchProps = inputSearchProps
203
- )
204
- }
205
- }
206
- }
207
- }
@@ -1,39 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.animation.core.animateFloatAsState
4
- import androidx.compose.foundation.layout.Box
5
- import androidx.compose.foundation.layout.fillMaxWidth
6
- import androidx.compose.foundation.layout.height
7
- import androidx.compose.runtime.Composable
8
- import androidx.compose.runtime.getValue
9
- import androidx.compose.ui.Modifier
10
- import androidx.compose.ui.graphics.graphicsLayer
11
- import androidx.compose.ui.unit.dp
12
- import vn.momo.kits.components.Image
13
-
14
- @Deprecated("Use vn.momo.kits.navigation.component.Header instead", ReplaceWith("vn.momo.kits.navigation.component.Header"))
15
- @Composable
16
- internal fun HeaderAnimated(image: String, scrollState: Int = 0) {
17
- // Scale animation
18
- val scale by animateFloatAsState(
19
- targetValue = when {
20
- scrollState < 0 -> (-(scrollState / 300f)).coerceIn(1f, 4f)
21
- scrollState.toFloat() in 0f..300f -> 1f
22
- else -> 1f
23
- }
24
- )
25
-
26
- // Translation Y animation
27
-
28
- Box(modifier = Modifier.fillMaxWidth().height(200.dp)
29
- .graphicsLayer {
30
- scaleX = scale
31
- scaleY = scale
32
- }) {
33
- if (image.isEmpty()) return
34
- Image(
35
- source = image,
36
- modifier = Modifier.fillMaxWidth().height(200.dp)
37
- )
38
- }
39
- }
@@ -1,86 +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.foundation.layout.Box
6
- import androidx.compose.foundation.layout.fillMaxWidth
7
- import androidx.compose.runtime.Composable
8
- import androidx.compose.runtime.getValue
9
- import androidx.compose.ui.Modifier
10
- import androidx.compose.ui.graphics.Color
11
- import vn.momo.kits.const.AppTheme
12
- import vn.momo.kits.utils.getAppStatusBarHeight
13
-
14
- enum class TitlePosition {
15
- LEFT, CENTER,
16
- }
17
-
18
- enum class AnimatedHeaderRatio(val value: Float){
19
- RATIO_16_9(16f / 9f),
20
- RATIO_1_1(1f),
21
- RATIO_3_2(3f / 2f)
22
- }
23
-
24
- data class AnimatedHeader(
25
- val aspectRatio: AnimatedHeaderRatio = AnimatedHeaderRatio.RATIO_16_9,
26
- val isSurface: Boolean = true,
27
- val composable: @Composable (scrollState: Int) -> Unit = {}
28
- )
29
-
30
- internal fun animateColor(start: Color, stop: Color, fraction: Float): Color {
31
- return Color(
32
- red = start.red + fraction * (stop.red - start.red),
33
- green = start.green + fraction * (stop.green - start.green),
34
- blue = start.blue + fraction * (stop.blue - start.blue),
35
- alpha = start.alpha + fraction * (stop.alpha - start.alpha)
36
- )
37
- }
38
-
39
- @Deprecated("Use vn.momo.kits.navigation.component.HeaderBackground instead", ReplaceWith("vn.momo.kits.navigation.component.HeaderBackground"))
40
- @Composable
41
- internal fun HeaderBackground(
42
- headerType: HeaderType = HeaderType.DEFAULT,
43
- scrollState: Int,
44
- headerTransparent: Boolean = false,
45
- ) {
46
- val statusBarHeight = getAppStatusBarHeight()
47
-
48
- val opacityAni by animateFloatAsState(
49
- targetValue = (1 - (scrollState / HEADER_HEIGHT * 1f)).coerceIn(0f, 1f),
50
- )
51
-
52
- val backgroundColor by animateColorAsState(
53
- targetValue = if (headerTransparent) {
54
- Color.Transparent
55
- } else {
56
- animateColor(
57
- Color.Transparent,
58
- AppTheme.current.colors.background.surface,
59
- opacityAni
60
- )
61
- }
62
- )
63
-
64
- when (headerType) {
65
- HeaderType.DEFAULT -> {
66
- HeaderDefault(
67
- opacityAni = opacityAni,
68
- statusBarHeight = statusBarHeight,
69
- backgroundColor = backgroundColor,
70
- headerTransparent = headerTransparent
71
- )
72
- }
73
-
74
- HeaderType.EXTENDED -> {
75
- HeaderExtended(
76
- opacityAni = opacityAni,
77
- statusBarHeight = statusBarHeight,
78
- backgroundColor = backgroundColor,
79
- )
80
- }
81
-
82
- else -> {
83
- Box(modifier = Modifier.fillMaxWidth())
84
- }
85
- }
86
- }