@momo-kits/native-kits 0.154.1-beta.9 → 0.154.2-test.2

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 (118) hide show
  1. package/README.md +175 -5
  2. package/ios/native-kits.podspec +18 -16
  3. package/package.json +2 -4
  4. package/CODE_OF_CONDUCT.md +0 -133
  5. package/CONTRIBUTING.md +0 -114
  6. package/LICENSE +0 -20
  7. package/build.gradle.kts +0 -32
  8. package/compose/MoMoComposeKits.podspec +0 -54
  9. package/compose/build.gradle.kts +0 -149
  10. package/compose/src/androidMain/AndroidManifest.xml +0 -2
  11. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -105
  12. package/compose/src/commonMain/composeResources/files/lottie_circle_loader.json +0 -1
  13. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  14. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  15. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  16. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  17. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  18. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  19. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  20. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  21. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  22. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  23. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  24. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  25. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  26. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -57
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -102
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -201
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -222
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -48
  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 -305
  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 -715
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -114
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -404
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -78
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -27
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -334
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -345
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -90
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -133
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -69
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -143
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -179
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -111
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -393
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -164
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -234
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -226
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -221
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -246
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -233
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -364
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -50
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -34
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -85
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -33
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -338
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -95
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -64
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -89
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -86
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -94
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -208
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -170
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -199
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -237
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -191
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -13
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -189
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -285
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -2
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -35
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -2
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -59
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -68
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -49
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -232
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -111
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -94
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -163
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -302
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -483
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -169
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -215
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -180
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -251
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -80
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -306
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -31
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -385
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -125
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -38
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -62
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -88
  112. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -144
  113. package/gradle.properties +0 -19
  114. package/gradlew +0 -240
  115. package/gradlew.bat +0 -91
  116. package/ios/Theme.md +0 -18
  117. package/local.properties +0 -8
  118. package/settings.gradle.kts +0 -25
@@ -1,114 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.runtime.Composable
4
- import androidx.compose.runtime.CompositionLocalProvider
5
- import androidx.compose.runtime.LaunchedEffect
6
- import androidx.compose.runtime.getValue
7
- import androidx.compose.runtime.mutableStateOf
8
- import androidx.compose.runtime.remember
9
- import androidx.compose.runtime.setValue
10
- import androidx.compose.runtime.staticCompositionLocalOf
11
- import androidx.compose.ui.unit.Dp
12
- import vn.momo.kits.const.AppStatusBar
13
- import vn.momo.kits.const.AppTheme
14
- import vn.momo.kits.const.Theme
15
- import vn.momo.kits.const.ThemeAssets
16
- import vn.momo.kits.const.defaultTheme
17
- import vn.momo.kits.platform.getStatusBarHeight
18
-
19
- @Deprecated("Use IMaxApi instead", ReplaceWith("IMaxApi"))
20
- interface ComposeApi {
21
- fun request(funcName: String, params: Any?): String
22
- fun request(funcName: String, params: Any?, onResponse: ((String) -> Unit)?): String
23
- fun requestCallback(funcName: String, params: Any?, onResponse: ((String) -> Unit)?)
24
- fun removeCallback(id: String)
25
- }
26
-
27
- class Navigator {
28
- fun push(content: @Composable () -> Unit) {
29
- //implement
30
- }
31
-
32
- fun present(content: @Composable () -> Unit) {
33
- //implement
34
- }
35
-
36
- fun reset(content: @Composable () -> Unit) {
37
- //implement
38
- }
39
-
40
- fun pop() {
41
- //implement
42
- }
43
-
44
- fun replace(content: @Composable () -> Unit) {
45
- //implement
46
- }
47
-
48
- fun popToTop() {
49
- //implement
50
- }
51
-
52
- fun showModal(
53
- onClose: () -> Unit = {},
54
- canBackgroundClose: Boolean = true,
55
- content: @Composable () -> Unit,
56
- ) {
57
- //implement
58
- }
59
-
60
- fun showBottomSheet(content: @Composable () -> Unit) {
61
- //implement
62
- }
63
- }
64
-
65
-
66
-
67
-
68
- @Deprecated("Use LocalApi instead", ReplaceWith("LocalApi"))
69
- val PlatformApi = staticCompositionLocalOf<Any?> { null }
70
-
71
-
72
- @Deprecated("Use NavigationContainer instead", ReplaceWith("NavigationContainer"))
73
- @Composable
74
- fun ApplicationContainer(
75
- theme: Theme = defaultTheme,
76
- composeApi: ComposeApi? = null,
77
- statusBarHeight: Dp? = AppStatusBar.current,
78
- applicationContext: MiniAppContext? = null,
79
- config: KitConfig? = null,
80
- language: String? = null,
81
- isWhiteList: Boolean = false,
82
- content: @Composable () -> Unit,
83
- ) {
84
- var appTheme by remember { mutableStateOf(theme) }
85
-
86
- LaunchedEffect(Unit) {
87
- try {
88
- val headerBar = config?.headerBar
89
- if (headerBar != null && appTheme.assets.headerBackground == null) {
90
- appTheme = appTheme.copy(
91
- assets = ThemeAssets(
92
- headerBackground = headerBar
93
- )
94
- )
95
- }
96
- } catch (e: Exception) {
97
- print("@@ == NavigationContainer get config error $e")
98
- }
99
- }
100
-
101
- val appStatusBarHeight = statusBarHeight ?: getStatusBarHeight()
102
-
103
- CompositionLocalProvider(
104
- AppTheme provides appTheme,
105
- PlatformApi provides composeApi,
106
- AppStatusBar provides appStatusBarHeight,
107
- ApplicationContext provides applicationContext,
108
- AppConfig provides config,
109
- AppLanguage provides language,
110
- ) {
111
- content()
112
- }
113
-
114
- }
@@ -1,404 +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.Arrangement
10
- import androidx.compose.foundation.layout.Box
11
- import androidx.compose.foundation.layout.Column
12
- import androidx.compose.foundation.layout.Spacer
13
- import androidx.compose.foundation.layout.WindowInsets
14
- import androidx.compose.foundation.layout.asPaddingValues
15
- import androidx.compose.foundation.layout.aspectRatio
16
- import androidx.compose.foundation.layout.fillMaxSize
17
- import androidx.compose.foundation.layout.fillMaxWidth
18
- import androidx.compose.foundation.layout.height
19
- import androidx.compose.foundation.layout.ime
20
- import androidx.compose.foundation.layout.imePadding
21
- import androidx.compose.foundation.layout.offset
22
- import androidx.compose.foundation.layout.padding
23
- import androidx.compose.foundation.layout.systemBars
24
- import androidx.compose.foundation.rememberScrollState
25
- import androidx.compose.foundation.verticalScroll
26
- import androidx.compose.runtime.Composable
27
- import androidx.compose.runtime.CompositionLocalProvider
28
- import androidx.compose.runtime.DisposableEffect
29
- import androidx.compose.runtime.LaunchedEffect
30
- import androidx.compose.runtime.getValue
31
- import androidx.compose.runtime.mutableStateOf
32
- import androidx.compose.runtime.remember
33
- import androidx.compose.runtime.setValue
34
- import androidx.compose.runtime.staticCompositionLocalOf
35
- import androidx.compose.ui.Alignment
36
- import androidx.compose.ui.Modifier
37
- import androidx.compose.ui.graphics.Color
38
- import androidx.compose.ui.input.pointer.pointerInput
39
- import androidx.compose.ui.layout.LayoutCoordinates
40
- import androidx.compose.ui.layout.onGloballyPositioned
41
- import androidx.compose.ui.platform.LocalDensity
42
- import androidx.compose.ui.platform.LocalSoftwareKeyboardController
43
- import androidx.compose.ui.unit.Dp
44
- import androidx.compose.ui.unit.IntOffset
45
- import androidx.compose.ui.unit.dp
46
- import androidx.compose.ui.unit.min
47
- import androidx.compose.ui.zIndex
48
- import kotlinx.coroutines.CoroutineScope
49
- import kotlinx.coroutines.Dispatchers
50
- import kotlinx.coroutines.SupervisorJob
51
- import kotlinx.coroutines.cancel
52
- import kotlinx.coroutines.delay
53
- import kotlinx.coroutines.launch
54
- import vn.momo.kits.components.InputSearchProps
55
- import vn.momo.kits.const.AppNavigationBar
56
- import vn.momo.kits.const.AppTheme
57
- import vn.momo.kits.const.Colors
58
- import vn.momo.kits.const.Spacing
59
- import vn.momo.kits.modifier.conditional
60
- import vn.momo.kits.modifier.shadow
61
- import vn.momo.kits.navigation.component.SnackBar
62
- import vn.momo.kits.platform.getAndroidBuildVersion
63
- import vn.momo.kits.utils.getAppStatusBarHeight
64
-
65
- enum class HeaderType {
66
- DEFAULT,
67
- EXTENDED,
68
- NONE
69
- }
70
-
71
- const val HEADER_HEIGHT = 52
72
-
73
- @Deprecated("Use NavigationContainer(StackScreen) instead", ReplaceWith("NavigationContainer(StackScreen)"))
74
- @Composable
75
- fun Screen(
76
- backgroundColor: Color? = null,
77
- tintColor: Color? = null,
78
- headerTransparent: Boolean = false,
79
- fullScreenContent: Boolean = false,
80
- isBack: Boolean = true,
81
- headerType: HeaderType = HeaderType.DEFAULT,
82
- verticalArrangement: Arrangement.Vertical = Arrangement.Top,
83
- horizontalAlignment: Alignment.Horizontal = Alignment.Start,
84
- title: String = "Stack",
85
- titlePosition: TitlePosition = TitlePosition.LEFT,
86
- goBack: (() -> Unit)? = null,
87
- scrollable: Boolean = true,
88
- scrollState: ScrollState = rememberScrollState(),
89
- onContentLayout: ((LayoutCoordinates) -> Unit)? = null,
90
- useAvoidKeyboard: Boolean = true,
91
- footer: @Composable (() -> Unit)? = null,
92
- headerRight: @Composable (() -> Unit)? = null,
93
- fabProps: FabProps? = null,
94
- animatedHeader: AnimatedHeader? = null,
95
- layoutOffset: Dp = 56.dp,
96
- inputSearchProps: InputSearchProps? = null,
97
- useAnimationSearch: Boolean = false,
98
- headerRightWidth: Dp = 0.dp,
99
- content: @Composable () -> Unit,
100
- ) {
101
- val statusBarHeight = getAppStatusBarHeight()
102
- val keyboardController = LocalSoftwareKeyboardController.current
103
-
104
- val isKeyboardVisible = isKeyboardVisible()
105
- val indicator = WindowInsets.systemBars.asPaddingValues().calculateBottomPadding()
106
- val bottomPadding = min(indicator, if (isKeyboardVisible) 0.dp else 21.dp)
107
-
108
- val headerHeight = if (animatedHeader !== null)
109
- with(LocalDensity.current) { layoutOffset.roundToPx() }
110
- else HEADER_HEIGHT
111
- val opacity by animateFloatAsState(
112
- targetValue = ((scrollState.value.toFloat() / headerHeight)).coerceIn(0f, 1f),
113
- )
114
-
115
- val headerAnimated =
116
- @Composable {
117
- Box(
118
- modifier = Modifier
119
- .fillMaxWidth()
120
- .aspectRatio(animatedHeader?.aspectRatio?.value ?: AnimatedHeaderRatio.RATIO_16_9.value)
121
- ) {
122
- animatedHeader?.composable?.invoke(scrollState.value)
123
- }
124
- }
125
- val helper = remember { ScreenHelper() }
126
-
127
- DisposableEffect(Unit) {
128
- onDispose { helper.dispose() }
129
- }
130
-
131
- CompositionLocalProvider(
132
- LocalScreenHelper provides helper
133
- ) {
134
- Box(
135
- Modifier.fillMaxSize()
136
- .background(backgroundColor ?: AppTheme.current.colors.background.default)
137
- .conditional(useAvoidKeyboard && getAndroidBuildVersion() > 29) {
138
- imePadding()
139
- }
140
- ) {
141
- val footerHeightPx = remember { mutableStateOf(0) }
142
-
143
- Box(Modifier.zIndex(1f)) {
144
- if (animatedHeader === null) {
145
- HeaderBackground(
146
- headerType = headerType,
147
- scrollState = scrollState.value,
148
- headerTransparent = headerTransparent
149
- )
150
- }
151
- }
152
-
153
- Box(Modifier.zIndex(5f)) {
154
- Header(
155
- headerType = headerType,
156
- title = title,
157
- titlePosition = titlePosition,
158
- headerRight = headerRight,
159
- headerRightWidth = headerRightWidth,
160
- goBack = goBack,
161
- opacity = opacity,
162
- animatedHeader = animatedHeader,
163
- inputSearchProps = inputSearchProps,
164
- scrollState = scrollState.value,
165
- useAnimationSearch = useAnimationSearch,
166
- tintColor = tintColor
167
- )
168
- }
169
-
170
- Box(Modifier.zIndex(2f).fillMaxSize()){
171
- Column(
172
- modifier = Modifier.fillMaxSize()
173
- .padding( top = when {
174
- animatedHeader != null -> 0.dp
175
- headerType == HeaderType.NONE -> 0.dp
176
- fullScreenContent -> 0.dp
177
- else -> statusBarHeight + HEADER_HEIGHT.dp
178
- })
179
- .pointerInput(Unit) {
180
- detectTapGestures(onTap = {
181
- keyboardController?.hide()
182
- })
183
- }
184
- .zIndex(1f),
185
- ) {
186
-
187
- Column(
188
- modifier = Modifier
189
- .conditional(scrollable) { weight(1f) }
190
- .conditional(onContentLayout != null) {
191
- onGloballyPositioned(onContentLayout ?: {})
192
- }
193
- .conditional(scrollable) { verticalScroll(scrollState) },
194
- verticalArrangement = verticalArrangement,
195
- horizontalAlignment = horizontalAlignment
196
- ) {
197
- Box {
198
- if (animatedHeader !== null) headerAnimated()
199
- Column {
200
- if (animatedHeader !== null) {
201
- Spacer(modifier = Modifier.padding(top = statusBarHeight + HEADER_HEIGHT.dp + layoutOffset))
202
- }
203
-
204
- if (useAnimationSearch && inputSearchProps != null && headerType == HeaderType.EXTENDED) {
205
- Spacer(modifier = Modifier.padding(top = (HEADER_HEIGHT.dp + Spacing.S)))
206
- }
207
- content()
208
- }
209
- }
210
- }
211
-
212
- footer?.let {
213
- val footerHeight = with(LocalDensity.current) { footerHeightPx.value.toDp() }
214
- Spacer(Modifier.height(footerHeight))
215
- }
216
- }
217
- }
218
-
219
- Box(Modifier.zIndex(4f).align(Alignment.BottomCenter)) {
220
- footer?.let {
221
- Footer(
222
- footer = footer,
223
- bottom = bottomPadding,
224
- onFooterMeasured = { footerHeightPx.value = it }
225
- )
226
- }
227
- }
228
-
229
- Column (Modifier.zIndex(6f)) {
230
- if (fabProps != null) {
231
- FloatingButton(
232
- scrollPosition = fabProps.scrollState?.value ?: scrollState.value,
233
- onClick = fabProps.onClick,
234
- containerColor = AppTheme.current.colors.primary,
235
- bottom = fabProps.bottom
236
- ?: if (footer != null) bottomPadding + 76.dp else bottomPadding + 12.dp,
237
- icon = fabProps.icon,
238
- iconColor = fabProps.iconColor,
239
- text = fabProps.label,
240
- size = fabProps.size,
241
- position = fabProps.position ?: FABPosition.END,
242
- )
243
- }
244
- }
245
-
246
- Box(
247
- modifier = Modifier
248
- .align(Alignment.BottomCenter)
249
- .zIndex(3f)
250
- ) {
251
- ScreenSnackBarHost(if (footer == null) 0 else footerHeightPx.value)
252
- }
253
- }
254
- }
255
- }
256
-
257
- @Composable
258
- internal fun isKeyboardVisible(): Boolean {
259
- val ime = WindowInsets.ime
260
- val density = LocalDensity.current
261
- val bottom = ime.getBottom(density)
262
- return bottom > 0
263
- }
264
-
265
- @Composable
266
- fun Footer(
267
- footer: @Composable (() -> Unit)? = null,
268
- bottom: Dp = 0.dp,
269
- onFooterMeasured: ((Int) -> Unit)? = null
270
- ) {
271
- Box(
272
- Modifier
273
- .shadow(
274
- color = Colors.black_20.copy(alpha = 0.05f),
275
- blurRadius = 24f,
276
- offsetX = 0.dp,
277
- offsetY = (-4).dp
278
- )
279
- .background(AppTheme.current.colors.background.surface)
280
- .onGloballyPositioned {
281
- onFooterMeasured?.invoke(it.size.height)
282
- }
283
- ) {
284
- Box(
285
- Modifier.fillMaxWidth()
286
- .padding(bottom = bottom)
287
- .padding(vertical = Spacing.S, horizontal = Spacing.M)
288
- ) {
289
- footer?.invoke()
290
- }
291
- }
292
- }
293
-
294
-
295
- class ScreenHelper {
296
-
297
- private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
298
-
299
- internal var snackBarState by mutableStateOf<SnackBarData?>(null)
300
-
301
- internal var requestHide by mutableStateOf(false)
302
-
303
- fun showSnackBar(snackBar: SnackBar, onDismiss: (() -> Unit)? = null) {
304
- scope.launch {
305
- requestHide = false
306
- snackBarState = SnackBarData(snackBar, onDismiss)
307
- }
308
- }
309
-
310
- fun hideSnackBar() {
311
- scope.launch {
312
- requestHide = true
313
- }
314
- }
315
-
316
- internal fun removeSnackBarNow() {
317
- snackBarState = null
318
- requestHide = false
319
- }
320
-
321
- fun dispose() {
322
- scope.cancel()
323
- }
324
- }
325
- data class SnackBarData(
326
- val type: SnackBar,
327
- val onDismiss: (() -> Unit)?
328
- )
329
-
330
- val LocalScreenHelper = staticCompositionLocalOf<ScreenHelper> {
331
- error("No Screen helper provided")
332
- }
333
-
334
- @Composable
335
- fun ScreenSnackBarHost(footerHeightPx: Int) {
336
- val helper = LocalScreenHelper.current
337
- val snackBarData = helper.snackBarState ?: return
338
- val density = LocalDensity.current
339
- val navigationBar = AppNavigationBar.current
340
-
341
- val footerHeight = if (footerHeightPx > 0) {
342
- footerHeightPx
343
- } else {
344
- with(density) {
345
- min(navigationBar, 21.dp).toPx()
346
- }
347
- }.toInt()
348
-
349
- var startPosition by remember { mutableStateOf(Float.MAX_VALUE) }
350
- val targetPosition = 0f
351
-
352
- var offsetY by remember { mutableStateOf(Animatable(startPosition)) }
353
-
354
- LaunchedEffect(startPosition) {
355
- if (startPosition != Float.MAX_VALUE){
356
- offsetY.snapTo(startPosition)
357
- offsetY.animateTo(targetPosition, tween(350))
358
- }
359
- }
360
-
361
- LaunchedEffect(helper.requestHide) {
362
- if (helper.requestHide) {
363
- offsetY.animateTo(startPosition, tween(200))
364
- helper.removeSnackBarNow()
365
- snackBarData.onDismiss?.invoke()
366
- }
367
- }
368
-
369
- LaunchedEffect(snackBarData.type.duration) {
370
- val duration = snackBarData.type.duration
371
- if (duration != null) {
372
- delay(duration)
373
- helper.hideSnackBar()
374
- }
375
- }
376
-
377
- DisposableEffect(Unit) {
378
- onDispose { snackBarData.onDismiss?.invoke() }
379
- }
380
-
381
- Box(
382
- modifier = Modifier
383
- .offset { IntOffset(0, offsetY.value.toInt() - footerHeight) }
384
- .onGloballyPositioned {
385
- if (startPosition != it.size.height.toFloat()) {
386
- startPosition = it.size.height.toFloat()
387
- offsetY = Animatable(startPosition)
388
- }
389
- }
390
- .fillMaxWidth()
391
- ) {
392
- when (val type = snackBarData.type) {
393
- is SnackBar.Custom -> type.content()
394
- is SnackBar.Toast -> {}
395
- }
396
- }
397
- }
398
-
399
-
400
-
401
-
402
-
403
-
404
-
@@ -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
- 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,78 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import androidx.compose.foundation.background
4
- import androidx.compose.foundation.border
5
- import androidx.compose.foundation.layout.Box
6
- import androidx.compose.foundation.layout.height
7
- import androidx.compose.foundation.layout.padding
8
- import androidx.compose.foundation.layout.widthIn
9
- import androidx.compose.foundation.shape.RoundedCornerShape
10
- import androidx.compose.runtime.Composable
11
- import androidx.compose.ui.Alignment
12
- import androidx.compose.ui.Modifier
13
- import androidx.compose.ui.graphics.Color
14
- import androidx.compose.ui.unit.dp
15
- import vn.momo.kits.const.AppTheme
16
- import vn.momo.kits.const.Colors
17
- import vn.momo.kits.const.Radius
18
- import vn.momo.kits.const.Spacing
19
- import vn.momo.kits.const.Typography
20
- import vn.momo.kits.const.scaleSize
21
-
22
-
23
- @Composable
24
- fun Badge(label: String = "Label", backgroundColor: Color? = null) {
25
- val primaryColors = listOf(
26
- Color(0xFFF0F0F0),
27
- Color(0xFFEB2F96),
28
- Color(0xFF962AF0),
29
- Color(0xFF4E4BFF),
30
- Color(0xFF007AFF),
31
- Color(0xFF13C2C2),
32
- Color(0xFF34C759),
33
- Color(0xFFA0D911),
34
- Color(0xFFFFCC00),
35
- Color(0xFFFA8C16),
36
- Color(0xFFFA541C),
37
- Color(0xFFF5222D)
38
- )
39
-
40
- fun isNumber(label: String): Boolean {
41
- val numberRegex = "^\\d+$".toRegex()
42
- return numberRegex.matches(label)
43
- }
44
-
45
- fun formatTitle(label: String): String {
46
- if (isNumber(label) && label.toInt() > 99) {
47
- return "99+"
48
- }
49
- return label
50
- }
51
-
52
- var badgeColor =
53
- if (isNumber(label)) {
54
- AppTheme.current.colors.error.primary
55
- } else {
56
- AppTheme.current.colors.warning.primary
57
- }
58
-
59
- if (backgroundColor != null && primaryColors.contains(backgroundColor)) {
60
- badgeColor = backgroundColor
61
- }
62
- val scaleSize = scaleSize(16f)
63
-
64
- Box(
65
- modifier = Modifier
66
- .height(scaleSize.dp)
67
- .widthIn(min = scaleSize.dp)
68
- .background(color = badgeColor, shape = RoundedCornerShape(Radius.M))
69
- .border(width = 1.dp, shape = RoundedCornerShape(Radius.M), color = Colors.black_01)
70
- .padding(horizontal = Spacing.XS), contentAlignment = Alignment.Center
71
- ) {
72
- Text(
73
- text = formatTitle(label),
74
- color = Colors.black_01,
75
- style = Typography.actionXxsBold
76
- )
77
- }
78
- }
@@ -1,27 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import androidx.compose.foundation.background
4
- import androidx.compose.foundation.border
5
- import androidx.compose.foundation.layout.Box
6
- import androidx.compose.foundation.layout.size
7
- import androidx.compose.foundation.shape.RoundedCornerShape
8
- import androidx.compose.runtime.Composable
9
- import androidx.compose.ui.Modifier
10
- import androidx.compose.ui.unit.dp
11
- import vn.momo.kits.const.Colors
12
- import vn.momo.kits.const.Radius
13
-
14
- enum class DotSize(val size: Int) {
15
- Small(10),
16
- Large(16)
17
- }
18
-
19
- @Composable
20
- fun BadgeDot(size: DotSize = DotSize.Large, modifier: Modifier = Modifier) {
21
- Box(
22
- modifier = modifier
23
- .size(size.size.dp)
24
- .border(width = 1.dp, color = Colors.black_01, shape = RoundedCornerShape(Radius.S))
25
- .background(color = Colors.red_03, shape = RoundedCornerShape(Radius.S))
26
- )
27
- }