@momo-kits/native-kits 0.162.3-debug → 0.162.3-fontscale.1

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 (168) hide show
  1. package/.codegraph/.gitignore +5 -0
  2. package/CLAUDE.md +78 -0
  3. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +32 -0
  4. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  5. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  6. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +16 -0
  7. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +6 -0
  8. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
  9. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +58 -0
  10. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +58 -0
  11. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
  12. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
  13. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
  14. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +58 -0
  15. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +58 -0
  16. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +60 -0
  17. package/ios/Application/Components.swift +1 -0
  18. package/ios/Application/FloatingButton.swift +1 -0
  19. package/ios/Badge/Badge.swift +1 -0
  20. package/ios/Badge/BadgeRibbon.swift +2 -0
  21. package/ios/Button/Button.swift +1 -1
  22. package/ios/Checkbox/Checkbox.swift +1 -0
  23. package/ios/Information/Information.swift +151 -0
  24. package/ios/Input/Input.swift +1 -0
  25. package/ios/Input/InputPhoneNumber.swift +1 -0
  26. package/ios/Input/InputSearch.swift +3 -0
  27. package/ios/Input/InputTextArea.swift +1 -0
  28. package/ios/OTPKeyboard/KeyboardButton.swift +1 -1
  29. package/ios/Popup/PopupDisplay.swift +6 -0
  30. package/ios/Popup/PopupInput.swift +2 -0
  31. package/ios/Template/TrustBanner/TrustBanner.swift +2 -0
  32. package/ios/Typography/Text.swift +1 -0
  33. package/ios/Typography/Typography.swift +14 -5
  34. package/package.json +1 -1
  35. package/build.gradle.kts +0 -11
  36. package/compose/build.gradle.kts +0 -186
  37. package/compose/build.gradle.kts.backup +0 -186
  38. package/compose/compose.podspec +0 -47
  39. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  40. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -123
  41. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  42. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  43. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  44. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  45. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  46. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  47. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  48. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  49. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  50. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  51. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  52. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  53. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  54. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -57
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -109
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -201
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -222
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -48
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -305
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -921
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -121
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -403
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -87
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -340
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -198
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -357
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -123
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -94
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -136
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -224
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -148
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -188
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -116
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -452
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -172
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -255
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -235
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -233
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -259
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -241
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -364
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -92
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -352
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -103
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -338
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -70
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -96
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -348
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -256
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -494
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -131
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -215
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -96
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -531
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -92
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -135
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -214
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -590
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -177
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -192
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -205
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -239
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -191
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -285
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -2
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -35
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -2
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -57
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -68
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -14
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -50
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -253
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -133
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -104
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -145
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -345
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -556
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -161
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -243
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -187
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -315
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -80
  149. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -306
  150. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -34
  151. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -370
  152. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -131
  153. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -167
  154. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -72
  155. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -66
  156. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  157. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -70
  158. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  159. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -105
  160. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -33
  161. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -186
  162. package/gradle/libs.versions.toml +0 -67
  163. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  164. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  165. package/gradle.properties +0 -26
  166. package/gradlew +0 -252
  167. package/gradlew.bat +0 -94
  168. package/settings.gradle.kts +0 -64
@@ -1,241 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import androidx.compose.foundation.background
4
- import androidx.compose.foundation.border
5
- import androidx.compose.foundation.clickable
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
17
- import androidx.compose.foundation.shape.RoundedCornerShape
18
- import androidx.compose.foundation.text.BasicTextField
19
- 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
26
- import androidx.compose.ui.Alignment
27
- import androidx.compose.ui.Modifier
28
- import androidx.compose.ui.focus.onFocusChanged
29
- import androidx.compose.ui.graphics.Color
30
- import androidx.compose.ui.text.TextStyle
31
- import androidx.compose.ui.text.input.KeyboardType
32
- import androidx.compose.ui.unit.Dp
33
- import androidx.compose.ui.unit.dp
34
- import androidx.compose.ui.unit.sp
35
- import androidx.compose.ui.zIndex
36
- import vn.momo.kits.const.AppTheme
37
- import vn.momo.kits.const.Spacing
38
- 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
42
- import vn.momo.kits.modifier.conditional
43
-
44
- const val MAX_LENGTH = 300
45
- val DEFAULT_HEIGHT = 104.dp
46
-
47
- @Composable
48
- fun InputTextArea(
49
- text: MutableState<String> = remember { mutableStateOf("") },
50
- maxLength: Int = MAX_LENGTH,
51
- height: Dp = DEFAULT_HEIGHT,
52
- floatingValue: String = "",
53
- floatingValueColor: Color = AppTheme.current.colors.text.hint,
54
- floatingIcon: String = "",
55
- floatingIconColor: Color = AppTheme.current.colors.text.default,
56
- placeholder: String = "",
57
- size: InputSize = InputSize.SMALL,
58
- onChangeText: (String) -> Unit = {},
59
- error: String = "",
60
- errorSpacing: Boolean = false,
61
- disabled: Boolean = false,
62
- icon: String = "",
63
- iconColor: Color = AppTheme.current.colors.text.default,
64
- onRightIconPressed: () -> Unit = {},
65
- onFocus: () -> Unit = {},
66
- onBlur: () -> Unit = {},
67
- loading: Boolean = false,
68
- required: Boolean = false,
69
- fontWeight: InputFontWeight = InputFontWeight.REGULAR,
70
- keyboardType: KeyboardType = KeyboardType.Text,
71
- ) {
72
- var isFocused by remember { mutableStateOf(false) }
73
- 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
- }
92
-
93
- val fontSize = 16.sp
94
- val lineHeight = 24.sp
95
- val scaleFontSize = scaleSize(16.sp)
96
- val scaleLineHeight = scaleSize(24.sp)
97
- val scaleHeight = scaleSize(height)
98
-
99
- Column(modifier = Modifier.conditional(IsShowBaseLineDebug) {
100
- border(1.dp, Colors.blue_03)
101
- }) {
102
- BasicTextField(
103
- enabled = !disabled,
104
- singleLine = false,
105
- value = text.value,
106
- textStyle = TextStyle(
107
- color = textColor,
108
- fontSize = scaleFontSize,
109
- lineHeight = scaleLineHeight,
110
- fontWeight = fontWeight.value
111
- ),
112
- keyboardOptions = KeyboardOptions.Default.copy(keyboardType = keyboardType),
113
- modifier = Modifier.height(scaleHeight).onFocusChanged {
114
- isFocused = it.isFocused
115
- if (it.isFocused) {
116
- onFocus()
117
- }
118
- if (!it.isFocused && isBlurred) onBlur()
119
- if (it.isFocused && !isBlurred) isBlurred = true
120
- },
121
- onValueChange = {
122
- if (it.length <= maxLength) {
123
- onChangeText(it)
124
- }
125
- },
126
- decorationBox = { innerTextField ->
127
- // 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
- }
163
- //input box wrapper
164
- Box(
165
- modifier = Modifier.fillMaxWidth()
166
- .background(
167
- AppTheme.current.colors.background.surface,
168
- RoundedCornerShape(size.values.borderRadius)
169
- )
170
- .border(
171
- 1.dp,
172
- getBorderColor(isFocused, error, disabled),
173
- RoundedCornerShape(size.values.borderRadius)
174
- ),
175
- contentAlignment = Alignment.TopStart
176
- ) {
177
- Column {
178
- Row(
179
- modifier = Modifier.weight(1f).padding(
180
- start = Spacing.M,
181
- end = Spacing.M,
182
- top = Spacing.M
183
- ),
184
- verticalAlignment = Alignment.Top
185
- ) {
186
- Box(Modifier.weight(1f)) {
187
- if (text.value.isEmpty()) {
188
- Text(
189
- text = placeholder,
190
- style = TextStyle(
191
- fontSize = fontSize,
192
- lineHeight = lineHeight,
193
- fontWeight = fontWeight.value
194
- ),
195
- color = placeholderColor
196
- )
197
- }
198
- innerTextField()
199
- }
200
- if (isFocused && text.value.isNotEmpty()) {
201
- Row {
202
- Spacer(Modifier.width(Spacing.XS))
203
- Icon(
204
- source = "24_navigation_close_circle_full",
205
- size = 16.dp,
206
- color = AppTheme.current.colors.text.hint,
207
- modifier = Modifier.clickable(
208
- onClick = {
209
- text.value = ""
210
- onChangeText.invoke("")
211
- },
212
- interactionSource = remember { MutableInteractionSource() },
213
- indication = null
214
- )
215
- )
216
- }
217
- }
218
- RenderRightIcon(loading, icon, iconTintColor, onRightIconPressed)
219
- }
220
-
221
- Box(
222
- modifier = Modifier
223
- .fillMaxWidth()
224
- .padding(end = Spacing.M),
225
- contentAlignment = Alignment.CenterEnd
226
- ) {
227
- Text(
228
- "${text.value.length}/$maxLength",
229
- style = Typography.descriptionXsRegular,
230
- color = AppTheme.current.colors.text.hint
231
- )
232
- }
233
- Spacer(Modifier.height(Spacing.M))
234
- }
235
- }
236
- },
237
- )
238
- // show error
239
- ErrorView(error, errorSpacing, "")
240
- }
241
- }
@@ -1,364 +0,0 @@
1
- package vn.momo.kits.components
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
9
- import androidx.compose.foundation.Canvas
10
- import androidx.compose.foundation.OverscrollEffect
11
- import androidx.compose.foundation.background
12
- import androidx.compose.foundation.gestures.FlingBehavior
13
- 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
25
- import androidx.compose.material.ExperimentalMaterialApi
26
- import androidx.compose.material.pullrefresh.PullRefreshIndicator
27
- import androidx.compose.material.pullrefresh.pullRefresh
28
- 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
37
- import androidx.compose.ui.Alignment
38
- import androidx.compose.ui.Modifier
39
- import androidx.compose.ui.composed
40
- import androidx.compose.ui.geometry.CornerRadius
41
- import androidx.compose.ui.geometry.Offset
42
- import androidx.compose.ui.geometry.Size
43
- import androidx.compose.ui.graphics.Color
44
- import androidx.compose.ui.graphics.drawscope.rotate
45
- import androidx.compose.ui.hapticfeedback.HapticFeedbackType
46
- import androidx.compose.ui.layout.Measurable
47
- import androidx.compose.ui.layout.MeasureResult
48
- import androidx.compose.ui.layout.MeasureScope
49
- import androidx.compose.ui.layout.layout
50
- import androidx.compose.ui.platform.LocalDensity
51
- import androidx.compose.ui.platform.LocalHapticFeedback
52
- import androidx.compose.ui.unit.Constraints
53
- import androidx.compose.ui.unit.IntOffset
54
- import androidx.compose.ui.unit.dp
55
- import kotlinx.coroutines.flow.collect
56
- import kotlinx.coroutines.flow.combine
57
- import kotlinx.coroutines.flow.distinctUntilChanged
58
- import vn.momo.kits.const.Spacing
59
- import vn.momo.kits.modifier.conditional
60
- import vn.momo.kits.platform.getPlatformName
61
-
62
- private const val BOX_KEY = "LazyColumnWithBouncing_BOX_KEY"
63
-
64
-
65
- @OptIn(ExperimentalMaterialApi::class)
66
- @Composable
67
- fun overScrollWithPullToRefresh(
68
- pullRefreshState: PullToRefreshCustomState?,
69
- ): OverscrollEffect {
70
- val density = LocalDensity.current
71
- val hapticFeedback = LocalHapticFeedback.current
72
-
73
- return remember(density) {
74
- CupertinoOverscrollEffect(
75
- pullRefreshState = if (pullRefreshState != null && pullRefreshState.sendHaptic != null) pullRefreshState
76
- else pullRefreshState?.copy(
77
- sendHaptic = {
78
- hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
79
- }),
80
- density = density.density,
81
- applyClip = false,
82
- )
83
- }
84
- }
85
-
86
- @OptIn(ExperimentalMaterialApi::class)
87
- @Composable
88
- fun LazyColumnWithBouncing(
89
- modifier: Modifier = Modifier,
90
- modifierIndicator: Modifier = Modifier,
91
- state: LazyListState = rememberLazyListState(),
92
- contentPadding: PaddingValues = PaddingValues(0.dp),
93
- reverseLayout: Boolean = false,
94
- verticalArrangement: Arrangement.Vertical = if (!reverseLayout) Arrangement.Top else Arrangement.Bottom,
95
- horizontalAlignment: Alignment.Horizontal = Alignment.Start,
96
- flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
97
- userScrollEnabled: Boolean = true,
98
- pullRefreshState: PullToRefreshCustomState? = null,
99
- content: LazyListScope.() -> Unit,
100
- ) {
101
- val height = remember { mutableIntStateOf(0) }
102
- val maxConstraint = remember { mutableIntStateOf(0) }
103
-
104
- LaunchedEffect(Unit) {
105
- val addOn = 1
106
- combine(
107
- snapshotFlow { maxConstraint.value }.distinctUntilChanged(),
108
- snapshotFlow { state.layoutInfo }
109
- ) { cHeight, layoutInfo ->
110
- height.value = when {
111
- height.value == 0 && (state.canScrollForward || state.canScrollBackward) -> 0
112
- layoutInfo.viewportSize.height >= cHeight && height.value == 0 -> 0
113
- layoutInfo.visibleItemsInfo.lastOrNull()?.key != BOX_KEY -> 0
114
- else -> {
115
- val vH = layoutInfo.totalHeight
116
- (cHeight - (vH - height.value) + addOn).coerceIn(0, cHeight)
117
- }
118
- }
119
- }.collect()
120
- }
121
-
122
- val measureLayout =
123
- remember<MeasureScope.(Measurable, Constraints) -> MeasureResult>(maxConstraint) {
124
- { m, c ->
125
- val p = m.measure(c.copy(minHeight = 0))
126
- maxConstraint.value = c.maxHeight
127
- layout(p.width, p.height) {
128
- p.place(IntOffset.Zero)
129
- }
130
- }
131
- }
132
-
133
- if (getPlatformName() == "iOS") {
134
-
135
- val overscroll = overScrollWithPullToRefresh(
136
- pullRefreshState = remember {
137
- pullRefreshState
138
- })
139
-
140
- Box {
141
- IosIndicator(
142
- effect = overscroll,
143
- modifier = modifierIndicator.align(Alignment.TopCenter).padding(top = Spacing.L).size(24.dp),
144
- )
145
- LazyColumn(
146
- modifier = modifier
147
- .layout(measure = measureLayout),
148
- state = state,
149
- contentPadding = contentPadding,
150
- flingBehavior = flingBehavior,
151
- horizontalAlignment = horizontalAlignment,
152
- verticalArrangement = verticalArrangement,
153
- reverseLayout = reverseLayout,
154
- userScrollEnabled = userScrollEnabled,
155
- overscrollEffect = overscroll,
156
- ) {
157
- content()
158
- item(key = BOX_KEY) {
159
- FakeBox(height)
160
- }
161
- }
162
- }
163
- } else {
164
- val pullState = rememberPullRefreshState(
165
- refreshing = pullRefreshState?.refreshingState?.value ?: false,
166
- onRefresh = {
167
- pullRefreshState?.onRefresh()
168
- },
169
- )
170
-
171
- Box(
172
- contentAlignment = Alignment.TopCenter,
173
- modifier = Modifier.conditional(pullRefreshState != null) {
174
- pullRefresh(pullState)
175
- }) {
176
- LazyColumn(
177
- modifier = modifier.calculateHeight(height),
178
- state = state,
179
- contentPadding = contentPadding,
180
- flingBehavior = flingBehavior,
181
- horizontalAlignment = horizontalAlignment,
182
- verticalArrangement = verticalArrangement,
183
- reverseLayout = reverseLayout,
184
- userScrollEnabled = userScrollEnabled,
185
- ) {
186
- content()
187
- }
188
- if (pullRefreshState != null) {
189
- PullRefreshIndicator(
190
- pullRefreshState.refreshingState.value,
191
- pullState,
192
- modifierIndicator.align(Alignment.TopCenter)
193
- )
194
- }
195
-
196
- }
197
- }
198
- }
199
-
200
- @Composable
201
- private fun IosIndicator(
202
- effect: OverscrollEffect?,
203
- modifier: Modifier = Modifier,
204
- ) {
205
- if (effect !is CupertinoOverscrollEffect) return
206
- if (effect.pullRefreshState == null) return
207
- val state = effect.pullRefreshState
208
-
209
-
210
- SpinningProgressBarLoading(
211
- progress = state.position, modifier = modifier
212
- )
213
- }
214
-
215
- @Composable
216
- private fun SpinningProgressBarLoading(
217
- progress: State<Float>, modifier: Modifier = Modifier
218
- ) {
219
- if (progress.value <= 0) {
220
- return
221
- }
222
-
223
- val hapticFeedback = LocalHapticFeedback.current
224
- val isSendHaptic = remember { mutableStateOf(false) }
225
-
226
- val totalStep = 8
227
- val stepAngle = 360f / totalStep
228
- val baseOpacity = 1.0f / (totalStep + 2)
229
- val minAlpha = 0.2f
230
-
231
- val infiniteTransition = rememberInfiniteTransition()
232
- val angle = infiniteTransition.animateFloat(
233
- initialValue = 0f, targetValue = totalStep.toFloat(), animationSpec = infiniteRepeatable(
234
- animation = tween(totalStep * 100, easing = LinearEasing),
235
- repeatMode = RepeatMode.Restart
236
- )
237
- )
238
-
239
- LaunchedEffect(Unit) {
240
- snapshotFlow { progress.value }.collect {
241
- if (it >= 1.0f && !isSendHaptic.value) {
242
- hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
243
- isSendHaptic.value = true
244
- } else if (progress.value < 1.0f && isSendHaptic.value) {
245
- isSendHaptic.value = false
246
- }
247
- }
248
-
249
- }
250
-
251
- Canvas(modifier = modifier) {
252
- val percentage = progress.value
253
- val clampedProgress = percentage.coerceIn(0f, 1f)
254
- val value = (totalStep * clampedProgress).coerceIn(0f, totalStep.toFloat())
255
- val integerPart = value.toInt()
256
- val decimalPart = value - integerPart
257
-
258
- if (integerPart <= 0) return@Canvas
259
-
260
- val canvasWidth = size.width
261
- val canvasHeight = size.height
262
- val width = size.width * 0.3f
263
- val height = size.height / 8
264
- val cornerRadius = (width.coerceAtMost(height) / 2)
265
-
266
- if (percentage >= 1f) {
267
- for (i in 0..360 step 360 / totalStep) {
268
- rotate(i.toFloat()) {
269
- drawRoundRect(
270
- color = Color.LightGray.copy(alpha = .7f),
271
- topLeft = Offset(canvasWidth - width, (canvasHeight - height) / 2),
272
- size = Size(width, height),
273
- cornerRadius = CornerRadius(cornerRadius, cornerRadius)
274
- )
275
- }
276
- }
277
-
278
- val coefficient = 360f / totalStep
279
-
280
- for (i in 1..4) {
281
- rotate((angle.value.toInt() + i) * coefficient) {
282
- drawRoundRect(
283
- color = Color.Gray.copy(alpha = (0.2f + 0.2f * i).coerceIn(0f, 1f)),
284
- topLeft = Offset(canvasWidth - width, (canvasHeight - height) / 2),
285
- size = Size(width, height),
286
- cornerRadius = CornerRadius(cornerRadius, cornerRadius)
287
- )
288
- }
289
- }
290
- return@Canvas
291
- }
292
-
293
- val topLeft = Offset(canvasWidth - width, (canvasHeight - height) / 2)
294
- val rectSize = Size(width, height)
295
- val cornerRadiusValue = CornerRadius(cornerRadius, cornerRadius)
296
- repeat(integerPart) { i ->
297
- val angle = i * stepAngle - 90f
298
- val stepOpacity = 1f - (baseOpacity * i)
299
-
300
- val alpha = if (i == integerPart - 1) {
301
- (decimalPart * stepOpacity).coerceIn(minAlpha, 1f)
302
- } else {
303
- stepOpacity.coerceIn(minAlpha, 1f)
304
- }
305
-
306
- rotate(angle) {
307
- drawRoundRect(
308
- color = Color.Gray.copy(alpha = alpha),
309
- topLeft = topLeft,
310
- size = rectSize,
311
- cornerRadius = cornerRadiusValue
312
- )
313
- }
314
- }
315
- }
316
- }
317
-
318
- @Composable
319
- private fun FakeBox(height: MutableState<Int>) {
320
- Box(
321
- modifier = Modifier
322
- .dynamicHeight(height).fillMaxWidth().background(Color.Red),
323
- )
324
- }
325
-
326
- private fun Modifier.calculateHeight(
327
- height: MutableState<Int>,
328
- ) = this.layout { m, c ->
329
- val p = m.measure(
330
- constraints = c.copy(
331
- minHeight = 0
332
- )
333
- )
334
- val vH = p.height
335
- val cMaxHeight = c.maxHeight
336
- val addOn = 0.5.dp.roundToPx()
337
- var extraSpace = addOn + height.value
338
- if (height.value == 0) {
339
- extraSpace = 0
340
- }
341
- if (vH - extraSpace >= cMaxHeight && height.value != 0) {
342
- height.value = 0
343
- } else if (vH - extraSpace < cMaxHeight) {
344
- height.value = cMaxHeight - (vH - extraSpace) + addOn
345
- }
346
-
347
- layout(c.maxWidth, cMaxHeight) {
348
- p.place(IntOffset.Zero)
349
- }
350
- }
351
-
352
-
353
- private fun Modifier.dynamicHeight(height: MutableState<Int>) = composed {
354
- val measure = remember<MeasureScope.(Measurable, Constraints) -> MeasureResult>(this, height) {
355
- { m, c ->
356
- val p = m.measure(c)
357
- layout(c.maxWidth, height.value) { p.place(IntOffset.Zero) }
358
- }
359
- }
360
- this.layout(measure = measure)
361
- }
362
-
363
- private val LazyListLayoutInfo.totalHeight: Int
364
- get() = visibleItemsInfo.sumOf { it.size }