@momo-kits/native-kits 0.162.6-debug → 0.163.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.md +78 -0
- package/compose/build.gradle.kts +8 -11
- package/compose/build.gradle.kts.backup +7 -10
- package/compose/compose.podspec +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +7 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +5 -12
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +24 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +19 -4
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +10 -1
- 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 +16 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +101 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +15 -4
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +33 -8
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +25 -22
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +29 -27
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +26 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +30 -27
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +13 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +5 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +11 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +18 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +11 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +11 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +5 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +59 -84
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +71 -13
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +51 -10
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +1 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +21 -4
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +75 -16
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +26 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +11 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +36 -15
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +9 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +28 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +13 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +17 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +10 -4
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +28 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +47 -8
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +25 -4
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +11 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +17 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +6 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +111 -50
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +5 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +8 -7
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +12 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +96 -4
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +12 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +21 -9
- 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 +14 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +11 -8
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +40 -24
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +5 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +4 -94
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +5 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +15 -5
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +14 -65
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +33 -48
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +55 -56
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +9 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +31 -13
- 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 +24 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +6 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +1 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +3 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +13 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +2 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +40 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +8 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +17 -2
- 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 +3 -2
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +2 -0
- package/example/ios/Example.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/Pods-Example.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +46 -0
- package/gradle.properties +1 -1
- package/ios/Application/ApplicationEnvironment.swift +0 -1
- package/ios/Application/Components.swift +0 -1
- package/ios/Application/FloatingButton.swift +0 -1
- package/ios/Badge/Badge.swift +0 -1
- package/ios/Badge/BadgeRibbon.swift +0 -2
- package/ios/Button/Button.swift +1 -1
- package/ios/Checkbox/Checkbox.swift +0 -1
- package/ios/Input/Input.swift +0 -1
- package/ios/Input/InputPhoneNumber.swift +0 -1
- package/ios/Input/InputSearch.swift +0 -3
- package/ios/Input/InputTextArea.swift +0 -1
- package/ios/OTPKeyboard/KeyboardButton.swift +1 -1
- package/ios/Popup/PopupDisplay.swift +0 -6
- package/ios/Popup/PopupInput.swift +0 -2
- package/ios/Template/TrustBanner/TrustBanner.swift +0 -2
- package/ios/Typography/Text.swift +7 -13
- package/ios/Typography/Typography.swift +8 -22
- package/local.properties +8 -0
- package/package.json +1 -1
- package/ios/Application/FontScaleStore.swift +0 -59
- package/ios/Information/Information.swift +0 -151
|
@@ -3,9 +3,20 @@ 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.clickable
|
|
6
|
-
import androidx.compose.foundation.layout
|
|
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.wrapContentSize
|
|
7
14
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
8
|
-
import androidx.compose.runtime
|
|
15
|
+
import androidx.compose.runtime.Composable
|
|
16
|
+
import androidx.compose.runtime.MutableState
|
|
17
|
+
import androidx.compose.runtime.getValue
|
|
18
|
+
import androidx.compose.runtime.mutableStateOf
|
|
19
|
+
import androidx.compose.runtime.remember
|
|
9
20
|
import androidx.compose.ui.Alignment
|
|
10
21
|
import androidx.compose.ui.Modifier
|
|
11
22
|
import androidx.compose.ui.graphics.Color
|
|
@@ -16,8 +27,12 @@ import androidx.compose.ui.text.TextStyle
|
|
|
16
27
|
import androidx.compose.ui.unit.dp
|
|
17
28
|
import androidx.compose.ui.unit.sp
|
|
18
29
|
import androidx.compose.ui.zIndex
|
|
30
|
+
import vn.momo.kits.const.AppTheme
|
|
31
|
+
import vn.momo.kits.const.Spacing
|
|
19
32
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
20
|
-
import vn.momo.kits.const
|
|
33
|
+
import vn.momo.kits.const.Colors
|
|
34
|
+
import vn.momo.kits.const.Typography
|
|
35
|
+
import vn.momo.kits.const.scaleSize
|
|
21
36
|
import vn.momo.kits.modifier.conditional
|
|
22
37
|
|
|
23
38
|
@Composable
|
|
@@ -44,8 +59,24 @@ fun InputDropDown(
|
|
|
44
59
|
) {
|
|
45
60
|
val isFocused by remember { mutableStateOf(false) }
|
|
46
61
|
|
|
47
|
-
val
|
|
48
|
-
|
|
62
|
+
val disabledColor = AppTheme.current.colors.text.disable
|
|
63
|
+
var textColor = AppTheme.current.colors.text.default
|
|
64
|
+
var placeholderColor = AppTheme.current.colors.text.hint
|
|
65
|
+
var iconTintColor = iconColor
|
|
66
|
+
val floatingTitleColor = when {
|
|
67
|
+
disabled -> AppTheme.current.colors.text.disable
|
|
68
|
+
else -> floatingValueColor
|
|
69
|
+
}
|
|
70
|
+
val floatingIconTintColor = when {
|
|
71
|
+
disabled -> AppTheme.current.colors.text.disable
|
|
72
|
+
else -> floatingIconColor
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (disabled) {
|
|
76
|
+
textColor = disabledColor
|
|
77
|
+
placeholderColor = disabledColor
|
|
78
|
+
iconTintColor = disabledColor
|
|
79
|
+
}
|
|
49
80
|
|
|
50
81
|
val testId = if (disabled) "input_${floatingValue}_disabled" else "input_$floatingValue"
|
|
51
82
|
|
|
@@ -61,14 +92,41 @@ fun InputDropDown(
|
|
|
61
92
|
contentDescription = floatingValue; testTag = testId
|
|
62
93
|
}) {
|
|
63
94
|
Box {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
95
|
+
if (floatingValue.isNotEmpty() || floatingIcon.isNotEmpty()) {
|
|
96
|
+
Box(
|
|
97
|
+
modifier = Modifier.wrapContentSize()
|
|
98
|
+
.offset(y = -Spacing.S, x = Spacing.S)
|
|
99
|
+
.background(AppTheme.current.colors.background.surface)
|
|
100
|
+
.zIndex(10f),
|
|
101
|
+
) {
|
|
102
|
+
Row(
|
|
103
|
+
modifier = Modifier
|
|
104
|
+
.padding(horizontal = Spacing.S),
|
|
105
|
+
verticalAlignment = Alignment.CenterVertically
|
|
106
|
+
) {
|
|
107
|
+
Text(
|
|
108
|
+
floatingValue,
|
|
109
|
+
style = Typography.labelSMedium,
|
|
110
|
+
color = floatingTitleColor
|
|
111
|
+
)
|
|
112
|
+
if (required) {
|
|
113
|
+
Text(
|
|
114
|
+
"*",
|
|
115
|
+
style = Typography.labelSMedium,
|
|
116
|
+
color = AppTheme.current.colors.error.primary,
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
if (floatingIcon.isNotEmpty()) {
|
|
120
|
+
Icon(
|
|
121
|
+
source = floatingIcon,
|
|
122
|
+
modifier = Modifier.padding(start = Spacing.XS),
|
|
123
|
+
size = 16.dp,
|
|
124
|
+
color = floatingIconTintColor
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
72
130
|
Box(
|
|
73
131
|
modifier = Modifier.fillMaxWidth()
|
|
74
132
|
.height(if (size == InputSize.SMALL) 48.dp else 56.dp)
|
|
@@ -102,8 +102,24 @@ fun InputMoney(
|
|
|
102
102
|
) {
|
|
103
103
|
var isFocused by remember { mutableStateOf(false) }
|
|
104
104
|
var isBlurred = false
|
|
105
|
-
val
|
|
106
|
-
|
|
105
|
+
val disabledColor = AppTheme.current.colors.text.disable
|
|
106
|
+
var textColor = AppTheme.current.colors.text.default
|
|
107
|
+
var placeholderColor = AppTheme.current.colors.text.hint
|
|
108
|
+
var iconTintColor = iconColor
|
|
109
|
+
val floatingTitleColor = when {
|
|
110
|
+
disabled -> AppTheme.current.colors.text.disable
|
|
111
|
+
else -> floatingValueColor
|
|
112
|
+
}
|
|
113
|
+
val floatingIconTintColor = when {
|
|
114
|
+
disabled -> AppTheme.current.colors.text.disable
|
|
115
|
+
else -> floatingIconColor
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (disabled) {
|
|
119
|
+
textColor = disabledColor
|
|
120
|
+
placeholderColor = disabledColor
|
|
121
|
+
iconTintColor = disabledColor
|
|
122
|
+
}
|
|
107
123
|
|
|
108
124
|
val testId = if (disabled) "input_${floatingValue}_disabled" else "input_$floatingValue"
|
|
109
125
|
|
|
@@ -140,14 +156,39 @@ fun InputMoney(
|
|
|
140
156
|
},
|
|
141
157
|
decorationBox = { innerTextField ->
|
|
142
158
|
// Floating Icon
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
159
|
+
if (floatingValue.isNotEmpty() || floatingIcon.isNotEmpty()) {
|
|
160
|
+
Box(
|
|
161
|
+
modifier = Modifier.wrapContentSize()
|
|
162
|
+
.offset(y = (-size.values.height / 2), x = (Spacing.S))
|
|
163
|
+
.background(AppTheme.current.colors.background.surface)
|
|
164
|
+
.zIndex(10f),
|
|
165
|
+
) {
|
|
166
|
+
Row(
|
|
167
|
+
modifier = Modifier.padding(horizontal = Spacing.S),
|
|
168
|
+
) {
|
|
169
|
+
Text(
|
|
170
|
+
floatingValue,
|
|
171
|
+
style = Typography.labelSMedium,
|
|
172
|
+
color = floatingTitleColor
|
|
173
|
+
)
|
|
174
|
+
if (required) {
|
|
175
|
+
Text(
|
|
176
|
+
"*",
|
|
177
|
+
style = Typography.labelSMedium,
|
|
178
|
+
color = AppTheme.current.colors.error.primary,
|
|
179
|
+
)
|
|
180
|
+
}
|
|
181
|
+
if (floatingIcon.isNotEmpty()) {
|
|
182
|
+
Icon(
|
|
183
|
+
source = floatingIcon,
|
|
184
|
+
modifier = Modifier.padding(start = Spacing.XS),
|
|
185
|
+
size = 16.dp,
|
|
186
|
+
color = floatingIconTintColor
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
151
192
|
//input box wrapper
|
|
152
193
|
Box(
|
|
153
194
|
modifier = Modifier.fillMaxWidth()
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
package vn.momo.kits.components
|
|
2
2
|
|
|
3
|
-
import vn.momo.kits.modifier.InternalApi
|
|
4
|
-
|
|
5
3
|
import androidx.compose.animation.core.LinearEasing
|
|
6
4
|
import androidx.compose.animation.core.RepeatMode
|
|
7
5
|
import androidx.compose.animation.core.animateFloat
|
|
@@ -50,7 +48,6 @@ import vn.momo.kits.const.scaleSize
|
|
|
50
48
|
import vn.momo.kits.modifier.conditional
|
|
51
49
|
|
|
52
50
|
@Composable
|
|
53
|
-
@InternalApi
|
|
54
51
|
fun OTPCaret() {
|
|
55
52
|
val duration = 500
|
|
56
53
|
val backgroundColor = AppTheme.current.colors.primary
|
|
@@ -69,9 +66,7 @@ fun OTPCaret() {
|
|
|
69
66
|
)
|
|
70
67
|
)
|
|
71
68
|
|
|
72
|
-
Row(
|
|
73
|
-
verticalAlignment = Alignment.CenterVertically
|
|
74
|
-
) {
|
|
69
|
+
Row(verticalAlignment = Alignment.CenterVertically) {
|
|
75
70
|
Box(
|
|
76
71
|
modifier = Modifier
|
|
77
72
|
.size(1.dp, scaleSize(12f).dp)
|
|
@@ -4,11 +4,23 @@ 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
|
|
7
|
+
import androidx.compose.foundation.layout.Box
|
|
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
|
|
8
15
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
9
16
|
import androidx.compose.foundation.text.BasicTextField
|
|
10
17
|
import androidx.compose.foundation.text.KeyboardOptions
|
|
11
|
-
import androidx.compose.runtime
|
|
18
|
+
import androidx.compose.runtime.Composable
|
|
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
|
|
12
24
|
import androidx.compose.ui.Alignment
|
|
13
25
|
import androidx.compose.ui.Modifier
|
|
14
26
|
import androidx.compose.ui.focus.onFocusChanged
|
|
@@ -20,7 +32,12 @@ import androidx.compose.ui.text.input.KeyboardType
|
|
|
20
32
|
import androidx.compose.ui.unit.Dp
|
|
21
33
|
import androidx.compose.ui.unit.dp
|
|
22
34
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
23
|
-
import vn.momo.kits.const
|
|
35
|
+
import vn.momo.kits.const.AppTheme
|
|
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
|
|
24
41
|
import vn.momo.kits.modifier.conditional
|
|
25
42
|
import vn.momo.kits.modifier.setAutomationId
|
|
26
43
|
|
|
@@ -54,7 +71,7 @@ enum class InputPhoneNumberSize(val values: InputPhoneNumberSizeDetail) {
|
|
|
54
71
|
}
|
|
55
72
|
|
|
56
73
|
@Composable
|
|
57
|
-
|
|
74
|
+
fun getBorderColor(isFocused: Boolean, error: String): Color {
|
|
58
75
|
val theme = AppTheme.current
|
|
59
76
|
return remember(isFocused, error, theme) {
|
|
60
77
|
when {
|
|
@@ -4,11 +4,25 @@ 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
|
|
7
|
+
import androidx.compose.foundation.layout.Box
|
|
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
|
|
8
17
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
9
18
|
import androidx.compose.foundation.text.BasicTextField
|
|
10
19
|
import androidx.compose.foundation.text.KeyboardOptions
|
|
11
|
-
import androidx.compose.runtime
|
|
20
|
+
import androidx.compose.runtime.Composable
|
|
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
|
|
12
26
|
import androidx.compose.ui.Alignment
|
|
13
27
|
import androidx.compose.ui.Modifier
|
|
14
28
|
import androidx.compose.ui.focus.onFocusChanged
|
|
@@ -19,14 +33,16 @@ import androidx.compose.ui.unit.Dp
|
|
|
19
33
|
import androidx.compose.ui.unit.dp
|
|
20
34
|
import androidx.compose.ui.unit.sp
|
|
21
35
|
import androidx.compose.ui.zIndex
|
|
36
|
+
import vn.momo.kits.const.AppTheme
|
|
37
|
+
import vn.momo.kits.const.Spacing
|
|
22
38
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
23
|
-
import vn.momo.kits.const
|
|
24
|
-
import vn.momo.kits.
|
|
39
|
+
import vn.momo.kits.const.Colors
|
|
40
|
+
import vn.momo.kits.const.Typography
|
|
41
|
+
import vn.momo.kits.const.scaleSize
|
|
25
42
|
import vn.momo.kits.modifier.conditional
|
|
26
43
|
|
|
27
|
-
@InternalApi
|
|
28
44
|
const val MAX_LENGTH = 300
|
|
29
|
-
|
|
45
|
+
val DEFAULT_HEIGHT = 104.dp
|
|
30
46
|
|
|
31
47
|
@Composable
|
|
32
48
|
fun InputTextArea(
|
|
@@ -55,8 +71,24 @@ fun InputTextArea(
|
|
|
55
71
|
) {
|
|
56
72
|
var isFocused by remember { mutableStateOf(false) }
|
|
57
73
|
var isBlurred = false
|
|
58
|
-
val
|
|
59
|
-
|
|
74
|
+
val disabledColor = AppTheme.current.colors.text.disable
|
|
75
|
+
var textColor = AppTheme.current.colors.text.default
|
|
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
|
+
}
|
|
60
92
|
|
|
61
93
|
val fontSize = 16.sp
|
|
62
94
|
val lineHeight = 24.sp
|
|
@@ -93,14 +125,41 @@ fun InputTextArea(
|
|
|
93
125
|
},
|
|
94
126
|
decorationBox = { innerTextField ->
|
|
95
127
|
// Floating Icon
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
128
|
+
if (floatingValue.isNotEmpty() || floatingIcon.isNotEmpty()) {
|
|
129
|
+
Box(
|
|
130
|
+
modifier = Modifier.wrapContentSize()
|
|
131
|
+
.offset(y = (-scaleHeight / 2), x = (Spacing.S))
|
|
132
|
+
.background(AppTheme.current.colors.background.surface)
|
|
133
|
+
.zIndex(10f),
|
|
134
|
+
) {
|
|
135
|
+
Row(
|
|
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
|
+
}
|
|
104
163
|
//input box wrapper
|
|
105
164
|
Box(
|
|
106
165
|
modifier = Modifier.fillMaxWidth()
|
|
@@ -1,18 +1,39 @@
|
|
|
1
1
|
package vn.momo.kits.components
|
|
2
2
|
|
|
3
|
-
import androidx.compose.animation.core
|
|
3
|
+
import androidx.compose.animation.core.LinearEasing
|
|
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
|
|
4
9
|
import androidx.compose.foundation.Canvas
|
|
5
10
|
import androidx.compose.foundation.OverscrollEffect
|
|
6
11
|
import androidx.compose.foundation.background
|
|
7
12
|
import androidx.compose.foundation.gestures.FlingBehavior
|
|
8
13
|
import androidx.compose.foundation.gestures.ScrollableDefaults
|
|
9
|
-
import androidx.compose.foundation.layout
|
|
10
|
-
import androidx.compose.foundation.
|
|
14
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
15
|
+
import androidx.compose.foundation.layout.Box
|
|
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
|
|
11
25
|
import androidx.compose.material.ExperimentalMaterialApi
|
|
12
26
|
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
|
13
27
|
import androidx.compose.material.pullrefresh.pullRefresh
|
|
14
28
|
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
|
15
|
-
import androidx.compose.runtime
|
|
29
|
+
import androidx.compose.runtime.Composable
|
|
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
|
|
16
37
|
import androidx.compose.ui.Alignment
|
|
17
38
|
import androidx.compose.ui.Modifier
|
|
18
39
|
import androidx.compose.ui.composed
|
|
@@ -43,7 +64,7 @@ private const val BOX_KEY = "LazyColumnWithBouncing_BOX_KEY"
|
|
|
43
64
|
|
|
44
65
|
@OptIn(ExperimentalMaterialApi::class)
|
|
45
66
|
@Composable
|
|
46
|
-
|
|
67
|
+
fun overScrollWithPullToRefresh(
|
|
47
68
|
pullRefreshState: PullToRefreshCustomState?,
|
|
48
69
|
): OverscrollEffect {
|
|
49
70
|
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
|
-
|
|
21
|
+
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,7 +3,14 @@ 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
|
|
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
|
|
7
14
|
import androidx.compose.foundation.rememberScrollState
|
|
8
15
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
9
16
|
import androidx.compose.runtime.Composable
|
|
@@ -21,9 +28,10 @@ import vn.momo.kits.const.Colors
|
|
|
21
28
|
import vn.momo.kits.const.Spacing
|
|
22
29
|
import vn.momo.kits.modifier.conditional
|
|
23
30
|
|
|
24
|
-
|
|
25
|
-
|
|
31
|
+
val INDICATOR_WIDTH = 24.dp
|
|
32
|
+
val PROGRESS_WIDTH = 72.dp
|
|
26
33
|
|
|
34
|
+
// Memoized offset calculation to avoid repeated computations during scroll
|
|
27
35
|
private fun calculateOffset(currentPosition: Int, maxBound: Int): Dp {
|
|
28
36
|
return if (maxBound == 0) 0.dp else {
|
|
29
37
|
(PROGRESS_WIDTH - INDICATOR_WIDTH) * (currentPosition / maxBound.toFloat())
|
|
@@ -4,22 +4,42 @@ 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
|
|
7
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
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
|
|
8
18
|
import androidx.compose.foundation.lazy.LazyColumn
|
|
9
19
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
10
|
-
import androidx.compose.runtime
|
|
20
|
+
import androidx.compose.runtime.Composable
|
|
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
|
|
11
27
|
import androidx.compose.ui.Alignment
|
|
12
28
|
import androidx.compose.ui.Modifier
|
|
13
29
|
import androidx.compose.ui.draw.clip
|
|
14
|
-
import androidx.compose.ui.platform.LocalDensity
|
|
15
30
|
import androidx.compose.ui.text.TextLayoutResult
|
|
16
|
-
import androidx.compose.ui.unit.Dp
|
|
17
31
|
import androidx.compose.ui.unit.dp
|
|
18
|
-
import vn.momo.kits.
|
|
32
|
+
import vn.momo.kits.const.AppTheme
|
|
33
|
+
import vn.momo.kits.const.Radius
|
|
34
|
+
import vn.momo.kits.const.Spacing
|
|
19
35
|
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
20
|
-
import vn.momo.kits.const
|
|
36
|
+
import vn.momo.kits.const.Colors
|
|
37
|
+
import vn.momo.kits.const.Typography
|
|
21
38
|
import vn.momo.kits.modifier.conditional
|
|
22
39
|
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
|
|
23
43
|
import kotlin.math.min
|
|
24
44
|
|
|
25
45
|
data class PopupAction(
|
|
@@ -35,8 +55,9 @@ enum class PopupActionDirection {
|
|
|
35
55
|
|
|
36
56
|
private fun heightForLines(
|
|
37
57
|
layout: TextLayoutResult,
|
|
58
|
+
targetLines: Float
|
|
38
59
|
): Float {
|
|
39
|
-
val clampedLines =
|
|
60
|
+
val clampedLines = targetLines.coerceAtLeast(1f)
|
|
40
61
|
val wholeLines = kotlin.math.floor(clampedLines).toInt()
|
|
41
62
|
val fractionalPart = clampedLines - wholeLines
|
|
42
63
|
|
|
@@ -90,7 +111,7 @@ fun PopupNotify(
|
|
|
90
111
|
layoutResult.value?.let { v ->
|
|
91
112
|
// cap visible height at ~8.5 lines
|
|
92
113
|
val textPx = v.size.height.toFloat()
|
|
93
|
-
val capPx = heightForLines(v)
|
|
114
|
+
val capPx = heightForLines(v, 8.5f)
|
|
94
115
|
|
|
95
116
|
isScroll = textPx >= capPx
|
|
96
117
|
scrollHeight = with(density) { min(textPx, capPx).toDp() }
|
|
@@ -215,7 +236,7 @@ fun PopupNotify(
|
|
|
215
236
|
}
|
|
216
237
|
|
|
217
238
|
@Composable
|
|
218
|
-
|
|
239
|
+
fun BuildAction(
|
|
219
240
|
primary: PopupAction?,
|
|
220
241
|
secondary: PopupAction?,
|
|
221
242
|
buttonDirection: PopupActionDirection = PopupActionDirection.ROW,
|
|
@@ -225,14 +246,14 @@ internal fun BuildAction(
|
|
|
225
246
|
when (buttonDirection) {
|
|
226
247
|
PopupActionDirection.AUTO -> {
|
|
227
248
|
if (secondary != null && (secondary.title.length > 12 || primary?.title?.length!! > 12)) {
|
|
228
|
-
|
|
249
|
+
renderColumn(
|
|
229
250
|
secondary = secondary,
|
|
230
251
|
onAction = onAction,
|
|
231
252
|
closeAction = closeAction,
|
|
232
253
|
primary = primary
|
|
233
254
|
)
|
|
234
255
|
} else {
|
|
235
|
-
|
|
256
|
+
renderRow(
|
|
236
257
|
secondary = secondary,
|
|
237
258
|
onAction = onAction,
|
|
238
259
|
closeAction = closeAction,
|
|
@@ -241,14 +262,14 @@ internal fun BuildAction(
|
|
|
241
262
|
}
|
|
242
263
|
}
|
|
243
264
|
|
|
244
|
-
PopupActionDirection.ROW ->
|
|
265
|
+
PopupActionDirection.ROW -> renderRow(
|
|
245
266
|
secondary = secondary,
|
|
246
267
|
onAction = onAction,
|
|
247
268
|
closeAction = closeAction,
|
|
248
269
|
primary = primary
|
|
249
270
|
)
|
|
250
271
|
|
|
251
|
-
else ->
|
|
272
|
+
else -> renderColumn(
|
|
252
273
|
secondary = secondary,
|
|
253
274
|
onAction = onAction,
|
|
254
275
|
closeAction = closeAction,
|
|
@@ -258,7 +279,7 @@ internal fun BuildAction(
|
|
|
258
279
|
}
|
|
259
280
|
|
|
260
281
|
@Composable
|
|
261
|
-
|
|
282
|
+
fun renderRow(
|
|
262
283
|
secondary: PopupAction?,
|
|
263
284
|
closeAction: MutableState<String>,
|
|
264
285
|
primary: PopupAction?,
|
|
@@ -295,7 +316,7 @@ internal fun RenderRow(
|
|
|
295
316
|
}
|
|
296
317
|
|
|
297
318
|
@Composable
|
|
298
|
-
|
|
319
|
+
fun renderColumn(
|
|
299
320
|
secondary: PopupAction?,
|
|
300
321
|
closeAction: MutableState<String>,
|
|
301
322
|
primary: PopupAction?,
|
|
@@ -4,7 +4,13 @@ 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
|
|
7
|
+
import androidx.compose.foundation.layout.Box
|
|
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
|
|
8
14
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
9
15
|
import androidx.compose.runtime.Composable
|
|
10
16
|
import androidx.compose.runtime.remember
|
|
@@ -13,10 +19,10 @@ import androidx.compose.ui.Modifier
|
|
|
13
19
|
import androidx.compose.ui.draw.clip
|
|
14
20
|
import androidx.compose.ui.layout.ContentScale
|
|
15
21
|
import androidx.compose.ui.unit.dp
|
|
16
|
-
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
17
22
|
import vn.momo.kits.const.AppTheme
|
|
18
|
-
import vn.momo.kits.const.Colors
|
|
19
23
|
import vn.momo.kits.const.Radius
|
|
24
|
+
import vn.momo.kits.application.IsShowBaseLineDebug
|
|
25
|
+
import vn.momo.kits.const.Colors
|
|
20
26
|
import vn.momo.kits.const.Spacing
|
|
21
27
|
import vn.momo.kits.modifier.conditional
|
|
22
28
|
import vn.momo.kits.modifier.setAutomationId
|