@momo-kits/native-kits 0.162.1-beta.5 → 0.162.1-nativeimage.2-debug
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build.gradle.kts +11 -0
- package/compose/build.gradle.kts +191 -0
- package/compose/build.gradle.kts.backup +191 -0
- package/compose/compose.podspec +47 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/components/NativeImage.android.kt +71 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +123 -0
- package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
- package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +57 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +109 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +201 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +222 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +48 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +305 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +921 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +121 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +403 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +85 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +340 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +198 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +357 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +94 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +136 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +543 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +148 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +192 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +116 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +452 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +172 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +255 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +235 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +233 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +259 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +241 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +364 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/NativeImage.kt +74 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +92 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +352 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +103 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +70 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +17 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +100 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +96 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +92 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +135 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +214 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +590 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +177 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +205 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +239 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +191 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +306 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +285 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +35 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +57 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +68 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +14 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +253 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +133 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +104 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +145 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +345 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +556 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +161 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +243 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +187 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +315 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +80 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +306 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +34 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +370 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +131 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +167 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +72 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +66 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +70 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +105 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/components/NativeImage.ios.kt +153 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +33 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +186 -0
- package/example/ios/Example.xcodeproj/xcuserdata/thanhle.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
- package/example/ios/Example.xcworkspace/xcuserdata/thanhle.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/thanhle.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
- package/gradle/libs.versions.toml +69 -0
- package/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/gradle/wrapper/gradle-wrapper.properties +8 -0
- package/gradle.properties +26 -0
- package/gradlew +252 -0
- package/gradlew.bat +94 -0
- package/local.properties +8 -0
- package/package.json +1 -1
- package/settings.gradle.kts +64 -0
- package/.claude/settings.local.json +0 -36
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
package vn.momo.kits.components
|
|
2
|
+
|
|
3
|
+
import androidx.compose.animation.core.FastOutSlowInEasing
|
|
4
|
+
import androidx.compose.animation.core.animateFloatAsState
|
|
5
|
+
import androidx.compose.animation.core.tween
|
|
6
|
+
import androidx.compose.foundation.background
|
|
7
|
+
import androidx.compose.foundation.border
|
|
8
|
+
import androidx.compose.foundation.layout.Box
|
|
9
|
+
import androidx.compose.foundation.layout.fillMaxWidth
|
|
10
|
+
import androidx.compose.foundation.layout.height
|
|
11
|
+
import androidx.compose.foundation.layout.size
|
|
12
|
+
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
13
|
+
import androidx.compose.runtime.Composable
|
|
14
|
+
import androidx.compose.runtime.getValue
|
|
15
|
+
import androidx.compose.ui.Modifier
|
|
16
|
+
import androidx.compose.ui.draw.clip
|
|
17
|
+
import androidx.compose.ui.graphics.Color
|
|
18
|
+
import androidx.compose.ui.unit.dp
|
|
19
|
+
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
20
|
+
import vn.momo.kits.const.AppTheme
|
|
21
|
+
import vn.momo.kits.const.Colors
|
|
22
|
+
import vn.momo.kits.const.Radius
|
|
23
|
+
import vn.momo.kits.modifier.conditional
|
|
24
|
+
import vn.momo.kits.platform.LottieAnimation
|
|
25
|
+
|
|
26
|
+
enum class LoaderType {
|
|
27
|
+
DOT, SPINNER
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@Composable
|
|
31
|
+
fun Loader(
|
|
32
|
+
type: LoaderType = LoaderType.DOT,
|
|
33
|
+
tintColor: Color? = null,
|
|
34
|
+
modifier: Modifier = Modifier
|
|
35
|
+
) {
|
|
36
|
+
when (type) {
|
|
37
|
+
LoaderType.DOT -> DotLoader(tintColor = tintColor, modifier = modifier)
|
|
38
|
+
LoaderType.SPINNER -> SpinnerLoader(tintColor = tintColor, modifier = modifier)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Composable
|
|
43
|
+
fun DotLoader(
|
|
44
|
+
tintColor: Color? = null,
|
|
45
|
+
modifier: Modifier = Modifier
|
|
46
|
+
) {
|
|
47
|
+
LottieAnimation(
|
|
48
|
+
path = "files/dot_loading",
|
|
49
|
+
tintColor = tintColor,
|
|
50
|
+
modifier = modifier
|
|
51
|
+
.size(width = 52.dp, height = 18.dp)
|
|
52
|
+
.conditional(IsShowBaseLineDebug) {
|
|
53
|
+
border(1.dp, Colors.blue_03)
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@Composable
|
|
59
|
+
fun SpinnerLoader(
|
|
60
|
+
tintColor: Color? = null,
|
|
61
|
+
modifier: Modifier = Modifier
|
|
62
|
+
) {
|
|
63
|
+
LottieAnimation(
|
|
64
|
+
path = "files/lottie_circle_loader",
|
|
65
|
+
tintColor = tintColor,
|
|
66
|
+
modifier = modifier
|
|
67
|
+
.size(24.dp)
|
|
68
|
+
.conditional(IsShowBaseLineDebug) {
|
|
69
|
+
border(1.dp, Colors.blue_03)
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@Composable
|
|
75
|
+
fun ProgressBar(
|
|
76
|
+
percent: Float = 0f,
|
|
77
|
+
color: Color? = null,
|
|
78
|
+
modifier: Modifier = Modifier
|
|
79
|
+
) {
|
|
80
|
+
val clampedPercent = percent.coerceIn(0f, 100f)
|
|
81
|
+
val animatedProgress by animateFloatAsState(
|
|
82
|
+
targetValue = clampedPercent / 100f,
|
|
83
|
+
animationSpec = tween(durationMillis = 200, easing = FastOutSlowInEasing),
|
|
84
|
+
label = "progressAnimation"
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
val trackColor = AppTheme.current.colors.background.default
|
|
88
|
+
val fillColor = color ?: AppTheme.current.colors.primary
|
|
89
|
+
|
|
90
|
+
Box(
|
|
91
|
+
modifier = modifier
|
|
92
|
+
.fillMaxWidth()
|
|
93
|
+
.height(4.dp)
|
|
94
|
+
.clip(RoundedCornerShape(Radius.XXS))
|
|
95
|
+
.background(trackColor)
|
|
96
|
+
.conditional(IsShowBaseLineDebug) {
|
|
97
|
+
border(1.dp, Colors.blue_03)
|
|
98
|
+
}
|
|
99
|
+
) {
|
|
100
|
+
Box(
|
|
101
|
+
modifier = Modifier
|
|
102
|
+
.fillMaxWidth(animatedProgress)
|
|
103
|
+
.height(4.dp)
|
|
104
|
+
.clip(RoundedCornerShape(Radius.XXS))
|
|
105
|
+
.background(fillColor)
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
package vn.momo.kits.components
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import androidx.compose.foundation.border
|
|
5
|
+
import androidx.compose.foundation.layout.BoxScope
|
|
6
|
+
import androidx.compose.foundation.layout.BoxWithConstraints
|
|
7
|
+
import androidx.compose.runtime.Composable
|
|
8
|
+
import androidx.compose.runtime.remember
|
|
9
|
+
import androidx.compose.ui.Modifier
|
|
10
|
+
import androidx.compose.ui.platform.LocalDensity
|
|
11
|
+
import androidx.compose.ui.semantics.contentDescription
|
|
12
|
+
import androidx.compose.ui.semantics.semantics
|
|
13
|
+
import androidx.compose.ui.unit.dp
|
|
14
|
+
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
15
|
+
import vn.momo.kits.const.Colors
|
|
16
|
+
import vn.momo.kits.modifier.conditional
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
fun isGifImage(source: Any): Boolean {
|
|
20
|
+
if (source is String) {
|
|
21
|
+
return source.contains(".gif") ||
|
|
22
|
+
source.contains(".webp") ||
|
|
23
|
+
source.contains(".apng") ||
|
|
24
|
+
source.contains(".avif")
|
|
25
|
+
}
|
|
26
|
+
return false
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private val urlCache = mutableMapOf<String, String>()
|
|
30
|
+
|
|
31
|
+
@Composable
|
|
32
|
+
fun NativeImage(
|
|
33
|
+
source: Any,
|
|
34
|
+
modifier: Modifier = Modifier,
|
|
35
|
+
options: Options? = null,
|
|
36
|
+
loading: Boolean = true
|
|
37
|
+
) {
|
|
38
|
+
BoxWithConstraints(
|
|
39
|
+
modifier = modifier
|
|
40
|
+
.conditional(IsShowBaseLineDebug) {
|
|
41
|
+
border(1.dp, Colors.blue_03)
|
|
42
|
+
}
|
|
43
|
+
.semantics { contentDescription = "img|$source" },
|
|
44
|
+
) {
|
|
45
|
+
val density = LocalDensity.current
|
|
46
|
+
val urlToLoad = remember(source, maxWidth, maxHeight, density) {
|
|
47
|
+
when (source) {
|
|
48
|
+
is String -> {
|
|
49
|
+
// Check cache first
|
|
50
|
+
val cacheKey = "$source|${maxWidth}|${density.density}"
|
|
51
|
+
urlCache[cacheKey] ?: run {
|
|
52
|
+
val processedUrl = processImageUrl(source, maxWidth, density)
|
|
53
|
+
urlCache[cacheKey] = processedUrl
|
|
54
|
+
processedUrl
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
else -> source
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
NativeImageWrapper(urlToLoad, modifier, options, loading)
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@Composable
|
|
69
|
+
expect fun BoxScope.NativeImageWrapper(
|
|
70
|
+
urlToLoad: Any,
|
|
71
|
+
modifier: Modifier = Modifier,
|
|
72
|
+
options: Options? = null,
|
|
73
|
+
loading: Boolean = true,
|
|
74
|
+
)
|
|
@@ -0,0 +1,56 @@
|
|
|
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.Row
|
|
7
|
+
import androidx.compose.foundation.layout.padding
|
|
8
|
+
import androidx.compose.foundation.layout.size
|
|
9
|
+
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
10
|
+
import androidx.compose.runtime.Composable
|
|
11
|
+
import androidx.compose.ui.Modifier
|
|
12
|
+
import androidx.compose.ui.graphics.Color
|
|
13
|
+
import androidx.compose.ui.unit.dp
|
|
14
|
+
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
15
|
+
import vn.momo.kits.const.AppTheme
|
|
16
|
+
import vn.momo.kits.const.Colors
|
|
17
|
+
import vn.momo.kits.const.Spacing
|
|
18
|
+
import vn.momo.kits.modifier.conditional
|
|
19
|
+
|
|
20
|
+
@Composable
|
|
21
|
+
fun Dot(active: Boolean = false, activeColor: Color, modifier: Modifier = Modifier) {
|
|
22
|
+
return if (active) {
|
|
23
|
+
Box(
|
|
24
|
+
modifier = modifier.size(width = 12.dp, height = 4.dp).background(
|
|
25
|
+
color = activeColor,
|
|
26
|
+
shape = RoundedCornerShape(4.dp)
|
|
27
|
+
)
|
|
28
|
+
)
|
|
29
|
+
} else {
|
|
30
|
+
Box(
|
|
31
|
+
modifier = modifier.size(4.dp)
|
|
32
|
+
.background(
|
|
33
|
+
color = AppTheme.current.colors.background.pressed,
|
|
34
|
+
shape = RoundedCornerShape(4.dp)
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@Composable
|
|
41
|
+
fun PaginationDot(
|
|
42
|
+
activeIndex: Int = 0,
|
|
43
|
+
dataLength: Int = 3
|
|
44
|
+
) {
|
|
45
|
+
Row(modifier = Modifier.conditional(IsShowBaseLineDebug) {
|
|
46
|
+
border(1.dp, Colors.blue_03)
|
|
47
|
+
}) {
|
|
48
|
+
for (i in 0 until dataLength) {
|
|
49
|
+
Dot(
|
|
50
|
+
i == activeIndex,
|
|
51
|
+
AppTheme.current.colors.primary,
|
|
52
|
+
modifier = Modifier.padding(end = if (i != dataLength - 1) Spacing.XS else 0.dp)
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
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.BoxWithConstraints
|
|
6
|
+
import androidx.compose.foundation.layout.padding
|
|
7
|
+
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
8
|
+
import androidx.compose.runtime.Composable
|
|
9
|
+
import androidx.compose.ui.Alignment
|
|
10
|
+
import androidx.compose.ui.Modifier
|
|
11
|
+
import androidx.compose.ui.graphics.Color
|
|
12
|
+
import androidx.compose.ui.unit.dp
|
|
13
|
+
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
14
|
+
import vn.momo.kits.const.Colors
|
|
15
|
+
import vn.momo.kits.const.Spacing
|
|
16
|
+
import vn.momo.kits.const.Typography
|
|
17
|
+
import vn.momo.kits.modifier.conditional
|
|
18
|
+
|
|
19
|
+
@Composable
|
|
20
|
+
fun PaginationNumber(
|
|
21
|
+
activeIndex: Int = 0,
|
|
22
|
+
dataLength: Int = 2
|
|
23
|
+
) {
|
|
24
|
+
BoxWithConstraints(
|
|
25
|
+
modifier = Modifier.background(
|
|
26
|
+
color = Color(0x33000000),
|
|
27
|
+
shape = RoundedCornerShape(Spacing.L)
|
|
28
|
+
)
|
|
29
|
+
.conditional(IsShowBaseLineDebug) {
|
|
30
|
+
border(1.dp, Colors.blue_03)
|
|
31
|
+
},
|
|
32
|
+
contentAlignment = Alignment.Center
|
|
33
|
+
) {
|
|
34
|
+
Text(
|
|
35
|
+
modifier = Modifier.padding(horizontal = Spacing.S),
|
|
36
|
+
text = "${1 + activeIndex}/$dataLength",
|
|
37
|
+
color = Colors.black_01,
|
|
38
|
+
style = Typography.labelDefaultMedium
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
package vn.momo.kits.components
|
|
2
|
+
|
|
3
|
+
import androidx.compose.foundation.background
|
|
4
|
+
import androidx.compose.foundation.border
|
|
5
|
+
import androidx.compose.foundation.horizontalScroll
|
|
6
|
+
import androidx.compose.foundation.layout.Box
|
|
7
|
+
import androidx.compose.foundation.layout.Column
|
|
8
|
+
import androidx.compose.foundation.layout.Row
|
|
9
|
+
import androidx.compose.foundation.layout.fillMaxWidth
|
|
10
|
+
import androidx.compose.foundation.layout.height
|
|
11
|
+
import androidx.compose.foundation.layout.offset
|
|
12
|
+
import androidx.compose.foundation.layout.padding
|
|
13
|
+
import androidx.compose.foundation.layout.width
|
|
14
|
+
import androidx.compose.foundation.rememberScrollState
|
|
15
|
+
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
16
|
+
import androidx.compose.runtime.Composable
|
|
17
|
+
import androidx.compose.runtime.derivedStateOf
|
|
18
|
+
import androidx.compose.runtime.getValue
|
|
19
|
+
import androidx.compose.runtime.remember
|
|
20
|
+
import androidx.compose.ui.Alignment
|
|
21
|
+
import androidx.compose.ui.Modifier
|
|
22
|
+
import androidx.compose.ui.draw.clip
|
|
23
|
+
import androidx.compose.ui.unit.Dp
|
|
24
|
+
import androidx.compose.ui.unit.dp
|
|
25
|
+
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
26
|
+
import vn.momo.kits.const.AppTheme
|
|
27
|
+
import vn.momo.kits.const.Colors
|
|
28
|
+
import vn.momo.kits.const.Spacing
|
|
29
|
+
import vn.momo.kits.modifier.conditional
|
|
30
|
+
|
|
31
|
+
val INDICATOR_WIDTH = 24.dp
|
|
32
|
+
val PROGRESS_WIDTH = 72.dp
|
|
33
|
+
|
|
34
|
+
// Memoized offset calculation to avoid repeated computations during scroll
|
|
35
|
+
private fun calculateOffset(currentPosition: Int, maxBound: Int): Dp {
|
|
36
|
+
return if (maxBound == 0) 0.dp else {
|
|
37
|
+
(PROGRESS_WIDTH - INDICATOR_WIDTH) * (currentPosition / maxBound.toFloat())
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@Composable
|
|
42
|
+
fun PaginationScroll(
|
|
43
|
+
modifier: Modifier = Modifier,
|
|
44
|
+
content: @Composable () -> Unit
|
|
45
|
+
) {
|
|
46
|
+
val scrollState = rememberScrollState()
|
|
47
|
+
val theme = AppTheme.current
|
|
48
|
+
|
|
49
|
+
// Use derivedStateOf to optimize scroll position calculations
|
|
50
|
+
val indicatorOffset by remember {
|
|
51
|
+
derivedStateOf {
|
|
52
|
+
calculateOffset(scrollState.value, scrollState.maxValue)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Cache theme colors to avoid repeated access
|
|
57
|
+
val (progressBackground, indicatorColor) = remember(theme) {
|
|
58
|
+
theme.colors.background.pressed to theme.colors.primary
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
|
62
|
+
Row(
|
|
63
|
+
modifier = modifier
|
|
64
|
+
.fillMaxWidth()
|
|
65
|
+
.conditional(IsShowBaseLineDebug) {
|
|
66
|
+
border(1.dp, Colors.blue_03)
|
|
67
|
+
}
|
|
68
|
+
.padding(bottom = Spacing.L)
|
|
69
|
+
.horizontalScroll(scrollState)
|
|
70
|
+
) {
|
|
71
|
+
content()
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Progress indicator
|
|
75
|
+
Box(
|
|
76
|
+
modifier = Modifier
|
|
77
|
+
.clip(RoundedCornerShape(Spacing.XS))
|
|
78
|
+
.width(PROGRESS_WIDTH)
|
|
79
|
+
.height(4.dp)
|
|
80
|
+
.background(color = progressBackground)
|
|
81
|
+
) {
|
|
82
|
+
Box(
|
|
83
|
+
modifier = Modifier
|
|
84
|
+
.offset(x = indicatorOffset)
|
|
85
|
+
.clip(RoundedCornerShape(Spacing.XS))
|
|
86
|
+
.width(INDICATOR_WIDTH)
|
|
87
|
+
.height(4.dp)
|
|
88
|
+
.background(color = indicatorColor)
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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.Row
|
|
6
|
+
import androidx.compose.foundation.layout.padding
|
|
7
|
+
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
8
|
+
import androidx.compose.runtime.Composable
|
|
9
|
+
import androidx.compose.ui.Modifier
|
|
10
|
+
import androidx.compose.ui.graphics.Color
|
|
11
|
+
import androidx.compose.ui.unit.dp
|
|
12
|
+
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
13
|
+
import vn.momo.kits.const.Colors
|
|
14
|
+
import vn.momo.kits.const.Spacing
|
|
15
|
+
import vn.momo.kits.modifier.conditional
|
|
16
|
+
|
|
17
|
+
@Composable
|
|
18
|
+
fun PaginationWhiteDot(
|
|
19
|
+
activeIndex: Int = 0,
|
|
20
|
+
dataLength: Int = 3
|
|
21
|
+
) {
|
|
22
|
+
Row(
|
|
23
|
+
modifier = Modifier.background(
|
|
24
|
+
color = Color(0x33000000),
|
|
25
|
+
shape = RoundedCornerShape(Spacing.S)
|
|
26
|
+
)
|
|
27
|
+
.conditional(IsShowBaseLineDebug) {
|
|
28
|
+
border(1.dp, Colors.blue_03)
|
|
29
|
+
}
|
|
30
|
+
.padding(Spacing.XS)
|
|
31
|
+
) {
|
|
32
|
+
for (i in 0 until dataLength) {
|
|
33
|
+
Dot(
|
|
34
|
+
i == activeIndex,
|
|
35
|
+
Colors.black_01,
|
|
36
|
+
modifier = Modifier.padding(end = if (i != dataLength - 1) Spacing.XS else 0.dp)
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|