@momo-kits/native-kits 0.162.2-sp.7-debug → 0.162.2-sp.8-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 (160) hide show
  1. package/.claude/settings.local.json +15 -1
  2. package/CLAUDE.md +78 -0
  3. package/compose/build.gradle.kts +12 -31
  4. package/compose/build.gradle.kts.backup +11 -30
  5. package/compose/compose.podspec +1 -1
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +7 -0
  7. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +2 -7
  8. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +8 -11
  9. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +6 -24
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +4 -19
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +1 -10
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +2 -2
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +1 -1
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +1 -1
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +6 -17
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +1 -1
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +6 -101
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +8 -19
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +8 -33
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +1 -1
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +22 -25
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +27 -29
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +3 -26
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +30 -31
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +3 -13
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -5
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +3 -11
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +3 -18
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +11 -11
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +42 -65
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +69 -26
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +1 -5
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +84 -59
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +13 -71
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +10 -51
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +6 -1
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +4 -21
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +1 -1
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +16 -75
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +5 -26
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +1 -1
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +3 -11
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +16 -40
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +3 -9
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -28
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +2 -13
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +4 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +4 -10
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +3 -28
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +8 -47
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +4 -25
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +2 -11
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +1 -17
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +1 -6
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +50 -111
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +1 -5
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +1 -5
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +1 -12
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +4 -96
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +5 -7
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +2 -12
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +9 -21
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +2 -2
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +9 -14
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +8 -11
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +22 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +1 -1
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +11 -20
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +1 -1
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -5
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -2
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +94 -4
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -2
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +2 -2
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +3 -7
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +9 -15
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +36 -24
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +48 -33
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +67 -61
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +6 -13
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +13 -31
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +1 -1
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +6 -24
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +11 -6
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +2 -1
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +9 -6
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +1 -1
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +3 -13
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +3 -2
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +1 -40
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -2
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +9 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -8
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +2 -17
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +1 -1
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +3 -3
  98. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +2 -3
  99. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +66 -0
  100. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -2
  101. package/gradle/libs.versions.toml +2 -0
  102. package/gradle.properties +1 -1
  103. package/ios/Application/ApplicationEnvironment.swift +4 -2
  104. package/ios/Application/Components.swift +16 -0
  105. package/ios/Application/Localize.swift +277 -0
  106. package/ios/Application/MaxApi.swift +18 -0
  107. package/ios/Application/Navigation/BottomTab/BottomTab.swift +1 -0
  108. package/ios/Application/Navigation/NavigationContainer.swift +27 -3
  109. package/ios/Application/Navigation/Navigator.swift +50 -29
  110. package/ios/Application/Navigation/Overplay/BottomSheet.swift +87 -19
  111. package/ios/Application/Navigation/Overplay/ModalScreen.swift +6 -0
  112. package/ios/Application/Navigation/Tracking/ScreenTracker.swift +117 -0
  113. package/ios/Application/Screen.swift +1 -1
  114. package/ios/Application/StackScreen.swift +49 -1
  115. package/ios/Badge/BadgeRibbon.swift +80 -0
  116. package/ios/Button/Button.swift +68 -12
  117. package/ios/Carousel/Carousel.swift +16 -1
  118. package/ios/Checkbox/Checkbox.swift +14 -20
  119. package/ios/Chip/Chip.swift +35 -26
  120. package/ios/Collapse/Collapse.swift +11 -1
  121. package/ios/Colors+Radius+Spacing/Colors.swift +9 -6
  122. package/ios/Colors+Radius+Spacing/Spacing.swift +3 -1
  123. package/ios/DateTimePicker/DateTimePicker.swift +4 -2
  124. package/ios/DateTimePicker/WheelPicker.swift +7 -3
  125. package/ios/Extensions/ActiveOpacityButtonStyle.swift +14 -0
  126. package/ios/Extensions/Color++.swift +5 -2
  127. package/ios/Icon/Icon.swift +5 -1
  128. package/ios/IconButton/IconButton.swift +35 -7
  129. package/ios/Image/Image.swift +16 -3
  130. package/ios/Information/Information.swift +3 -1
  131. package/ios/Input/ErrorView.swift +3 -1
  132. package/ios/Input/Input.swift +31 -8
  133. package/ios/Input/InputPhoneNumber.swift +14 -3
  134. package/ios/Input/InputSearch.swift +7 -1
  135. package/ios/Input/InputTextArea.swift +78 -34
  136. package/ios/InputDropDown/InputDropDown.swift +4 -1
  137. package/ios/InputMoney/InputMoney.swift +16 -4
  138. package/ios/PARITY_AUDIT.md +641 -0
  139. package/ios/Popup/PopupDisplay.swift +3 -4
  140. package/ios/Popup/PopupNotify.swift +3 -4
  141. package/ios/Popup/PopupPromotion.swift +16 -8
  142. package/ios/ProgressInfo/ProgressInfo.swift +4 -2
  143. package/ios/Radio/Radio.swift +12 -13
  144. package/ios/Rating/Rating.swift +1 -1
  145. package/ios/Stepper/Stepper.swift +2 -2
  146. package/ios/Steps/Steps.swift +22 -6
  147. package/ios/SuggestAction/SuggestAction.swift +5 -3
  148. package/ios/Swipeable/SwipeCell.swift +5 -3
  149. package/ios/Switch/Switch.swift +53 -28
  150. package/ios/TabView/TabView.swift +18 -14
  151. package/ios/Template/TrustBanner/TrustBanner.swift +6 -7
  152. package/ios/Tooltip/Tooltip.swift +3 -0
  153. package/ios/Typography/FontScaleStore.swift +19 -0
  154. package/ios/Typography/Text.swift +3 -0
  155. package/ios/Typography/Typography.swift +8 -5
  156. package/ios/Uploader/Uploader.swift +0 -9
  157. package/ios/native-kits.podspec +1 -1
  158. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  159. package/package.json +1 -1
  160. package/ios/Colors+Radius+Spacing/MoMoUIKitsResources.swift +0 -2
@@ -102,24 +102,8 @@ fun InputMoney(
102
102
  ) {
103
103
  var isFocused by remember { mutableStateOf(false) }
104
104
  var isBlurred = false
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
- }
105
+ val (textColor, placeholderColor, iconTintColor, floatingTitleColor, floatingIconTintColor) =
106
+ getInputColors(disabled, iconColor, floatingValueColor, floatingIconColor)
123
107
 
124
108
  val testId = if (disabled) "input_${floatingValue}_disabled" else "input_$floatingValue"
125
109
 
@@ -156,39 +140,14 @@ fun InputMoney(
156
140
  },
157
141
  decorationBox = { innerTextField ->
158
142
  // Floating Icon
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
- }
143
+ FloatingLabel(
144
+ floatingValue = floatingValue,
145
+ floatingIcon = floatingIcon,
146
+ titleColor = floatingTitleColor,
147
+ iconColor = floatingIconTintColor,
148
+ offsetY = -size.values.height / 2,
149
+ required = required,
150
+ )
192
151
  //input box wrapper
193
152
  Box(
194
153
  modifier = Modifier.fillMaxWidth()
@@ -1,5 +1,7 @@
1
1
  package vn.momo.kits.components
2
2
 
3
+ import vn.momo.kits.modifier.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(verticalAlignment = Alignment.CenterVertically) {
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.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
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.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
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.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
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 {
@@ -46,7 +46,7 @@ import vn.momo.kits.modifier.conditional
46
46
  import vn.momo.kits.utils.ifTrue
47
47
 
48
48
  @Composable
49
- fun RenderRightIconSearch(
49
+ internal fun RenderRightIconSearch(
50
50
  loading: Boolean,
51
51
  icon: String,
52
52
  color: Color,
@@ -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.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
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.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
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,14 @@ 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.Colors
40
- import vn.momo.kits.const.Typography
41
- import vn.momo.kits.const.scaleSize
23
+ import vn.momo.kits.const.*
24
+ import vn.momo.kits.modifier.InternalApi
42
25
  import vn.momo.kits.modifier.conditional
43
26
 
27
+ @InternalApi
44
28
  const val MAX_LENGTH = 300
45
- val DEFAULT_HEIGHT = 104.dp
29
+ internal val DEFAULT_HEIGHT = 104.dp
46
30
 
47
31
  @Composable
48
32
  fun InputTextArea(
@@ -71,24 +55,8 @@ fun InputTextArea(
71
55
  ) {
72
56
  var isFocused by remember { mutableStateOf(false) }
73
57
  var isBlurred = false
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
- }
58
+ val (textColor, placeholderColor, iconTintColor, floatingTitleColor, floatingIconTintColor) =
59
+ getInputColors(disabled, iconColor, floatingValueColor, floatingIconColor)
92
60
 
93
61
  val fontSize = 16.sp
94
62
  val lineHeight = 24.sp
@@ -125,41 +93,14 @@ fun InputTextArea(
125
93
  },
126
94
  decorationBox = { innerTextField ->
127
95
  // Floating Icon
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
- }
96
+ FloatingLabel(
97
+ floatingValue = floatingValue,
98
+ floatingIcon = floatingIcon,
99
+ titleColor = floatingTitleColor,
100
+ iconColor = floatingIconTintColor,
101
+ offsetY = -scaleHeight / 2,
102
+ required = required,
103
+ )
163
104
  //input box wrapper
164
105
  Box(
165
106
  modifier = Modifier.fillMaxWidth()
@@ -1,39 +1,18 @@
1
1
  package vn.momo.kits.components
2
2
 
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
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.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
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.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
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.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
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.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
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.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
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.const.AppTheme
33
- import vn.momo.kits.const.Radius
34
- import vn.momo.kits.const.Spacing
35
18
  import vn.momo.kits.application.IsShowBaseLineDebug
36
- import vn.momo.kits.const.Colors
37
- import vn.momo.kits.const.Typography
19
+ import vn.momo.kits.application.LocalLocalize
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 = targetLines.coerceAtLeast(1f)
39
+ val clampedLines = (8.5f).coerceAtLeast(1f)
61
40
  val wholeLines = kotlin.math.floor(clampedLines).toInt()
62
41
  val fractionalPart = clampedLines - wholeLines
63
42
 
@@ -104,14 +83,11 @@ fun PopupNotify(
104
83
  }
105
84
  }
106
85
 
107
- val language = AppLanguage.current ?: "vi"
108
- val errorCode: Map<String, String> = mapOf("vi" to "Mã lỗi: ", "en" to "Error code: ")
109
-
110
86
  LaunchedEffect(layoutResult.value) {
111
87
  layoutResult.value?.let { v ->
112
88
  // cap visible height at ~8.5 lines
113
89
  val textPx = v.size.height.toFloat()
114
- val capPx = heightForLines(v, 8.5f)
90
+ val capPx = heightForLines(v)
115
91
 
116
92
  isScroll = textPx >= capPx
117
93
  scrollHeight = with(density) { min(textPx, capPx).toDp() }
@@ -182,7 +158,7 @@ fun PopupNotify(
182
158
  content(Modifier.padding(top = Spacing.S))
183
159
  if (props.error.isNotEmpty()) {
184
160
  Text(
185
- text = errorCode[language] + props.error,
161
+ text = LocalLocalize.current.translate("errorCode") + props.error,
186
162
  style = Typography.descriptionXsRegular,
187
163
  color = AppTheme.current.colors.text.hint,
188
164
  maxLines = 1,
@@ -236,7 +212,7 @@ fun PopupNotify(
236
212
  }
237
213
 
238
214
  @Composable
239
- fun BuildAction(
215
+ internal fun BuildAction(
240
216
  primary: PopupAction?,
241
217
  secondary: PopupAction?,
242
218
  buttonDirection: PopupActionDirection = PopupActionDirection.ROW,
@@ -246,14 +222,14 @@ fun BuildAction(
246
222
  when (buttonDirection) {
247
223
  PopupActionDirection.AUTO -> {
248
224
  if (secondary != null && (secondary.title.length > 12 || primary?.title?.length!! > 12)) {
249
- renderColumn(
225
+ RenderColumn(
250
226
  secondary = secondary,
251
227
  onAction = onAction,
252
228
  closeAction = closeAction,
253
229
  primary = primary
254
230
  )
255
231
  } else {
256
- renderRow(
232
+ RenderRow(
257
233
  secondary = secondary,
258
234
  onAction = onAction,
259
235
  closeAction = closeAction,
@@ -262,14 +238,14 @@ fun BuildAction(
262
238
  }
263
239
  }
264
240
 
265
- PopupActionDirection.ROW -> renderRow(
241
+ PopupActionDirection.ROW -> RenderRow(
266
242
  secondary = secondary,
267
243
  onAction = onAction,
268
244
  closeAction = closeAction,
269
245
  primary = primary
270
246
  )
271
247
 
272
- else -> renderColumn(
248
+ else -> RenderColumn(
273
249
  secondary = secondary,
274
250
  onAction = onAction,
275
251
  closeAction = closeAction,
@@ -279,7 +255,7 @@ fun BuildAction(
279
255
  }
280
256
 
281
257
  @Composable
282
- fun renderRow(
258
+ internal fun RenderRow(
283
259
  secondary: PopupAction?,
284
260
  closeAction: MutableState<String>,
285
261
  primary: PopupAction?,
@@ -316,7 +292,7 @@ fun renderRow(
316
292
  }
317
293
 
318
294
  @Composable
319
- fun renderColumn(
295
+ internal fun RenderColumn(
320
296
  secondary: PopupAction?,
321
297
  closeAction: MutableState<String>,
322
298
  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.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
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.clickable
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.AppTheme
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
 
@@ -4,6 +4,10 @@ import androidx.compose.runtime.Composable
4
4
  import androidx.compose.runtime.CompositionLocalProvider
5
5
  import vn.momo.kits.application.ScaleSizeMaxRate
6
6
 
7
+ @Deprecated(
8
+ "Max font scale is fixed at MAX_FONT_SCALE (1.5); this override is no longer applied. Remove the wrapper.",
9
+ ReplaceWith("content()"),
10
+ )
7
11
  @Composable
8
12
  fun ScaleSizeScope(
9
13
  scaleSizeMaxRate: Float? = null,