@momo-kits/native-kits 0.167.1-duo.18-debug → 0.167.1-duo.19

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 (163) hide show
  1. package/CLAUDE.md +5 -3
  2. package/ios/Application/MaxApi.swift +12 -3
  3. package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
  4. package/ios/Layout/GridContext.swift +67 -3
  5. package/ios/Navigation/BottomSheet.swift +30 -4
  6. package/ios/Navigation/BottomTab/BottomTab.swift +0 -2
  7. package/ios/Navigation/Component/SnackBar.swift +0 -1
  8. package/ios/Navigation/HostBackGestureBridge.swift +27 -6
  9. package/ios/Navigation/ModalScreen.swift +0 -1
  10. package/ios/Navigation/Navigation.swift +14 -0
  11. package/ios/Navigation/NavigationContainer.swift +26 -56
  12. package/ios/Navigation/Navigator.swift +102 -165
  13. package/ios/Navigation/StackScreen.swift +19 -2
  14. package/ios/Navigation/StackTransition.swift +400 -0
  15. package/ios/Navigation/SwipeBackHaptic.swift +33 -0
  16. package/package.json +1 -1
  17. package/build.gradle.kts +0 -11
  18. package/compose/build.gradle.kts +0 -204
  19. package/compose/build.gradle.kts.backup +0 -204
  20. package/compose/compose.podspec +0 -47
  21. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  22. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  23. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  24. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  25. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -153
  26. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/ReservedRegions.android.kt +0 -6
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -916
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -81
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -357
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -115
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -86
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -189
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -478
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -265
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -235
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -265
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -361
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -108
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -308
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -330
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -207
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -92
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -560
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -86
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -501
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -236
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -180
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -20
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -194
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -283
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -54
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -50
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +0 -309
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -41
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -338
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +0 -58
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -137
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -205
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -713
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -218
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -231
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoBarCompression.kt +0 -98
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoTabBar.kt +0 -312
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -447
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -103
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -106
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -74
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -379
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -39
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -363
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +0 -192
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -133
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -74
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ReservedRegions.kt +0 -13
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -118
  149. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -78
  150. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -45
  151. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  152. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  153. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  154. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -217
  155. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/ReservedRegions.ios.kt +0 -94
  156. package/gradle/libs.versions.toml +0 -69
  157. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  158. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  159. package/gradle.properties +0 -26
  160. package/gradlew +0 -252
  161. package/gradlew.bat +0 -94
  162. package/ios-demo/README.md +0 -120
  163. package/settings.gradle.kts +0 -64
@@ -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
- }
@@ -1,76 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.foundation.background
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.ui.Modifier
9
- import androidx.compose.ui.draw.alpha
10
- import androidx.compose.ui.geometry.Offset
11
- import androidx.compose.ui.graphics.Brush
12
- import androidx.compose.ui.graphics.Color
13
- import androidx.compose.ui.layout.ContentScale
14
- import androidx.compose.ui.platform.LocalDensity
15
- import androidx.compose.ui.unit.Dp
16
- import androidx.compose.ui.unit.dp
17
- import vn.momo.kits.components.Image
18
- import vn.momo.kits.components.Options
19
- import vn.momo.kits.const.AppTheme
20
- import vn.momo.kits.utils.bottomBorder
21
-
22
- @Deprecated("Use vn.momo.kits.navigation.component.Header instead", ReplaceWith("vn.momo.kits.navigation.component.Header"))
23
- @Composable
24
- internal fun HeaderDefault(
25
- opacityAni: Float,
26
- statusBarHeight: Dp,
27
- backgroundColor: Color?,
28
- headerTransparent: Boolean = false
29
- ) {
30
- val height = statusBarHeight + HEADER_HEIGHT.dp
31
- Box(
32
- modifier = Modifier.fillMaxWidth().height(height)
33
- .background(if(headerTransparent && backgroundColor != null) backgroundColor else AppTheme.current.colors.background.surface)
34
- .bottomBorder(
35
- strokeWidth = 1.dp,
36
- color = if(headerTransparent && backgroundColor != null) backgroundColor else AppTheme.current.colors.border.default
37
- )
38
- ) {
39
- Box(
40
- modifier = Modifier
41
- .height(height)
42
- .fillMaxWidth()
43
- .alpha(opacityAni)
44
- .background(
45
- if (headerTransparent)
46
- Brush.linearGradient(
47
- colors = listOf(
48
- Color.Transparent,
49
- Color.Transparent,
50
- ),
51
- start = Offset(0f, 0f),
52
- end = Offset(0f, with(LocalDensity.current) { 154.dp.toPx() })
53
- )
54
- else
55
- Brush.linearGradient(
56
- colors = listOf(
57
- Color(0xFFFDCADE),
58
- Color(0x00FDCADE)
59
- ),
60
- start = Offset(0f, 0f),
61
- end = Offset(0f, with(LocalDensity.current) { 154.dp.toPx() })
62
- )
63
- )
64
- )
65
- if (AppTheme.current.assets.headerBackground != null) {
66
- Image(
67
- loading = false,
68
- source = AppTheme.current.assets.headerBackground!!,
69
- modifier = Modifier.fillMaxWidth().height(height),
70
- options = Options(
71
- contentScale = ContentScale.FillWidth
72
- )
73
- )
74
- }
75
- }
76
- }
@@ -1,76 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.foundation.background
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.ui.Modifier
9
- import androidx.compose.ui.draw.alpha
10
- import androidx.compose.ui.geometry.Offset
11
- import androidx.compose.ui.graphics.Brush
12
- import androidx.compose.ui.graphics.Color
13
- import androidx.compose.ui.layout.ContentScale
14
- import androidx.compose.ui.platform.LocalDensity
15
- import androidx.compose.ui.unit.Dp
16
- import androidx.compose.ui.unit.dp
17
- import vn.momo.kits.components.Image
18
- import vn.momo.kits.components.Options
19
- import vn.momo.kits.const.AppTheme
20
- import vn.momo.kits.utils.bottomBorder
21
-
22
- @Deprecated("Use vn.momo.kits.navigation.component.Header instead", ReplaceWith("vn.momo.kits.navigation.component.Header"))
23
- @Composable
24
- internal fun HeaderExtended(
25
- opacityAni: Float,
26
- statusBarHeight: Dp,
27
- backgroundColor: Color
28
- ) {
29
- Box(
30
- modifier = Modifier
31
- .fillMaxWidth()
32
- .height(154.dp)
33
- .alpha(opacityAni)
34
- .background(
35
- Brush.linearGradient(
36
- colors = listOf(
37
- Color(0xFFFDCADE),
38
- Color(0x00FDCADE)
39
- ),
40
- start = Offset(0f, 0f),
41
- end = Offset(0f, with(LocalDensity.current) { 154.dp.toPx() })
42
- )
43
- )
44
- ) {
45
- if (AppTheme.current.assets.headerBackground != null) {
46
- Box(
47
- modifier = Modifier
48
- .fillMaxWidth()
49
- .background(backgroundColor)
50
- ) {
51
- Image(
52
- loading = false,
53
- source = AppTheme.current.assets.headerBackground!!,
54
- modifier = Modifier.fillMaxWidth().height(154.dp),
55
- options = Options(
56
- contentScale = ContentScale.FillWidth
57
- )
58
- )
59
- }
60
- }
61
- }
62
-
63
- Box(
64
- modifier = Modifier
65
- .fillMaxWidth()
66
- .alpha(1f - opacityAni)
67
- .height(statusBarHeight + HEADER_HEIGHT.dp)
68
- .background(
69
- AppTheme.current.colors.background.surface
70
- )
71
- .bottomBorder(
72
- strokeWidth = 1.dp,
73
- color = AppTheme.current.colors.border.default
74
- )
75
- )
76
- }