@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.
Files changed (123) hide show
  1. package/CLAUDE.md +78 -0
  2. package/compose/build.gradle.kts +8 -11
  3. package/compose/build.gradle.kts.backup +7 -10
  4. package/compose/compose.podspec +1 -1
  5. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +7 -2
  6. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +5 -12
  7. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +24 -6
  8. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +19 -4
  9. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +10 -1
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +2 -2
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +1 -1
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +1 -1
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +16 -5
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +1 -1
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +101 -6
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +15 -4
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +33 -8
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +1 -1
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +25 -22
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +29 -27
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +26 -3
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +30 -27
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +13 -3
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +5 -0
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +11 -3
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +18 -3
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +11 -11
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +11 -3
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +5 -1
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +59 -84
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +71 -13
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +51 -10
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +1 -6
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +21 -4
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +1 -1
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +75 -16
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +26 -5
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +1 -1
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +11 -3
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +36 -15
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +9 -3
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +28 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +13 -2
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +17 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +10 -4
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +28 -3
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +47 -8
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +25 -4
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +11 -2
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +17 -1
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +6 -1
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +111 -50
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +5 -1
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +8 -7
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +12 -1
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +96 -4
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +12 -2
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +21 -9
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +2 -2
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +14 -9
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +11 -8
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +1 -1
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +40 -24
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +1 -1
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +5 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +2 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +4 -94
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +2 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +5 -1
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +15 -5
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +14 -65
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +33 -48
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +55 -56
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +9 -3
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +31 -13
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +1 -1
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +24 -6
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +6 -11
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +1 -2
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +3 -6
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +1 -1
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +13 -3
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +2 -3
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +40 -1
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +2 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +8 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +17 -2
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +1 -1
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +3 -3
  91. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +3 -2
  92. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +2 -0
  93. package/example/ios/Example.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  94. package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  95. package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
  96. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +58 -0
  97. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/Pods-Example.xcscheme +58 -0
  98. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
  99. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
  100. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
  101. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +46 -0
  102. package/gradle.properties +1 -1
  103. package/ios/Application/ApplicationEnvironment.swift +0 -1
  104. package/ios/Application/Components.swift +0 -1
  105. package/ios/Application/FloatingButton.swift +0 -1
  106. package/ios/Badge/Badge.swift +0 -1
  107. package/ios/Badge/BadgeRibbon.swift +0 -2
  108. package/ios/Button/Button.swift +1 -1
  109. package/ios/Checkbox/Checkbox.swift +0 -1
  110. package/ios/Input/Input.swift +0 -1
  111. package/ios/Input/InputPhoneNumber.swift +0 -1
  112. package/ios/Input/InputSearch.swift +0 -3
  113. package/ios/Input/InputTextArea.swift +0 -1
  114. package/ios/OTPKeyboard/KeyboardButton.swift +1 -1
  115. package/ios/Popup/PopupDisplay.swift +0 -6
  116. package/ios/Popup/PopupInput.swift +0 -2
  117. package/ios/Template/TrustBanner/TrustBanner.swift +0 -2
  118. package/ios/Typography/Text.swift +7 -13
  119. package/ios/Typography/Typography.swift +8 -22
  120. package/local.properties +8 -0
  121. package/package.json +1 -1
  122. package/ios/Application/FontScaleStore.swift +0 -59
  123. 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 (textColor, placeholderColor, iconTintColor, floatingTitleColor, floatingIconTintColor) =
48
- getInputColors(disabled, iconColor, floatingValueColor, floatingIconColor)
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
- FloatingLabel(
65
- floatingValue = floatingValue,
66
- floatingIcon = floatingIcon,
67
- titleColor = floatingTitleColor,
68
- iconColor = floatingIconTintColor,
69
- offsetY = -Spacing.S,
70
- required = required,
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 (textColor, placeholderColor, iconTintColor, floatingTitleColor, floatingIconTintColor) =
106
- getInputColors(disabled, iconColor, floatingValueColor, floatingIconColor)
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
- FloatingLabel(
144
- floatingValue = floatingValue,
145
- floatingIcon = floatingIcon,
146
- titleColor = floatingTitleColor,
147
- iconColor = floatingIconTintColor,
148
- offsetY = -size.values.height / 2,
149
- required = required,
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
- private fun getBorderColor(isFocused: Boolean, error: String): Color {
74
+ fun getBorderColor(isFocused: Boolean, error: String): Color {
58
75
  val theme = AppTheme.current
59
76
  return remember(isFocused, error, theme) {
60
77
  when {
@@ -46,7 +46,7 @@ import vn.momo.kits.modifier.conditional
46
46
  import vn.momo.kits.utils.ifTrue
47
47
 
48
48
  @Composable
49
- internal fun RenderRightIconSearch(
49
+ fun RenderRightIconSearch(
50
50
  loading: Boolean,
51
51
  icon: String,
52
52
  color: Color,
@@ -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.modifier.InternalApi
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
- internal val DEFAULT_HEIGHT = 104.dp
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 (textColor, placeholderColor, iconTintColor, floatingTitleColor, floatingIconTintColor) =
59
- getInputColors(disabled, iconColor, floatingValueColor, floatingIconColor)
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
- FloatingLabel(
97
- floatingValue = floatingValue,
98
- floatingIcon = floatingIcon,
99
- titleColor = floatingTitleColor,
100
- iconColor = floatingIconTintColor,
101
- offsetY = -scaleHeight / 2,
102
- required = required,
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.lazy.*
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
- internal fun overScrollWithPullToRefresh(
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
- internal fun Dot(active: Boolean = false, activeColor: Color, modifier: Modifier = Modifier) {
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
- private val INDICATOR_WIDTH = 24.dp
25
- private val PROGRESS_WIDTH = 72.dp
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.application.AppLanguage
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 = (8.5f).coerceAtLeast(1f)
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
- internal fun BuildAction(
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
- RenderColumn(
249
+ renderColumn(
229
250
  secondary = secondary,
230
251
  onAction = onAction,
231
252
  closeAction = closeAction,
232
253
  primary = primary
233
254
  )
234
255
  } else {
235
- RenderRow(
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 -> RenderRow(
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 -> RenderColumn(
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
- internal fun RenderRow(
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
- internal fun RenderColumn(
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