@momo-kits/native-kits 0.162.0-debug → 0.162.1-beta.1-debug
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +32 -0
- package/compose/build.gradle.kts +66 -63
- package/compose/build.gradle.kts.backup +66 -63
- package/compose/compose.podspec +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +2 -7
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +6 -24
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +4 -19
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +1 -10
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +5 -16
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +6 -101
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +4 -16
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +9 -34
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +1 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +27 -29
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +3 -26
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +27 -30
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +3 -13
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +3 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +3 -18
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +11 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +3 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +1 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +84 -59
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +13 -71
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +10 -51
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +6 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +4 -21
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +15 -76
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +5 -26
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +3 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +15 -36
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +3 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -28
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +2 -13
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +4 -10
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +3 -28
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +8 -47
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +4 -25
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +2 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +1 -17
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +1 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +50 -111
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +1 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +1 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +1 -12
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +4 -96
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +2 -12
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +9 -21
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +9 -14
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +8 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +3 -18
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +1 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +5 -12
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +6 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +55 -55
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +3 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +12 -32
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +6 -24
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +55 -15
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +2 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +6 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +5 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +3 -13
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +3 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +1 -40
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -8
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Deprecated.kt +107 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +3 -8
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +3 -3
- package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +2 -3
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -2
- package/gradle.properties +1 -1
- package/local.properties +2 -2
- package/package.json +1 -1
- package/publish.sh +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -14
- package/example/ios/Example.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
- package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -5
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -46
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
package vn.momo.kits.components
|
|
2
2
|
|
|
3
|
+
import vn.momo.kits.utils.Deprecated.InternalApi
|
|
4
|
+
|
|
3
5
|
import androidx.compose.animation.core.LinearEasing
|
|
4
6
|
import androidx.compose.animation.core.RepeatMode
|
|
5
7
|
import androidx.compose.animation.core.animateFloat
|
|
@@ -48,6 +50,7 @@ import vn.momo.kits.const.scaleSize
|
|
|
48
50
|
import vn.momo.kits.modifier.conditional
|
|
49
51
|
|
|
50
52
|
@Composable
|
|
53
|
+
@InternalApi
|
|
51
54
|
fun OTPCaret() {
|
|
52
55
|
val duration = 500
|
|
53
56
|
val backgroundColor = AppTheme.current.colors.primary
|
|
@@ -66,7 +69,9 @@ fun OTPCaret() {
|
|
|
66
69
|
)
|
|
67
70
|
)
|
|
68
71
|
|
|
69
|
-
Row(
|
|
72
|
+
Row(
|
|
73
|
+
verticalAlignment = Alignment.CenterVertically
|
|
74
|
+
) {
|
|
70
75
|
Box(
|
|
71
76
|
modifier = Modifier
|
|
72
77
|
.size(1.dp, scaleSize(12f).dp)
|
|
@@ -4,23 +4,11 @@ import androidx.compose.foundation.background
|
|
|
4
4
|
import androidx.compose.foundation.border
|
|
5
5
|
import androidx.compose.foundation.clickable
|
|
6
6
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
7
|
-
import androidx.compose.foundation.layout
|
|
8
|
-
import androidx.compose.foundation.layout.Column
|
|
9
|
-
import androidx.compose.foundation.layout.Row
|
|
10
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
11
|
-
import androidx.compose.foundation.layout.height
|
|
12
|
-
import androidx.compose.foundation.layout.padding
|
|
13
|
-
import androidx.compose.foundation.layout.size
|
|
14
|
-
import androidx.compose.foundation.layout.width
|
|
7
|
+
import androidx.compose.foundation.layout.*
|
|
15
8
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
16
9
|
import androidx.compose.foundation.text.BasicTextField
|
|
17
10
|
import androidx.compose.foundation.text.KeyboardOptions
|
|
18
|
-
import androidx.compose.runtime
|
|
19
|
-
import androidx.compose.runtime.MutableState
|
|
20
|
-
import androidx.compose.runtime.getValue
|
|
21
|
-
import androidx.compose.runtime.mutableStateOf
|
|
22
|
-
import androidx.compose.runtime.remember
|
|
23
|
-
import androidx.compose.runtime.setValue
|
|
11
|
+
import androidx.compose.runtime.*
|
|
24
12
|
import androidx.compose.ui.Alignment
|
|
25
13
|
import androidx.compose.ui.Modifier
|
|
26
14
|
import androidx.compose.ui.focus.onFocusChanged
|
|
@@ -32,12 +20,7 @@ import androidx.compose.ui.text.input.KeyboardType
|
|
|
32
20
|
import androidx.compose.ui.unit.Dp
|
|
33
21
|
import androidx.compose.ui.unit.dp
|
|
34
22
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
35
|
-
import vn.momo.kits.const
|
|
36
|
-
import vn.momo.kits.const.Colors
|
|
37
|
-
import vn.momo.kits.const.Radius
|
|
38
|
-
import vn.momo.kits.const.Spacing
|
|
39
|
-
import vn.momo.kits.const.Typography
|
|
40
|
-
import vn.momo.kits.const.scaleSize
|
|
23
|
+
import vn.momo.kits.const.*
|
|
41
24
|
import vn.momo.kits.modifier.conditional
|
|
42
25
|
import vn.momo.kits.modifier.setAutomationId
|
|
43
26
|
|
|
@@ -71,7 +54,7 @@ enum class InputPhoneNumberSize(val values: InputPhoneNumberSizeDetail) {
|
|
|
71
54
|
}
|
|
72
55
|
|
|
73
56
|
@Composable
|
|
74
|
-
fun getBorderColor(isFocused: Boolean, error: String): Color {
|
|
57
|
+
private fun getBorderColor(isFocused: Boolean, error: String): Color {
|
|
75
58
|
val theme = AppTheme.current
|
|
76
59
|
return remember(isFocused, error, theme) {
|
|
77
60
|
when {
|
|
@@ -4,25 +4,11 @@ import androidx.compose.foundation.background
|
|
|
4
4
|
import androidx.compose.foundation.border
|
|
5
5
|
import androidx.compose.foundation.clickable
|
|
6
6
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
7
|
-
import androidx.compose.foundation.layout
|
|
8
|
-
import androidx.compose.foundation.layout.Column
|
|
9
|
-
import androidx.compose.foundation.layout.Row
|
|
10
|
-
import androidx.compose.foundation.layout.Spacer
|
|
11
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
12
|
-
import androidx.compose.foundation.layout.height
|
|
13
|
-
import androidx.compose.foundation.layout.offset
|
|
14
|
-
import androidx.compose.foundation.layout.padding
|
|
15
|
-
import androidx.compose.foundation.layout.width
|
|
16
|
-
import androidx.compose.foundation.layout.wrapContentSize
|
|
7
|
+
import androidx.compose.foundation.layout.*
|
|
17
8
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
18
9
|
import androidx.compose.foundation.text.BasicTextField
|
|
19
10
|
import androidx.compose.foundation.text.KeyboardOptions
|
|
20
|
-
import androidx.compose.runtime
|
|
21
|
-
import androidx.compose.runtime.MutableState
|
|
22
|
-
import androidx.compose.runtime.getValue
|
|
23
|
-
import androidx.compose.runtime.mutableStateOf
|
|
24
|
-
import androidx.compose.runtime.remember
|
|
25
|
-
import androidx.compose.runtime.setValue
|
|
11
|
+
import androidx.compose.runtime.*
|
|
26
12
|
import androidx.compose.ui.Alignment
|
|
27
13
|
import androidx.compose.ui.Modifier
|
|
28
14
|
import androidx.compose.ui.focus.onFocusChanged
|
|
@@ -33,16 +19,12 @@ import androidx.compose.ui.unit.Dp
|
|
|
33
19
|
import androidx.compose.ui.unit.dp
|
|
34
20
|
import androidx.compose.ui.unit.sp
|
|
35
21
|
import androidx.compose.ui.zIndex
|
|
36
|
-
import vn.momo.kits.const.AppTheme
|
|
37
|
-
import vn.momo.kits.const.Spacing
|
|
38
22
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
39
|
-
import vn.momo.kits.const
|
|
40
|
-
import vn.momo.kits.const.Typography
|
|
41
|
-
import vn.momo.kits.const.scaleSize
|
|
23
|
+
import vn.momo.kits.const.*
|
|
42
24
|
import vn.momo.kits.modifier.conditional
|
|
43
25
|
|
|
44
|
-
const val MAX_LENGTH = 300
|
|
45
|
-
val DEFAULT_HEIGHT = 104.dp
|
|
26
|
+
internal const val MAX_LENGTH = 300
|
|
27
|
+
internal val DEFAULT_HEIGHT = 104.dp
|
|
46
28
|
|
|
47
29
|
@Composable
|
|
48
30
|
fun InputTextArea(
|
|
@@ -71,24 +53,8 @@ fun InputTextArea(
|
|
|
71
53
|
) {
|
|
72
54
|
var isFocused by remember { mutableStateOf(false) }
|
|
73
55
|
var isBlurred = false
|
|
74
|
-
val
|
|
75
|
-
|
|
76
|
-
var placeholderColor = AppTheme.current.colors.text.hint
|
|
77
|
-
var iconTintColor = iconColor
|
|
78
|
-
val floatingTitleColor = when {
|
|
79
|
-
disabled -> AppTheme.current.colors.text.disable
|
|
80
|
-
else -> floatingValueColor
|
|
81
|
-
}
|
|
82
|
-
val floatingIconTintColor = when {
|
|
83
|
-
disabled -> AppTheme.current.colors.text.disable
|
|
84
|
-
else -> floatingIconColor
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (disabled) {
|
|
88
|
-
textColor = disabledColor
|
|
89
|
-
placeholderColor = disabledColor
|
|
90
|
-
iconTintColor = disabledColor
|
|
91
|
-
}
|
|
56
|
+
val (textColor, placeholderColor, iconTintColor, floatingTitleColor, floatingIconTintColor) =
|
|
57
|
+
getInputColors(disabled, iconColor, floatingValueColor, floatingIconColor)
|
|
92
58
|
|
|
93
59
|
val fontSize = 16.sp
|
|
94
60
|
val lineHeight = 24.sp
|
|
@@ -125,41 +91,14 @@ fun InputTextArea(
|
|
|
125
91
|
},
|
|
126
92
|
decorationBox = { innerTextField ->
|
|
127
93
|
// Floating Icon
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
modifier = Modifier
|
|
137
|
-
.padding(horizontal = Spacing.S),
|
|
138
|
-
verticalAlignment = Alignment.CenterVertically
|
|
139
|
-
) {
|
|
140
|
-
Text(
|
|
141
|
-
floatingValue,
|
|
142
|
-
style = Typography.labelSMedium,
|
|
143
|
-
color = floatingTitleColor
|
|
144
|
-
)
|
|
145
|
-
if (required) {
|
|
146
|
-
Text(
|
|
147
|
-
"*",
|
|
148
|
-
style = Typography.labelSMedium,
|
|
149
|
-
color = AppTheme.current.colors.error.primary,
|
|
150
|
-
)
|
|
151
|
-
}
|
|
152
|
-
if (floatingIcon.isNotEmpty()) {
|
|
153
|
-
Icon(
|
|
154
|
-
source = floatingIcon,
|
|
155
|
-
modifier = Modifier.padding(start = Spacing.XS),
|
|
156
|
-
size = 16.dp,
|
|
157
|
-
color = floatingIconTintColor
|
|
158
|
-
)
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
94
|
+
FloatingLabel(
|
|
95
|
+
floatingValue = floatingValue,
|
|
96
|
+
floatingIcon = floatingIcon,
|
|
97
|
+
titleColor = floatingTitleColor,
|
|
98
|
+
iconColor = floatingIconTintColor,
|
|
99
|
+
offsetY = -scaleHeight / 2,
|
|
100
|
+
required = required,
|
|
101
|
+
)
|
|
163
102
|
//input box wrapper
|
|
164
103
|
Box(
|
|
165
104
|
modifier = Modifier.fillMaxWidth()
|
|
@@ -1,39 +1,18 @@
|
|
|
1
1
|
package vn.momo.kits.components
|
|
2
2
|
|
|
3
|
-
import androidx.compose.animation.core
|
|
4
|
-
import androidx.compose.animation.core.RepeatMode
|
|
5
|
-
import androidx.compose.animation.core.animateFloat
|
|
6
|
-
import androidx.compose.animation.core.infiniteRepeatable
|
|
7
|
-
import androidx.compose.animation.core.rememberInfiniteTransition
|
|
8
|
-
import androidx.compose.animation.core.tween
|
|
3
|
+
import androidx.compose.animation.core.*
|
|
9
4
|
import androidx.compose.foundation.Canvas
|
|
10
5
|
import androidx.compose.foundation.OverscrollEffect
|
|
11
6
|
import androidx.compose.foundation.background
|
|
12
7
|
import androidx.compose.foundation.gestures.FlingBehavior
|
|
13
8
|
import androidx.compose.foundation.gestures.ScrollableDefaults
|
|
14
|
-
import androidx.compose.foundation.layout
|
|
15
|
-
import androidx.compose.foundation.
|
|
16
|
-
import androidx.compose.foundation.layout.PaddingValues
|
|
17
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
18
|
-
import androidx.compose.foundation.layout.padding
|
|
19
|
-
import androidx.compose.foundation.layout.size
|
|
20
|
-
import androidx.compose.foundation.lazy.LazyColumn
|
|
21
|
-
import androidx.compose.foundation.lazy.LazyListLayoutInfo
|
|
22
|
-
import androidx.compose.foundation.lazy.LazyListScope
|
|
23
|
-
import androidx.compose.foundation.lazy.LazyListState
|
|
24
|
-
import androidx.compose.foundation.lazy.rememberLazyListState
|
|
9
|
+
import androidx.compose.foundation.layout.*
|
|
10
|
+
import androidx.compose.foundation.lazy.*
|
|
25
11
|
import androidx.compose.material.ExperimentalMaterialApi
|
|
26
12
|
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
|
27
13
|
import androidx.compose.material.pullrefresh.pullRefresh
|
|
28
14
|
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
|
29
|
-
import androidx.compose.runtime
|
|
30
|
-
import androidx.compose.runtime.LaunchedEffect
|
|
31
|
-
import androidx.compose.runtime.MutableState
|
|
32
|
-
import androidx.compose.runtime.State
|
|
33
|
-
import androidx.compose.runtime.mutableIntStateOf
|
|
34
|
-
import androidx.compose.runtime.mutableStateOf
|
|
35
|
-
import androidx.compose.runtime.remember
|
|
36
|
-
import androidx.compose.runtime.snapshotFlow
|
|
15
|
+
import androidx.compose.runtime.*
|
|
37
16
|
import androidx.compose.ui.Alignment
|
|
38
17
|
import androidx.compose.ui.Modifier
|
|
39
18
|
import androidx.compose.ui.composed
|
|
@@ -64,7 +43,7 @@ private const val BOX_KEY = "LazyColumnWithBouncing_BOX_KEY"
|
|
|
64
43
|
|
|
65
44
|
@OptIn(ExperimentalMaterialApi::class)
|
|
66
45
|
@Composable
|
|
67
|
-
fun overScrollWithPullToRefresh(
|
|
46
|
+
internal fun overScrollWithPullToRefresh(
|
|
68
47
|
pullRefreshState: PullToRefreshCustomState?,
|
|
69
48
|
): OverscrollEffect {
|
|
70
49
|
val density = LocalDensity.current
|
|
@@ -18,7 +18,7 @@ import vn.momo.kits.const.Spacing
|
|
|
18
18
|
import vn.momo.kits.modifier.conditional
|
|
19
19
|
|
|
20
20
|
@Composable
|
|
21
|
-
fun Dot(active: Boolean = false, activeColor: Color, modifier: Modifier = Modifier) {
|
|
21
|
+
internal fun Dot(active: Boolean = false, activeColor: Color, modifier: Modifier = Modifier) {
|
|
22
22
|
return if (active) {
|
|
23
23
|
Box(
|
|
24
24
|
modifier = modifier.size(width = 12.dp, height = 4.dp).background(
|
|
@@ -3,14 +3,7 @@ package vn.momo.kits.components
|
|
|
3
3
|
import androidx.compose.foundation.background
|
|
4
4
|
import androidx.compose.foundation.border
|
|
5
5
|
import androidx.compose.foundation.horizontalScroll
|
|
6
|
-
import androidx.compose.foundation.layout
|
|
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
|
|
6
|
+
import androidx.compose.foundation.layout.*
|
|
14
7
|
import androidx.compose.foundation.rememberScrollState
|
|
15
8
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
16
9
|
import androidx.compose.runtime.Composable
|
|
@@ -28,10 +21,9 @@ import vn.momo.kits.const.Colors
|
|
|
28
21
|
import vn.momo.kits.const.Spacing
|
|
29
22
|
import vn.momo.kits.modifier.conditional
|
|
30
23
|
|
|
31
|
-
val INDICATOR_WIDTH = 24.dp
|
|
32
|
-
val PROGRESS_WIDTH = 72.dp
|
|
24
|
+
private val INDICATOR_WIDTH = 24.dp
|
|
25
|
+
private val PROGRESS_WIDTH = 72.dp
|
|
33
26
|
|
|
34
|
-
// Memoized offset calculation to avoid repeated computations during scroll
|
|
35
27
|
private fun calculateOffset(currentPosition: Int, maxBound: Int): Dp {
|
|
36
28
|
return if (maxBound == 0) 0.dp else {
|
|
37
29
|
(PROGRESS_WIDTH - INDICATOR_WIDTH) * (currentPosition / maxBound.toFloat())
|
|
@@ -4,42 +4,22 @@ import androidx.compose.foundation.background
|
|
|
4
4
|
import androidx.compose.foundation.border
|
|
5
5
|
import androidx.compose.foundation.clickable
|
|
6
6
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
7
|
-
import androidx.compose.foundation.layout
|
|
8
|
-
import androidx.compose.foundation.layout.Box
|
|
9
|
-
import androidx.compose.foundation.layout.Column
|
|
10
|
-
import androidx.compose.foundation.layout.Row
|
|
11
|
-
import androidx.compose.foundation.layout.Spacer
|
|
12
|
-
import androidx.compose.foundation.layout.aspectRatio
|
|
13
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
14
|
-
import androidx.compose.foundation.layout.height
|
|
15
|
-
import androidx.compose.foundation.layout.offset
|
|
16
|
-
import androidx.compose.foundation.layout.padding
|
|
17
|
-
import androidx.compose.foundation.layout.width
|
|
7
|
+
import androidx.compose.foundation.layout.*
|
|
18
8
|
import androidx.compose.foundation.lazy.LazyColumn
|
|
19
9
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
20
|
-
import androidx.compose.runtime
|
|
21
|
-
import androidx.compose.runtime.LaunchedEffect
|
|
22
|
-
import androidx.compose.runtime.MutableState
|
|
23
|
-
import androidx.compose.runtime.getValue
|
|
24
|
-
import androidx.compose.runtime.mutableStateOf
|
|
25
|
-
import androidx.compose.runtime.remember
|
|
26
|
-
import androidx.compose.runtime.setValue
|
|
10
|
+
import androidx.compose.runtime.*
|
|
27
11
|
import androidx.compose.ui.Alignment
|
|
28
12
|
import androidx.compose.ui.Modifier
|
|
29
13
|
import androidx.compose.ui.draw.clip
|
|
14
|
+
import androidx.compose.ui.platform.LocalDensity
|
|
30
15
|
import androidx.compose.ui.text.TextLayoutResult
|
|
16
|
+
import androidx.compose.ui.unit.Dp
|
|
31
17
|
import androidx.compose.ui.unit.dp
|
|
32
|
-
import vn.momo.kits.
|
|
33
|
-
import vn.momo.kits.const.Radius
|
|
34
|
-
import vn.momo.kits.const.Spacing
|
|
18
|
+
import vn.momo.kits.application.AppLanguage
|
|
35
19
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
36
|
-
import vn.momo.kits.const
|
|
37
|
-
import vn.momo.kits.const.Typography
|
|
20
|
+
import vn.momo.kits.const.*
|
|
38
21
|
import vn.momo.kits.modifier.conditional
|
|
39
22
|
import vn.momo.kits.modifier.setAutomationId
|
|
40
|
-
import androidx.compose.ui.platform.LocalDensity
|
|
41
|
-
import androidx.compose.ui.unit.Dp
|
|
42
|
-
import vn.momo.kits.application.AppLanguage
|
|
43
23
|
import kotlin.math.min
|
|
44
24
|
|
|
45
25
|
data class PopupAction(
|
|
@@ -55,9 +35,8 @@ enum class PopupActionDirection {
|
|
|
55
35
|
|
|
56
36
|
private fun heightForLines(
|
|
57
37
|
layout: TextLayoutResult,
|
|
58
|
-
targetLines: Float
|
|
59
38
|
): Float {
|
|
60
|
-
val clampedLines =
|
|
39
|
+
val clampedLines = (8.5f).coerceAtLeast(1f)
|
|
61
40
|
val wholeLines = kotlin.math.floor(clampedLines).toInt()
|
|
62
41
|
val fractionalPart = clampedLines - wholeLines
|
|
63
42
|
|
|
@@ -111,7 +90,7 @@ fun PopupNotify(
|
|
|
111
90
|
layoutResult.value?.let { v ->
|
|
112
91
|
// cap visible height at ~8.5 lines
|
|
113
92
|
val textPx = v.size.height.toFloat()
|
|
114
|
-
val capPx = heightForLines(v
|
|
93
|
+
val capPx = heightForLines(v)
|
|
115
94
|
|
|
116
95
|
isScroll = textPx >= capPx
|
|
117
96
|
scrollHeight = with(density) { min(textPx, capPx).toDp() }
|
|
@@ -236,7 +215,7 @@ fun PopupNotify(
|
|
|
236
215
|
}
|
|
237
216
|
|
|
238
217
|
@Composable
|
|
239
|
-
fun BuildAction(
|
|
218
|
+
internal fun BuildAction(
|
|
240
219
|
primary: PopupAction?,
|
|
241
220
|
secondary: PopupAction?,
|
|
242
221
|
buttonDirection: PopupActionDirection = PopupActionDirection.ROW,
|
|
@@ -246,14 +225,14 @@ fun BuildAction(
|
|
|
246
225
|
when (buttonDirection) {
|
|
247
226
|
PopupActionDirection.AUTO -> {
|
|
248
227
|
if (secondary != null && (secondary.title.length > 12 || primary?.title?.length!! > 12)) {
|
|
249
|
-
|
|
228
|
+
RenderColumn(
|
|
250
229
|
secondary = secondary,
|
|
251
230
|
onAction = onAction,
|
|
252
231
|
closeAction = closeAction,
|
|
253
232
|
primary = primary
|
|
254
233
|
)
|
|
255
234
|
} else {
|
|
256
|
-
|
|
235
|
+
RenderRow(
|
|
257
236
|
secondary = secondary,
|
|
258
237
|
onAction = onAction,
|
|
259
238
|
closeAction = closeAction,
|
|
@@ -262,14 +241,14 @@ fun BuildAction(
|
|
|
262
241
|
}
|
|
263
242
|
}
|
|
264
243
|
|
|
265
|
-
PopupActionDirection.ROW ->
|
|
244
|
+
PopupActionDirection.ROW -> RenderRow(
|
|
266
245
|
secondary = secondary,
|
|
267
246
|
onAction = onAction,
|
|
268
247
|
closeAction = closeAction,
|
|
269
248
|
primary = primary
|
|
270
249
|
)
|
|
271
250
|
|
|
272
|
-
else ->
|
|
251
|
+
else -> RenderColumn(
|
|
273
252
|
secondary = secondary,
|
|
274
253
|
onAction = onAction,
|
|
275
254
|
closeAction = closeAction,
|
|
@@ -279,7 +258,7 @@ fun BuildAction(
|
|
|
279
258
|
}
|
|
280
259
|
|
|
281
260
|
@Composable
|
|
282
|
-
fun
|
|
261
|
+
internal fun RenderRow(
|
|
283
262
|
secondary: PopupAction?,
|
|
284
263
|
closeAction: MutableState<String>,
|
|
285
264
|
primary: PopupAction?,
|
|
@@ -316,7 +295,7 @@ fun renderRow(
|
|
|
316
295
|
}
|
|
317
296
|
|
|
318
297
|
@Composable
|
|
319
|
-
fun
|
|
298
|
+
internal fun RenderColumn(
|
|
320
299
|
secondary: PopupAction?,
|
|
321
300
|
closeAction: MutableState<String>,
|
|
322
301
|
primary: PopupAction?,
|
|
@@ -4,13 +4,7 @@ import androidx.compose.foundation.background
|
|
|
4
4
|
import androidx.compose.foundation.border
|
|
5
5
|
import androidx.compose.foundation.clickable
|
|
6
6
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
7
|
-
import androidx.compose.foundation.layout
|
|
8
|
-
import androidx.compose.foundation.layout.Column
|
|
9
|
-
import androidx.compose.foundation.layout.aspectRatio
|
|
10
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
11
|
-
import androidx.compose.foundation.layout.height
|
|
12
|
-
import androidx.compose.foundation.layout.padding
|
|
13
|
-
import androidx.compose.foundation.layout.width
|
|
7
|
+
import androidx.compose.foundation.layout.*
|
|
14
8
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
15
9
|
import androidx.compose.runtime.Composable
|
|
16
10
|
import androidx.compose.runtime.remember
|
|
@@ -19,10 +13,10 @@ import androidx.compose.ui.Modifier
|
|
|
19
13
|
import androidx.compose.ui.draw.clip
|
|
20
14
|
import androidx.compose.ui.layout.ContentScale
|
|
21
15
|
import androidx.compose.ui.unit.dp
|
|
22
|
-
import vn.momo.kits.const.AppTheme
|
|
23
|
-
import vn.momo.kits.const.Radius
|
|
24
16
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
17
|
+
import vn.momo.kits.const.AppTheme
|
|
25
18
|
import vn.momo.kits.const.Colors
|
|
19
|
+
import vn.momo.kits.const.Radius
|
|
26
20
|
import vn.momo.kits.const.Spacing
|
|
27
21
|
import vn.momo.kits.modifier.conditional
|
|
28
22
|
import vn.momo.kits.modifier.setAutomationId
|
|
@@ -18,8 +18,6 @@ import vn.momo.kits.application.IsShowBaseLineDebug
|
|
|
18
18
|
import vn.momo.kits.const.*
|
|
19
19
|
import vn.momo.kits.modifier.conditional
|
|
20
20
|
|
|
21
|
-
// ─── Data model ───────────────────────────────────────────────────────────────
|
|
22
|
-
|
|
23
21
|
data class ProgressInfoItem(
|
|
24
22
|
val title: String,
|
|
25
23
|
val description: String? = null,
|
|
@@ -29,25 +27,6 @@ enum class ProgressInfoSize { Small, Large }
|
|
|
29
27
|
|
|
30
28
|
enum class ProgressInfoAlign { Left, Right, Center, Stretch }
|
|
31
29
|
|
|
32
|
-
// ─── Public entry-point ───────────────────────────────────────────────────────
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Display-only step progress indicator migrated from the React Native ProgressInfo component.
|
|
36
|
-
*
|
|
37
|
-
* @param steps Ordered list of steps; each has a [ProgressInfoItem.title] and an
|
|
38
|
-
* optional [ProgressInfoItem.description].
|
|
39
|
-
* @param horizontal When `true` renders steps in a horizontal row with connector lines;
|
|
40
|
-
* when `false` (default) renders a vertical column.
|
|
41
|
-
* @param size Icon diameter: [ProgressInfoSize.Small] = 16 dp,
|
|
42
|
-
* [ProgressInfoSize.Large] = 24 dp (default).
|
|
43
|
-
* @param useNumber Show the 1-based step index inside the icon instead of the default dot.
|
|
44
|
-
* @param align Alignment of icon + text for the horizontal variant.
|
|
45
|
-
* @param showTitle Whether step titles are rendered (default `true`).
|
|
46
|
-
* @param showDescription Whether step descriptions are rendered (default `true`).
|
|
47
|
-
* @param customIcon Icon source key rendered inside each step circle (overrides the dot;
|
|
48
|
-
* itself overridden by [useNumber]).
|
|
49
|
-
* @param modifier Modifier applied to the root layout.
|
|
50
|
-
*/
|
|
51
30
|
@Composable
|
|
52
31
|
fun ProgressInfo(
|
|
53
32
|
steps: List<ProgressInfoItem>,
|
|
@@ -84,8 +63,6 @@ fun ProgressInfo(
|
|
|
84
63
|
}
|
|
85
64
|
}
|
|
86
65
|
|
|
87
|
-
// ─── Horizontal variant ───────────────────────────────────────────────────────
|
|
88
|
-
|
|
89
66
|
@Composable
|
|
90
67
|
private fun ProgressInfoHorizontal(
|
|
91
68
|
steps: List<ProgressInfoItem>,
|
|
@@ -190,7 +167,6 @@ private fun ProgressInfoHorizontal(
|
|
|
190
167
|
}
|
|
191
168
|
}
|
|
192
169
|
|
|
193
|
-
// ─── Vertical variant ─────────────────────────────────────────────────────────
|
|
194
170
|
|
|
195
171
|
@Composable
|
|
196
172
|
private fun ProgressInfoVertical(
|
|
@@ -275,8 +251,6 @@ private fun ProgressInfoVertical(
|
|
|
275
251
|
}
|
|
276
252
|
}
|
|
277
253
|
|
|
278
|
-
// ─── Step icon ────────────────────────────────────────────────────────────────
|
|
279
|
-
|
|
280
254
|
@Composable
|
|
281
255
|
private fun ProgressInfoStepIcon(
|
|
282
256
|
index: Int,
|
|
@@ -326,8 +300,6 @@ private fun ProgressInfoStepIcon(
|
|
|
326
300
|
}
|
|
327
301
|
}
|
|
328
302
|
|
|
329
|
-
// ─── Horizontal connector line ────────────────────────────────────────────────
|
|
330
|
-
|
|
331
303
|
@Composable
|
|
332
304
|
private fun ProgressInfoHorizontalLine(modifier: Modifier = Modifier) {
|
|
333
305
|
Box(
|
|
@@ -1,26 +1,15 @@
|
|
|
1
1
|
package vn.momo.kits.components
|
|
2
2
|
|
|
3
3
|
import androidx.compose.foundation.border
|
|
4
|
-
import androidx.compose.foundation.
|
|
5
|
-
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
6
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
7
|
-
import androidx.compose.foundation.layout.Box
|
|
8
|
-
import androidx.compose.foundation.layout.Row
|
|
9
|
-
import androidx.compose.foundation.layout.padding
|
|
10
|
-
import androidx.compose.foundation.layout.size
|
|
4
|
+
import androidx.compose.foundation.layout.*
|
|
11
5
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
12
6
|
import androidx.compose.runtime.Composable
|
|
13
|
-
import androidx.compose.runtime.remember
|
|
14
7
|
import androidx.compose.ui.Alignment
|
|
15
8
|
import androidx.compose.ui.Modifier
|
|
16
9
|
import androidx.compose.ui.draw.clip
|
|
17
10
|
import androidx.compose.ui.unit.dp
|
|
18
11
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
19
|
-
import vn.momo.kits.const
|
|
20
|
-
import vn.momo.kits.const.Colors
|
|
21
|
-
import vn.momo.kits.const.Radius
|
|
22
|
-
import vn.momo.kits.const.Spacing
|
|
23
|
-
import vn.momo.kits.const.Typography
|
|
12
|
+
import vn.momo.kits.const.*
|
|
24
13
|
import vn.momo.kits.modifier.activeOpacityClickable
|
|
25
14
|
import vn.momo.kits.modifier.conditional
|
|
26
15
|
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
package vn.momo.kits.components
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
import androidx.compose.animation.core
|
|
6
|
-
import androidx.compose.animation.core.infiniteRepeatable
|
|
7
|
-
import androidx.compose.animation.core.rememberInfiniteTransition
|
|
8
|
-
import androidx.compose.animation.core.tween
|
|
3
|
+
import vn.momo.kits.utils.Deprecated.InternalApi
|
|
4
|
+
|
|
5
|
+
import androidx.compose.animation.core.*
|
|
9
6
|
import androidx.compose.foundation.background
|
|
10
7
|
import androidx.compose.foundation.border
|
|
11
8
|
import androidx.compose.foundation.layout.Box
|
|
@@ -22,21 +19,17 @@ import vn.momo.kits.application.IsShowBaseLineDebug
|
|
|
22
19
|
import vn.momo.kits.const.Colors
|
|
23
20
|
import vn.momo.kits.modifier.conditional
|
|
24
21
|
|
|
25
|
-
// Pre-computed shimmer colors to avoid repeated list creation
|
|
26
22
|
private val shimmerColors = listOf(
|
|
27
23
|
Colors.black_05,
|
|
28
24
|
Colors.black_03,
|
|
29
25
|
Colors.black_05,
|
|
30
26
|
)
|
|
31
|
-
|
|
32
|
-
// Constants for better performance
|
|
33
27
|
private const val SHADOW_BRUSH_PERCENTAGE = 0.6f
|
|
34
28
|
private const val DEFAULT_DURATION_MILLIS = 1000
|
|
35
29
|
|
|
36
30
|
@Composable
|
|
37
31
|
fun Skeleton() {
|
|
38
32
|
BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
|
|
39
|
-
// Memoize width calculation
|
|
40
33
|
val maxWidthValue = remember(maxWidth) { maxWidth.value.toInt() }
|
|
41
34
|
|
|
42
35
|
Box(
|
|
@@ -52,6 +45,7 @@ fun Skeleton() {
|
|
|
52
45
|
}
|
|
53
46
|
|
|
54
47
|
@Composable
|
|
48
|
+
@InternalApi
|
|
55
49
|
fun Modifier.shimmerLoadingAnimation(
|
|
56
50
|
maxWidth: Int,
|
|
57
51
|
angleOfAxisY: Float = 0f,
|
|
@@ -4,25 +4,12 @@ import androidx.compose.animation.core.animateFloatAsState
|
|
|
4
4
|
import androidx.compose.animation.core.spring
|
|
5
5
|
import androidx.compose.foundation.background
|
|
6
6
|
import androidx.compose.foundation.border
|
|
7
|
-
import androidx.compose.foundation.layout
|
|
8
|
-
import androidx.compose.foundation.layout.BoxWithConstraints
|
|
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.size
|
|
14
|
-
import androidx.compose.foundation.layout.width
|
|
7
|
+
import androidx.compose.foundation.layout.*
|
|
15
8
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
16
|
-
import androidx.compose.runtime
|
|
17
|
-
import androidx.compose.runtime.getValue
|
|
18
|
-
import androidx.compose.runtime.mutableFloatStateOf
|
|
19
|
-
import androidx.compose.runtime.mutableStateOf
|
|
20
|
-
import androidx.compose.runtime.remember
|
|
21
|
-
import androidx.compose.runtime.setValue
|
|
9
|
+
import androidx.compose.runtime.*
|
|
22
10
|
import androidx.compose.ui.Alignment
|
|
23
11
|
import androidx.compose.ui.Modifier
|
|
24
12
|
import androidx.compose.ui.draw.clip
|
|
25
|
-
import androidx.compose.ui.graphics.Color
|
|
26
13
|
import androidx.compose.ui.input.pointer.pointerInput
|
|
27
14
|
import androidx.compose.ui.layout.onGloballyPositioned
|
|
28
15
|
import androidx.compose.ui.platform.LocalDensity
|
|
@@ -30,19 +17,12 @@ import androidx.compose.ui.text.style.TextAlign
|
|
|
30
17
|
import androidx.compose.ui.unit.IntOffset
|
|
31
18
|
import androidx.compose.ui.unit.dp
|
|
32
19
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
33
|
-
import vn.momo.kits.const
|
|
34
|
-
import vn.momo.kits.const.Colors
|
|
35
|
-
import vn.momo.kits.const.Radius
|
|
36
|
-
import vn.momo.kits.const.Spacing
|
|
37
|
-
import vn.momo.kits.const.Typography
|
|
20
|
+
import vn.momo.kits.const.*
|
|
38
21
|
import vn.momo.kits.modifier.conditional
|
|
39
|
-
import vn.momo.kits.modifier.shadow
|
|
40
22
|
import kotlin.math.abs
|
|
41
23
|
import kotlin.math.min
|
|
42
24
|
import kotlin.math.roundToInt
|
|
43
25
|
|
|
44
|
-
// ── Design constants ─────────────────────────────────────────────────────────
|
|
45
|
-
|
|
46
26
|
private val THUMB_SIZE = 20.dp
|
|
47
27
|
private val THUMB_BORDER = 3.dp
|
|
48
28
|
private val TRACK_HEIGHT = 4.dp
|
|
@@ -50,15 +30,10 @@ private val LABEL_PAD_H = Spacing.XS
|
|
|
50
30
|
private val LABEL_PAD_V = Spacing.XXS
|
|
51
31
|
private val LABEL_GAP = Spacing.XS // space between label and thumb top
|
|
52
32
|
|
|
53
|
-
// ── Pure helpers (mirrors RN helpers.ts) ─────────────────────────────────────
|
|
54
33
|
|
|
55
34
|
private fun clamp(value: Float, min: Float, max: Float): Float =
|
|
56
35
|
min(kotlin.math.max(value, min), max)
|
|
57
36
|
|
|
58
|
-
/**
|
|
59
|
-
* Converts a raw touch position into a snapped slider value.
|
|
60
|
-
* Direct port of RN getValueForPosition().
|
|
61
|
-
*/
|
|
62
37
|
private fun getValueForPosition(
|
|
63
38
|
positionInView: Float,
|
|
64
39
|
containerWidth: Float,
|