@momo-kits/native-kits 0.167.1-duo.18-debug → 0.167.1-duo.19

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 (163) hide show
  1. package/CLAUDE.md +5 -3
  2. package/ios/Application/MaxApi.swift +12 -3
  3. package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
  4. package/ios/Layout/GridContext.swift +67 -3
  5. package/ios/Navigation/BottomSheet.swift +30 -4
  6. package/ios/Navigation/BottomTab/BottomTab.swift +0 -2
  7. package/ios/Navigation/Component/SnackBar.swift +0 -1
  8. package/ios/Navigation/HostBackGestureBridge.swift +27 -6
  9. package/ios/Navigation/ModalScreen.swift +0 -1
  10. package/ios/Navigation/Navigation.swift +14 -0
  11. package/ios/Navigation/NavigationContainer.swift +26 -56
  12. package/ios/Navigation/Navigator.swift +102 -165
  13. package/ios/Navigation/StackScreen.swift +19 -2
  14. package/ios/Navigation/StackTransition.swift +400 -0
  15. package/ios/Navigation/SwipeBackHaptic.swift +33 -0
  16. package/package.json +1 -1
  17. package/build.gradle.kts +0 -11
  18. package/compose/build.gradle.kts +0 -204
  19. package/compose/build.gradle.kts.backup +0 -204
  20. package/compose/compose.podspec +0 -47
  21. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  22. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  23. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  24. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  25. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -153
  26. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/ReservedRegions.android.kt +0 -6
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -916
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -81
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -357
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -115
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -86
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -189
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -478
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -265
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -235
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -265
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -361
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -108
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -308
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -330
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -207
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -92
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -560
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -86
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -501
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -236
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -180
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -20
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -194
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -283
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -54
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -50
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +0 -309
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -41
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -338
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +0 -58
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -137
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -205
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -713
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -218
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -231
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoBarCompression.kt +0 -98
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoTabBar.kt +0 -312
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -447
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -103
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -106
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -74
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -379
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -39
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -363
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +0 -192
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -133
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -74
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ReservedRegions.kt +0 -13
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -118
  149. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -78
  150. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -45
  151. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  152. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  153. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  154. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -217
  155. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/ReservedRegions.ios.kt +0 -94
  156. package/gradle/libs.versions.toml +0 -69
  157. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  158. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  159. package/gradle.properties +0 -26
  160. package/gradlew +0 -252
  161. package/gradlew.bat +0 -94
  162. package/ios-demo/README.md +0 -120
  163. package/settings.gradle.kts +0 -64
@@ -1,357 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import vn.momo.kits.modifier.InternalApi
4
-
5
- import androidx.compose.animation.core.animateDpAsState
6
- import androidx.compose.animation.core.animateFloatAsState
7
- import androidx.compose.animation.core.tween
8
- import androidx.compose.foundation.background
9
- import androidx.compose.foundation.border
10
- import androidx.compose.foundation.clickable
11
- import androidx.compose.foundation.interaction.MutableInteractionSource
12
- import androidx.compose.foundation.interaction.collectIsPressedAsState
13
- import androidx.compose.foundation.layout.*
14
- import androidx.compose.foundation.shape.RoundedCornerShape
15
- import androidx.compose.runtime.Composable
16
- import androidx.compose.runtime.getValue
17
- import androidx.compose.runtime.remember
18
- import androidx.compose.ui.Alignment
19
- import androidx.compose.ui.Modifier
20
- import androidx.compose.ui.draw.alpha
21
- import androidx.compose.ui.draw.clip
22
- import androidx.compose.ui.graphics.Color
23
- import androidx.compose.ui.text.TextStyle
24
- import androidx.compose.ui.text.style.TextOverflow
25
- import androidx.compose.ui.unit.Dp
26
- import androidx.compose.ui.unit.dp
27
- import vn.momo.kits.application.IsShowBaseLineDebug
28
- import vn.momo.kits.const.*
29
- import vn.momo.kits.modifier.conditional
30
- import vn.momo.kits.platform.LottieAnimation
31
-
32
- enum class ButtonType {
33
- PRIMARY,
34
- SECONDARY,
35
- TONAL,
36
- OUTLINE,
37
- DANGER,
38
- TEXT,
39
- DISABLED
40
- }
41
-
42
- data class ButtonSpecs(
43
- val height: Dp,
44
- val radius: Dp,
45
- val padding: Dp,
46
- val width: Dp,
47
- )
48
-
49
- enum class Size(val value: ButtonSpecs) {
50
- LARGE(
51
- ButtonSpecs(
52
- height = 48.dp,
53
- radius = Radius.S,
54
- padding = Spacing.L,
55
- width = 128.dp
56
- )
57
- ),
58
- MEDIUM(
59
- ButtonSpecs(
60
- height = 36.dp,
61
- radius = Radius.S,
62
- padding = Spacing.M,
63
- width = 80.dp
64
- )
65
- ),
66
- SMALL(
67
- ButtonSpecs(
68
- height = 28.dp,
69
- radius = Radius.S,
70
- padding = Spacing.S,
71
- width = 60.dp
72
- )
73
- )
74
- }
75
-
76
- private val styleCache = mapOf(
77
- Size.LARGE to Typography.actionDefaultBold,
78
- Size.MEDIUM to Typography.actionSBold,
79
- Size.SMALL to Typography.actionXsBold
80
- )
81
-
82
- private val iconSizeCache = mapOf(
83
- Size.LARGE to 24.dp,
84
- Size.MEDIUM to 16.dp,
85
- Size.SMALL to 16.dp
86
- )
87
-
88
- private val iconSpaceCache = mapOf(
89
- Size.SMALL to Spacing.XS,
90
- Size.MEDIUM to Spacing.S,
91
- Size.LARGE to Spacing.S
92
- )
93
-
94
- private fun getStyle(size: Size): TextStyle {
95
- return styleCache[size] ?: Typography.actionDefaultBold
96
- }
97
-
98
- @InternalApi
99
- fun getIconSize(size: Size): Dp = iconSizeCache[size] ?: 24.dp
100
- private fun getIconSpace(size: Size): Dp = iconSpaceCache[size] ?: Spacing.S
101
-
102
- @InternalApi
103
- @Composable
104
- fun getTextColor(loading: Boolean, type: ButtonType): Color {
105
- val theme = AppTheme.current
106
-
107
- return remember(type, theme, loading) {
108
- getButtonColor(type, theme).withLoading(loading)
109
- }
110
- }
111
-
112
- internal fun getButtonColor(type: ButtonType, theme: Theme): Color {
113
- return when (type) {
114
- ButtonType.DISABLED -> theme.colors.text.disable
115
- ButtonType.PRIMARY -> Colors.black_01
116
- ButtonType.SECONDARY -> theme.colors.text.default
117
- ButtonType.OUTLINE -> theme.colors.primary
118
- ButtonType.TONAL -> theme.colors.primary
119
- ButtonType.DANGER -> Colors.black_01
120
- ButtonType.TEXT -> theme.colors.primary
121
- }
122
- }
123
-
124
-
125
- @Composable
126
- internal fun RenderTitle(size: Size, title: String = "", textColor: Color) {
127
- val style = remember(size) { getStyle(size) }
128
- Text(
129
- style = style,
130
- text = title,
131
- color = textColor,
132
- overflow = TextOverflow.Ellipsis,
133
- maxLines = 1
134
- )
135
- }
136
-
137
- @Composable
138
- @InternalApi
139
- fun RenderIcon(
140
- size: Size,
141
- isIconLeft: Boolean,
142
- useTintColor: Boolean = true,
143
- icon: String = "",
144
- forceLoading: Boolean = false,
145
- textColor: Color? = null,
146
- ) {
147
- val iconSize = remember(size) { getIconSize(size) }
148
- val margin = remember(size) { getIconSpace(size) }
149
- // null = untinted; Color.Unspecified would tint with a transparent color and hide the icon.
150
- val color = if (useTintColor) textColor else null
151
-
152
- val modifier = Modifier.padding(
153
- start = if (isIconLeft) 0.dp else margin,
154
- end = if (isIconLeft) margin else 0.dp
155
- )
156
-
157
- if (forceLoading) {
158
- Box(modifier) {
159
- LottieAnimation(
160
- modifier = Modifier.size(iconSize),
161
- bgColor = null,
162
- tintColor = color,
163
- path = "files/lottie_circle_loader",
164
- useCompose = true
165
- )
166
- }
167
- } else if (icon.isNotEmpty()) {
168
- Icon(
169
- source = icon,
170
- color = color,
171
- size = iconSize,
172
- modifier = modifier
173
- )
174
- }
175
- }
176
-
177
- private fun shouldLoadingOnLeft(iconLeft: String, iconRight: String): Boolean {
178
- val hasLeft = iconLeft.isNotEmpty()
179
- val hasRight = iconRight.isNotEmpty()
180
- return when {
181
- !hasLeft && !hasRight -> true
182
- hasLeft && !hasRight -> true
183
- !hasLeft && hasRight -> false
184
- hasLeft && hasRight -> false
185
- else -> true
186
- }
187
- }
188
-
189
- @InternalApi
190
- @Composable
191
- fun getTypeStyle(
192
- type: ButtonType,
193
- color: Color? = AppTheme.current.colors.primary,
194
- size: Size,
195
- bgColor: Color,
196
- ): Modifier {
197
- val theme = AppTheme.current
198
- val radius = remember(size) { size.value.radius }
199
- val modifier = Modifier.background(bgColor)
200
-
201
- return remember(type, color, theme, radius, bgColor) {
202
- when (type) {
203
- ButtonType.DISABLED -> modifier
204
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
205
-
206
- ButtonType.PRIMARY -> modifier
207
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
208
-
209
- ButtonType.SECONDARY -> modifier
210
- .border(1.dp, theme.colors.border.default, RoundedCornerShape(radius))
211
-
212
- ButtonType.OUTLINE -> modifier
213
- .border(1.dp, color ?: theme.colors.primary, RoundedCornerShape(radius))
214
-
215
- ButtonType.TONAL -> modifier
216
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
217
-
218
- ButtonType.DANGER -> modifier
219
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
220
-
221
- ButtonType.TEXT -> modifier
222
- }
223
- }
224
- }
225
-
226
- @InternalApi
227
- @Composable
228
- fun getButtonBackgroundColor(
229
- loading: Boolean,
230
- type: ButtonType
231
- ): Color {
232
- val theme = AppTheme.current
233
-
234
- return remember(loading, type, theme) {
235
- when (type) {
236
- ButtonType.DISABLED -> theme.colors.background.disable.withLoading(loading)
237
- ButtonType.PRIMARY -> theme.colors.primary.withLoading(loading)
238
- ButtonType.SECONDARY -> theme.colors.background.surface.withLoading(loading)
239
- ButtonType.OUTLINE -> theme.colors.background.surface.withLoading(loading)
240
- ButtonType.TONAL -> theme.colors.background.tonal.withLoading(loading)
241
- ButtonType.DANGER -> theme.colors.error.primary.withLoading(loading)
242
- ButtonType.TEXT -> Color.Unspecified
243
- }
244
- }
245
- }
246
-
247
- private fun Color.withLoading(loading: Boolean): Color =
248
- this.copy(alpha = if (loading) 0.75f else 1f)
249
-
250
- @Composable
251
- fun Button(
252
- onClick: () -> Unit,
253
- type: ButtonType = ButtonType.PRIMARY,
254
- size: Size = Size.LARGE,
255
- iconRight: String = "",
256
- iconLeft: String = "",
257
- title: String = "Button",
258
- loading: Boolean = false,
259
- useTintColor: Boolean = true,
260
- isFull: Boolean = true,
261
- modifier: Modifier = Modifier,
262
- ) {
263
- val radius = remember(size) { size.value.radius }
264
- val isEnabled = remember(type) { type != ButtonType.DISABLED }
265
- val loadingOnLeft = remember(iconLeft, iconRight) {
266
- shouldLoadingOnLeft(iconLeft, iconRight)
267
- }
268
-
269
- val sizeSpecs = remember(size) { size.value }
270
-
271
- val interactionSource = remember { MutableInteractionSource() }
272
- val isPressed by interactionSource.collectIsPressedAsState()
273
-
274
- val animatedPadding by animateDpAsState(
275
- targetValue = if (isPressed && isEnabled && !loading) 2.dp else 0.dp,
276
- animationSpec = tween(100),
277
- label = "pressPadding"
278
- )
279
-
280
- val targetAlpha = if (isPressed && isEnabled && !loading) 0.5f else 1f
281
- val alpha by animateFloatAsState(
282
- targetValue = targetAlpha,
283
- animationSpec = tween(100),
284
- label = "buttonPressAlpha"
285
- )
286
-
287
- val clickableModifier =
288
- if (isEnabled && !loading) {
289
- modifier
290
- .clip(RoundedCornerShape(radius))
291
- .clickable(
292
- enabled = isEnabled && !loading,
293
- interactionSource = interactionSource,
294
- indication = null,
295
- onClick = onClick
296
- )
297
- .alpha(alpha)
298
- } else {
299
- modifier
300
- .clip(RoundedCornerShape(radius))
301
- }
302
-
303
- val bgColor = getButtonBackgroundColor(loading, type)
304
- val textColor = getTextColor(loading, type)
305
-
306
- val rootModifier = if (isFull) {
307
- Modifier
308
- .fillMaxWidth()
309
- .wrapContentHeight()
310
- } else {
311
- Modifier
312
- }
313
-
314
- Box(
315
- modifier = rootModifier.then(clickableModifier),
316
- contentAlignment = Alignment.Center
317
- ) {
318
- // Visual background (shrinks on press)
319
- Box(
320
- modifier = Modifier
321
- .matchParentSize()
322
- .padding(horizontal = animatedPadding)
323
- .clip(RoundedCornerShape(radius))
324
- .then(getTypeStyle(type, size = size, bgColor = bgColor))
325
- .conditional(IsShowBaseLineDebug) {
326
- border(1.dp, Colors.blue_03)
327
- }
328
- )
329
-
330
- // Content
331
- Row(
332
- modifier = Modifier
333
- .padding(horizontal = sizeSpecs.padding)
334
- .height(sizeSpecs.height),
335
- horizontalArrangement = Arrangement.Center,
336
- verticalAlignment = Alignment.CenterVertically,
337
- ) {
338
- RenderIcon(
339
- size = size,
340
- isIconLeft = true,
341
- useTintColor = useTintColor,
342
- icon = iconLeft,
343
- forceLoading = loading && loadingOnLeft,
344
- textColor = textColor
345
- )
346
- RenderTitle(size, title, textColor = textColor)
347
- RenderIcon(
348
- size = size,
349
- isIconLeft = false,
350
- useTintColor = useTintColor,
351
- icon = iconRight,
352
- forceLoading = loading && !loadingOnLeft,
353
- textColor = textColor
354
- )
355
- }
356
- }
357
- }
@@ -1,115 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import androidx.compose.animation.core.animateFloatAsState
4
- import androidx.compose.animation.core.tween
5
- import androidx.compose.foundation.border
6
- import androidx.compose.foundation.layout.Box
7
- import androidx.compose.foundation.layout.PaddingValues
8
- import androidx.compose.foundation.layout.fillMaxWidth
9
- import androidx.compose.foundation.pager.HorizontalPager
10
- import androidx.compose.foundation.pager.rememberPagerState
11
- import androidx.compose.runtime.*
12
- import androidx.compose.ui.Modifier
13
- import androidx.compose.ui.graphics.graphicsLayer
14
- import androidx.compose.ui.unit.dp
15
- import kotlinx.coroutines.delay
16
- import kotlinx.coroutines.isActive
17
- import vn.momo.kits.application.IsShowBaseLineDebug
18
- import vn.momo.kits.const.Colors
19
- import vn.momo.kits.modifier.conditional
20
- import kotlin.math.absoluteValue
21
- import kotlin.time.Duration.Companion.milliseconds
22
-
23
- @Composable
24
- fun Carousel(
25
- itemCount: Int,
26
- modifier: Modifier = Modifier,
27
- loop: Boolean = false,
28
- autoplay: Boolean = false,
29
- autoplayInterval: Long = 3000L,
30
- scrollEnabled: Boolean = true,
31
- inactiveSlideOpacity: Float = 1f,
32
- inactiveSlideScale: Float = 1f,
33
- contentPadding: PaddingValues = PaddingValues(0.dp),
34
- onSnapToItem: (Int) -> Unit = {},
35
- onScrollIndexChanged: (Int) -> Unit = {},
36
- content: @Composable (index: Int) -> Unit,
37
- ) {
38
- if (itemCount <= 0) return
39
-
40
- val virtualPageCount = if (loop) itemCount * 1000 else itemCount
41
- val startPage = if (loop) (virtualPageCount / 2) - ((virtualPageCount / 2) % itemCount) else 0
42
-
43
- val pagerState = rememberPagerState(initialPage = startPage) { virtualPageCount }
44
-
45
- val realIndex: (Int) -> Int = { page -> page % itemCount }
46
- val currentOnSnapToItem by rememberUpdatedState(onSnapToItem)
47
- val currentOnScrollIndexChanged by rememberUpdatedState(onScrollIndexChanged)
48
-
49
- var isUserScrolling by remember { mutableStateOf(false) }
50
-
51
- if (autoplay && itemCount > 1) {
52
- LaunchedEffect(autoplayInterval, isUserScrolling) {
53
- if (isUserScrolling) return@LaunchedEffect
54
- while (isActive) {
55
- delay(autoplayInterval.milliseconds)
56
- if (!isUserScrolling) {
57
- val nextPage = pagerState.currentPage + 1
58
- if (nextPage < virtualPageCount) {
59
- pagerState.animateScrollToPage(nextPage)
60
- }
61
- }
62
- }
63
- }
64
- }
65
-
66
- LaunchedEffect(pagerState) {
67
- snapshotFlow { pagerState.isScrollInProgress }.collect { scrolling ->
68
- isUserScrolling = scrolling
69
- }
70
- }
71
-
72
- LaunchedEffect(pagerState) {
73
- snapshotFlow { pagerState.currentPage }.collect { page ->
74
- val real = realIndex(page)
75
- currentOnSnapToItem(real)
76
- currentOnScrollIndexChanged(real)
77
- }
78
- }
79
-
80
- HorizontalPager(
81
- state = pagerState,
82
- modifier = modifier
83
- .fillMaxWidth()
84
- .conditional(IsShowBaseLineDebug) { border(1.dp, Colors.blue_03) },
85
- contentPadding = contentPadding,
86
- userScrollEnabled = scrollEnabled,
87
- beyondViewportPageCount = if (loop) 1 else 0,
88
- ) { page ->
89
- val real = realIndex(page)
90
-
91
- val pageOffset = ((pagerState.currentPage - page) + pagerState.currentPageOffsetFraction).absoluteValue
92
-
93
- val scale by animateFloatAsState(
94
- targetValue = if (pageOffset < 0.5f) 1f else inactiveSlideScale,
95
- animationSpec = tween(150),
96
- label = "carouselScale"
97
- )
98
- val alpha by animateFloatAsState(
99
- targetValue = if (pageOffset < 0.5f) 1f else inactiveSlideOpacity,
100
- animationSpec = tween(150),
101
- label = "carouselAlpha"
102
- )
103
-
104
- Box(
105
- modifier = Modifier
106
- .graphicsLayer {
107
- scaleX = scale
108
- scaleY = scale
109
- this.alpha = alpha
110
- }
111
- ) {
112
- content(real)
113
- }
114
- }
115
- }
@@ -1,89 +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.layout.Box
6
- import androidx.compose.foundation.layout.Row
7
- import androidx.compose.foundation.layout.Spacer
8
- import androidx.compose.foundation.layout.size
9
- import androidx.compose.foundation.shape.RoundedCornerShape
10
- import androidx.compose.runtime.Composable
11
- import androidx.compose.runtime.remember
12
- import androidx.compose.ui.Alignment
13
- import androidx.compose.ui.Modifier
14
- import androidx.compose.ui.graphics.Color
15
- import androidx.compose.ui.unit.dp
16
- import vn.momo.kits.application.IsShowBaseLineDebug
17
- import vn.momo.kits.const.AppTheme
18
- import vn.momo.kits.const.Colors
19
- import vn.momo.kits.const.Radius
20
- import vn.momo.kits.const.Spacing
21
- import vn.momo.kits.const.Typography
22
- import vn.momo.kits.modifier.activeOpacityClickable
23
- import vn.momo.kits.modifier.conditional
24
-
25
- private val checkboxShape = RoundedCornerShape(Radius.XS)
26
-
27
- @Composable
28
- fun CheckBox(
29
- disabled: Boolean = false,
30
- checked: Boolean = false,
31
- onCheckedChange: (Boolean) -> Unit,
32
- indeterminate: Boolean = false,
33
- title: String = "",
34
- ) {
35
- val theme = AppTheme.current
36
-
37
- val colors = remember(checked, disabled, theme) {
38
- when {
39
- disabled && checked -> Pair(theme.colors.background.tonal, theme.colors.background.tonal)
40
- disabled -> Pair(theme.colors.border.disable, Color.Transparent)
41
- checked -> Pair(theme.colors.primary, theme.colors.primary)
42
- else -> Pair(theme.colors.text.default, Color.Transparent)
43
- }
44
- }
45
-
46
- val (borderColor, backgroundColor) = colors
47
-
48
- val iconSource = remember(indeterminate) {
49
- if (indeterminate) "navigation_minus" else "ic_checked"
50
- }
51
-
52
- val onClickHandler = remember(onCheckedChange, checked) {
53
- { onCheckedChange(!checked) }
54
- }
55
-
56
- Row(verticalAlignment = Alignment.CenterVertically) {
57
- Box(
58
- modifier = Modifier
59
- .size(20.dp)
60
- .background(backgroundColor, checkboxShape)
61
- .border(Spacing.XXS, borderColor, checkboxShape)
62
- .conditional(IsShowBaseLineDebug) {
63
- border(1.dp, Colors.blue_03)
64
- }
65
- .activeOpacityClickable(
66
- activeOpacity = 0.8f,
67
- onClick = onClickHandler,
68
- enabled = !disabled,
69
- ),
70
- ) {
71
- if (checked) {
72
- Icon(
73
- source = iconSource,
74
- size = 20.dp,
75
- color = Colors.black_01
76
- )
77
- }
78
- }
79
-
80
- if (title.isNotEmpty()) {
81
- Spacer(Modifier.size(Spacing.S))
82
- Text(
83
- style = Typography.descriptionDefaultRegular,
84
- text = title,
85
- )
86
- }
87
- }
88
-
89
- }
@@ -1,128 +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.layout.*
6
- import androidx.compose.foundation.shape.RoundedCornerShape
7
- import androidx.compose.runtime.Composable
8
- import androidx.compose.runtime.Immutable
9
- import androidx.compose.ui.Alignment
10
- import androidx.compose.ui.Modifier
11
- import androidx.compose.ui.draw.clip
12
- import androidx.compose.ui.graphics.Color
13
- import androidx.compose.ui.text.style.TextAlign
14
- import androidx.compose.ui.text.style.TextOverflow
15
- import androidx.compose.ui.unit.dp
16
- import vn.momo.kits.application.IsShowBaseLineDebug
17
- import vn.momo.kits.const.*
18
- import vn.momo.kits.modifier.activeOpacityClickable
19
- import vn.momo.kits.modifier.conditional
20
- import vn.momo.kits.modifier.setAutomationId
21
-
22
- @Composable
23
- fun Chip(
24
- modifier: Modifier = Modifier,
25
- label: String? = "Label",
26
- iconLeft: String? = null,
27
- iconRight: String? = null,
28
- selected: Boolean = false,
29
- onClick: () -> Unit = {},
30
- size: ChipSize = ChipSize.LARGE,
31
- iconLeftTint: Color? = null,
32
- iconRightTint: Color? = null,
33
- backgroundColor: Color? = null,
34
- accessibilityLabel: String? = null,
35
- ) {
36
- val theme = AppTheme.current
37
- val bg = when {
38
- selected -> theme.colors.background.selected
39
- backgroundColor != null -> backgroundColor
40
- else -> Colors.black_03
41
- }
42
-
43
- val textColor = if (selected) theme.colors.primary else theme.colors.text.default
44
- val leftTint = if (selected) theme.colors.primary else iconLeftTint ?: theme.colors.text.default
45
- val rightTint = if (selected) theme.colors.primary else iconRightTint ?: theme.colors.text.default
46
-
47
- val dims = when (size) {
48
- ChipSize.SMALL -> ChipDefaults.Small
49
- ChipSize.LARGE -> ChipDefaults.Large
50
- }
51
-
52
- val (height, horizontal, iconSize, iconSpacing) =
53
- listOf(scaleSize(dims.height), scaleSize(dims.horizontal), scaleSize(dims.iconSize), scaleSize(dims.iconSpacing))
54
-
55
- val radius = scaleSize(Radius.L)
56
-
57
- Row(
58
- modifier
59
- .wrapContentWidth()
60
- .height(height.dp)
61
- .clip(RoundedCornerShape(radius))
62
- .background(bg)
63
- .conditional(selected) {
64
- Modifier.border(width = 2.dp, color = theme.colors.secondary, shape = RoundedCornerShape(radius))
65
- }
66
- .conditional(IsShowBaseLineDebug) {
67
- border(1.dp, Colors.blue_03)
68
- }
69
- .activeOpacityClickable {
70
- onClick()
71
- }
72
- .padding(horizontal = horizontal.dp)
73
- .conditional(accessibilityLabel != null) {
74
- setAutomationId(accessibilityLabel.toString())
75
- },
76
- verticalAlignment = Alignment.CenterVertically,
77
- horizontalArrangement = Arrangement.spacedBy(iconSpacing.dp)
78
- ) {
79
- if (iconLeft != null) {
80
- Icon(source = iconLeft, size = iconSize.dp, color = leftTint)
81
- }
82
-
83
- if (!label.isNullOrEmpty()) {
84
- Text(
85
- text = label,
86
- textAlign = TextAlign.Center,
87
- color = textColor,
88
- style = when (size) {
89
- ChipSize.SMALL -> Typography.labelSMedium
90
- ChipSize.LARGE -> Typography.labelDefaultMedium
91
- },
92
- maxLines = 1,
93
- overflow = TextOverflow.Ellipsis,
94
- modifier = Modifier.weight(1f, fill = false),
95
- )
96
- }
97
-
98
- if (iconRight != null) {
99
- Icon(source = iconRight, size = iconSize.dp, color = rightTint)
100
- }
101
- }
102
- }
103
-
104
- enum class ChipSize { SMALL, LARGE }
105
-
106
- private object ChipDefaults {
107
- @Immutable
108
- data class Dimensions(
109
- val height: Float,
110
- val horizontal: Float,
111
- val iconSize: Float,
112
- val iconSpacing: Float,
113
- )
114
-
115
- val Large = Dimensions(
116
- height = 32f,
117
- horizontal = 12f,
118
- iconSize = 20f,
119
- iconSpacing = 4f,
120
- )
121
-
122
- val Small = Dimensions(
123
- height = 24f,
124
- horizontal = 10f,
125
- iconSize = 16f,
126
- iconSpacing = 4f,
127
- )
128
- }