@momo-kits/native-kits 0.157.2-debug → 0.157.2

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 (117) hide show
  1. package/package.json +1 -1
  2. package/build.gradle.kts +0 -11
  3. package/compose/build.gradle.kts +0 -180
  4. package/compose/build.gradle.kts.backup +0 -180
  5. package/compose/compose.podspec +0 -54
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -110
  7. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  8. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  9. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  10. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  11. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  12. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  13. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  14. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  15. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  16. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  17. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  18. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  19. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  20. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -57
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -107
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -201
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -222
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -48
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -305
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -720
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -121
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -405
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -85
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -340
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -198
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -357
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -94
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -136
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -148
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -188
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -116
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -448
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -172
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -255
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -231
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -233
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -254
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -241
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -364
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -92
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -352
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -103
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -70
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -96
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -96
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -92
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -130
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -214
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -576
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -177
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -205
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -239
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -191
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -13
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -185
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -285
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -2
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -35
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -2
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -59
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -68
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -14
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -50
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -239
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -119
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -98
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -161
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -331
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -497
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -162
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -243
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -187
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -279
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -80
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -306
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -32
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -370
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -42
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -62
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -88
  110. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -149
  111. package/gradle/libs.versions.toml +0 -57
  112. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  113. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  114. package/gradle.properties +0 -26
  115. package/gradlew +0 -252
  116. package/gradlew.bat +0 -94
  117. package/settings.gradle.kts +0 -52
@@ -1,357 +0,0 @@
1
- package vn.momo.kits.components
2
-
3
- import androidx.compose.animation.core.animateDpAsState
4
- import androidx.compose.animation.core.animateFloatAsState
5
- import androidx.compose.animation.core.tween
6
- import androidx.compose.foundation.background
7
- import androidx.compose.foundation.border
8
- import androidx.compose.foundation.clickable
9
- import androidx.compose.foundation.interaction.MutableInteractionSource
10
- import androidx.compose.foundation.interaction.collectIsPressedAsState
11
- import androidx.compose.foundation.layout.Arrangement
12
- import androidx.compose.foundation.layout.Box
13
- import androidx.compose.foundation.layout.Row
14
- import androidx.compose.foundation.layout.fillMaxWidth
15
- import androidx.compose.foundation.layout.height
16
- import androidx.compose.foundation.layout.padding
17
- import androidx.compose.foundation.layout.size
18
- import androidx.compose.foundation.layout.wrapContentHeight
19
- import androidx.compose.foundation.shape.RoundedCornerShape
20
- import androidx.compose.runtime.Composable
21
- import androidx.compose.runtime.getValue
22
- import androidx.compose.runtime.remember
23
- import androidx.compose.ui.Alignment
24
- import androidx.compose.ui.Modifier
25
- import androidx.compose.ui.draw.alpha
26
- import androidx.compose.ui.draw.clip
27
- import androidx.compose.ui.graphics.Color
28
- import androidx.compose.ui.text.TextStyle
29
- import androidx.compose.ui.text.style.TextOverflow
30
- import androidx.compose.ui.unit.Dp
31
- import androidx.compose.ui.unit.dp
32
- import vn.momo.kits.application.IsShowBaseLineDebug
33
- import vn.momo.kits.const.AppTheme
34
- import vn.momo.kits.const.Colors
35
- import vn.momo.kits.const.Radius
36
- import vn.momo.kits.const.Spacing
37
- import vn.momo.kits.const.Typography
38
- import vn.momo.kits.modifier.conditional
39
- import vn.momo.kits.platform.LottieAnimation
40
-
41
- enum class ButtonType {
42
- PRIMARY,
43
- SECONDARY,
44
- TONAL,
45
- OUTLINE,
46
- DANGER,
47
- TEXT,
48
- DISABLED
49
- }
50
-
51
- data class ButtonSpecs(
52
- val height: Dp,
53
- val radius: Dp,
54
- val padding: Dp,
55
- val width: Dp,
56
- )
57
-
58
- enum class Size(val value: ButtonSpecs) {
59
- LARGE(
60
- ButtonSpecs(
61
- height = 48.dp,
62
- radius = Radius.S,
63
- padding = Spacing.L,
64
- width = 128.dp
65
- )
66
- ),
67
- MEDIUM(
68
- ButtonSpecs(
69
- height = 36.dp,
70
- radius = Radius.S,
71
- padding = Spacing.M,
72
- width = 80.dp
73
- )
74
- ),
75
- SMALL(
76
- ButtonSpecs(
77
- height = 28.dp,
78
- radius = Radius.S,
79
- padding = Spacing.S,
80
- width = 60.dp
81
- )
82
- )
83
- }
84
-
85
- private val styleCache = mapOf(
86
- Size.LARGE to Typography.actionDefaultBold,
87
- Size.MEDIUM to Typography.actionSBold,
88
- Size.SMALL to Typography.actionXsBold
89
- )
90
-
91
- private val iconSizeCache = mapOf(
92
- Size.LARGE to 24.dp,
93
- Size.MEDIUM to 16.dp,
94
- Size.SMALL to 16.dp
95
- )
96
-
97
- private val iconSpaceCache = mapOf(
98
- Size.SMALL to Spacing.XS,
99
- Size.MEDIUM to Spacing.S,
100
- Size.LARGE to Spacing.S
101
- )
102
-
103
- fun getStyle(size: Size): TextStyle {
104
- return styleCache[size] ?: Typography.actionDefaultBold
105
- }
106
-
107
- fun getIconSize(size: Size): Dp = iconSizeCache[size] ?: 24.dp
108
- fun getIconSpace(size: Size): Dp = iconSpaceCache[size] ?: Spacing.S
109
-
110
- @Composable
111
- fun getTextColor(loading: Boolean, type: ButtonType): Color {
112
- val theme = AppTheme.current
113
-
114
- return remember(type, theme, loading) {
115
- when (type) {
116
- ButtonType.DISABLED -> theme.colors.text.disable
117
- ButtonType.PRIMARY -> Colors.black_01
118
- ButtonType.SECONDARY -> theme.colors.text.default
119
- ButtonType.OUTLINE -> theme.colors.primary
120
- ButtonType.TONAL -> theme.colors.primary
121
- ButtonType.DANGER -> Colors.black_01
122
- ButtonType.TEXT -> theme.colors.primary
123
- }.withLoading(loading)
124
- }
125
- }
126
-
127
- @Composable
128
- fun RenderTitle(size: Size, title: String = "", textColor: Color) {
129
- val style = remember(size) { getStyle(size) }
130
- Text(
131
- style = style,
132
- text = title,
133
- color = textColor,
134
- overflow = TextOverflow.Ellipsis,
135
- maxLines = 1
136
- )
137
- }
138
-
139
- @Composable
140
- fun RenderIcon(
141
- size: Size,
142
- isIconLeft: Boolean,
143
- useTintColor: Boolean = true,
144
- icon: String = "",
145
- forceLoading: Boolean = false,
146
- bgColor: Color? = null,
147
- textColor: Color? = null,
148
- ) {
149
- val iconSize = remember(size) { getIconSize(size) }
150
- val margin = remember(size) { getIconSpace(size) }
151
- val color = if (useTintColor) textColor else Color.Unspecified
152
-
153
- val modifier = Modifier.padding(
154
- start = if (isIconLeft) 0.dp else margin,
155
- end = if (isIconLeft) margin else 0.dp
156
- )
157
-
158
- if (forceLoading) {
159
- Box(modifier) {
160
- LottieAnimation(
161
- modifier = Modifier.size(iconSize),
162
- bgColor = bgColor,
163
- tintColor = color,
164
- path = "files/lottie_circle_loader"
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
- @Composable
190
- fun getTypeStyle(
191
- type: ButtonType,
192
- color: Color? = AppTheme.current.colors.primary,
193
- size: Size,
194
- bgColor: Color,
195
- ): Modifier {
196
- val theme = AppTheme.current
197
- val radius = remember(size) { size.value.radius }
198
- val modifier = Modifier.background(bgColor)
199
-
200
- return remember(type, color, theme, radius, bgColor) {
201
- when (type) {
202
- ButtonType.DISABLED -> modifier
203
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
204
-
205
- ButtonType.PRIMARY -> modifier
206
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
207
-
208
- ButtonType.SECONDARY -> modifier
209
- .border(1.dp, theme.colors.border.default, RoundedCornerShape(radius))
210
-
211
- ButtonType.OUTLINE -> modifier
212
- .border(1.dp, color ?: theme.colors.primary, RoundedCornerShape(radius))
213
-
214
- ButtonType.TONAL -> modifier
215
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
216
-
217
- ButtonType.DANGER -> modifier
218
- .border(0.dp, Color.Unspecified, RoundedCornerShape(radius))
219
-
220
- ButtonType.TEXT -> modifier
221
- }
222
- }
223
- }
224
-
225
- @Composable
226
- fun getButtonBackgroundColor(
227
- loading: Boolean,
228
- type: ButtonType
229
- ): Color {
230
- val theme = AppTheme.current
231
-
232
- return remember(loading, type, theme) {
233
- when (type) {
234
- ButtonType.DISABLED -> theme.colors.background.disable.withLoading(loading)
235
- ButtonType.PRIMARY -> theme.colors.primary.withLoading(loading)
236
- ButtonType.SECONDARY -> theme.colors.background.surface.withLoading(loading)
237
- ButtonType.OUTLINE -> theme.colors.background.surface.withLoading(loading)
238
- ButtonType.TONAL -> theme.colors.background.tonal.withLoading(loading)
239
- ButtonType.DANGER -> theme.colors.error.primary.withLoading(loading)
240
- ButtonType.TEXT -> Color.Unspecified
241
- }
242
- }
243
- }
244
-
245
- fun Color.withLoading(loading: Boolean): Color =
246
- this.copy(alpha = if (loading) 0.75f else 1f)
247
-
248
- @Composable
249
- fun Button(
250
- onClick: () -> Unit,
251
- type: ButtonType = ButtonType.PRIMARY,
252
- size: Size = Size.LARGE,
253
- iconRight: String = "",
254
- iconLeft: String = "",
255
- title: String = "Button",
256
- loading: Boolean = false,
257
- useTintColor: Boolean = true,
258
- isFull: Boolean = true,
259
- modifier: Modifier = Modifier,
260
- ) {
261
- val radius = remember(size) { size.value.radius }
262
- val isEnabled = remember(type) { type != ButtonType.DISABLED }
263
- val loadingOnLeft = remember(iconLeft, iconRight) {
264
- shouldLoadingOnLeft(iconLeft, iconRight)
265
- }
266
-
267
- val sizeSpecs = remember(size) { size.value }
268
-
269
- val interactionSource = remember { MutableInteractionSource() }
270
- val isPressed by interactionSource.collectIsPressedAsState()
271
-
272
- val animatedPadding by animateDpAsState(
273
- targetValue = if (isPressed && isEnabled && !loading) 2.dp else 0.dp,
274
- animationSpec = tween(100),
275
- label = "pressPadding"
276
- )
277
-
278
- val targetAlpha = if (isPressed && isEnabled && !loading) 0.5f else 1f
279
- val alpha by animateFloatAsState(
280
- targetValue = targetAlpha,
281
- animationSpec = tween(100),
282
- label = "buttonPressAlpha"
283
- )
284
-
285
- val clickableModifier =
286
- if (isEnabled && !loading) {
287
- modifier
288
- .clip(RoundedCornerShape(radius))
289
- .clickable(
290
- enabled = isEnabled && !loading,
291
- interactionSource = interactionSource,
292
- indication = null,
293
- onClick = onClick
294
- )
295
- .alpha(alpha)
296
- } else {
297
- modifier
298
- .clip(RoundedCornerShape(radius))
299
- }
300
-
301
- val bgColor = getButtonBackgroundColor(loading, type)
302
- val textColor = getTextColor(loading, type)
303
-
304
- val rootModifier = if (isFull) {
305
- Modifier
306
- .fillMaxWidth()
307
- .wrapContentHeight()
308
- } else {
309
- Modifier
310
- }
311
-
312
- Box(
313
- modifier = rootModifier.then(clickableModifier),
314
- contentAlignment = Alignment.Center
315
- ) {
316
- // Visual background (shrinks on press)
317
- Box(
318
- modifier = Modifier
319
- .matchParentSize()
320
- .padding(horizontal = animatedPadding)
321
- .clip(RoundedCornerShape(radius))
322
- .then(getTypeStyle(type, size = size, bgColor = bgColor))
323
- .conditional(IsShowBaseLineDebug) {
324
- border(1.dp, Colors.blue_03)
325
- }
326
- )
327
-
328
- // Content
329
- Row(
330
- modifier = Modifier
331
- .padding(horizontal = sizeSpecs.padding)
332
- .height(sizeSpecs.height),
333
- horizontalArrangement = Arrangement.Center,
334
- verticalAlignment = Alignment.CenterVertically,
335
- ) {
336
- RenderIcon(
337
- size = size,
338
- isIconLeft = true,
339
- useTintColor = useTintColor,
340
- icon = iconLeft,
341
- forceLoading = loading && loadingOnLeft,
342
- bgColor = bgColor,
343
- textColor = textColor
344
- )
345
- RenderTitle(size, title, textColor = textColor)
346
- RenderIcon(
347
- size = size,
348
- isIconLeft = false,
349
- useTintColor = useTintColor,
350
- icon = iconRight,
351
- forceLoading = loading && !loadingOnLeft,
352
- bgColor = bgColor,
353
- textColor = textColor
354
- )
355
- }
356
- }
357
- }
@@ -1,94 +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
- // Pre-computed shape for performance
26
- private val checkboxShape = RoundedCornerShape(Radius.XS)
27
-
28
- @Composable
29
- fun CheckBox(
30
- disabled: Boolean = false,
31
- checked: Boolean = false,
32
- onCheckedChange: (Boolean) -> Unit,
33
- indeterminate: Boolean = false,
34
- title: String = "",
35
- ) {
36
- // Cache theme access
37
- val theme = AppTheme.current
38
-
39
- // Memoize color calculations to avoid repeated conditional logic
40
- val colors = remember(checked, disabled, theme) {
41
- when {
42
- disabled && checked -> Pair(theme.colors.background.tonal, theme.colors.background.tonal)
43
- disabled -> Pair(theme.colors.border.disable, Color.Transparent)
44
- checked -> Pair(theme.colors.primary, theme.colors.primary)
45
- else -> Pair(theme.colors.text.default, Color.Transparent)
46
- }
47
- }
48
-
49
- val (borderColor, backgroundColor) = colors
50
-
51
- // Memoize icon source to avoid repeated conditional check
52
- val iconSource = remember(indeterminate) {
53
- if (indeterminate) "navigation_minus" else "ic_checked"
54
- }
55
-
56
- // Memoize click handler to avoid lambda recreation
57
- val onClickHandler = remember(onCheckedChange, checked) {
58
- { onCheckedChange(!checked) }
59
- }
60
-
61
- Row(verticalAlignment = Alignment.CenterVertically) {
62
- Box(
63
- modifier = Modifier
64
- .size(20.dp)
65
- .background(backgroundColor, checkboxShape)
66
- .border(Spacing.XXS, borderColor, checkboxShape)
67
- .conditional(IsShowBaseLineDebug) {
68
- border(1.dp, Colors.blue_03)
69
- }
70
- .activeOpacityClickable(
71
- activeOpacity = 0.8f,
72
- onClick = onClickHandler,
73
- enabled = !disabled,
74
- ),
75
- ) {
76
- if (checked) {
77
- Icon(
78
- source = iconSource,
79
- size = 20.dp,
80
- color = Colors.black_01
81
- )
82
- }
83
- }
84
-
85
- if (title.isNotEmpty()) {
86
- Spacer(Modifier.size(Spacing.S))
87
- Text(
88
- style = Typography.descriptionDefaultRegular,
89
- text = title,
90
- )
91
- }
92
- }
93
-
94
- }
@@ -1,136 +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.Arrangement
6
- import androidx.compose.foundation.layout.Row
7
- import androidx.compose.foundation.layout.height
8
- import androidx.compose.foundation.layout.padding
9
- import androidx.compose.foundation.layout.wrapContentWidth
10
- import androidx.compose.foundation.shape.RoundedCornerShape
11
- import androidx.compose.runtime.Composable
12
- import androidx.compose.runtime.Immutable
13
- import androidx.compose.ui.Alignment
14
- import androidx.compose.ui.Modifier
15
- import androidx.compose.ui.draw.clip
16
- import androidx.compose.ui.graphics.Color
17
- import androidx.compose.ui.text.style.TextAlign
18
- import androidx.compose.ui.text.style.TextOverflow
19
- import androidx.compose.ui.unit.dp
20
- import vn.momo.kits.const.AppTheme
21
- import vn.momo.kits.const.Colors
22
- import vn.momo.kits.const.Radius
23
- import vn.momo.kits.const.Typography
24
- import vn.momo.kits.application.IsShowBaseLineDebug
25
- import vn.momo.kits.const.scaleSize
26
- import vn.momo.kits.modifier.activeOpacityClickable
27
- import vn.momo.kits.modifier.conditional
28
- import vn.momo.kits.modifier.setAutomationId
29
-
30
- @Composable
31
- fun Chip(
32
- modifier: Modifier = Modifier,
33
- label: String? = "Label",
34
- iconLeft: String? = null,
35
- iconRight: String? = null,
36
- selected: Boolean = false,
37
- onClick: () -> Unit = {},
38
- size: ChipSize = ChipSize.LARGE,
39
- iconLeftTint: Color? = null,
40
- iconRightTint: Color? = null,
41
- backgroundColor: Color? = null,
42
- accessibilityLabel: String? = null,
43
- ) {
44
- val theme = AppTheme.current
45
- val bg = when {
46
- selected -> theme.colors.background.selected
47
- backgroundColor != null -> backgroundColor
48
- else -> Colors.black_03
49
- }
50
-
51
- val textColor = if (selected) theme.colors.primary else theme.colors.text.default
52
- val leftTint = if (selected) theme.colors.primary else iconLeftTint ?: theme.colors.text.default
53
- val rightTint = if (selected) theme.colors.primary else iconRightTint ?: theme.colors.text.default
54
-
55
- val dims = when (size) {
56
- ChipSize.SMALL -> ChipDefaults.Small
57
- ChipSize.LARGE -> ChipDefaults.Large
58
- }
59
-
60
- val (height, horizontal, iconSize, iconSpacing) =
61
- listOf(scaleSize(dims.height), scaleSize(dims.horizontal), scaleSize(dims.iconSize), scaleSize(dims.iconSpacing))
62
-
63
- val radius = scaleSize(Radius.L)
64
-
65
- Row(
66
- modifier
67
- .wrapContentWidth()
68
- .height(height.dp)
69
- .clip(RoundedCornerShape(radius))
70
- .background(bg)
71
- .conditional(selected) {
72
- Modifier.border(width = 2.dp, color = theme.colors.secondary, shape = RoundedCornerShape(radius))
73
- }
74
- .conditional(IsShowBaseLineDebug) {
75
- border(1.dp, Colors.blue_03)
76
- }
77
- .activeOpacityClickable {
78
- onClick()
79
- }
80
- .padding(horizontal = horizontal.dp)
81
- .conditional(accessibilityLabel != null) {
82
- setAutomationId(accessibilityLabel.toString())
83
- },
84
- verticalAlignment = Alignment.CenterVertically,
85
- horizontalArrangement = Arrangement.spacedBy(iconSpacing.dp)
86
- ) {
87
- if (iconLeft != null) {
88
- Icon(source = iconLeft, size = dims.iconSize.dp, color = leftTint)
89
- }
90
-
91
- if (!label.isNullOrEmpty()) {
92
- Text(
93
- text = label,
94
- textAlign = TextAlign.Center,
95
- color = textColor,
96
- style = when (size) {
97
- ChipSize.SMALL -> Typography.labelSMedium
98
- ChipSize.LARGE -> Typography.labelDefaultMedium
99
- },
100
- maxLines = 1,
101
- overflow = TextOverflow.Ellipsis,
102
- modifier = Modifier.weight(1f, fill = false),
103
- )
104
- }
105
-
106
- if (iconRight != null) {
107
- Icon(source = iconRight, size = iconSize.dp, color = rightTint)
108
- }
109
- }
110
- }
111
-
112
- enum class ChipSize { SMALL, LARGE }
113
-
114
- object ChipDefaults {
115
- @Immutable
116
- data class Dimensions(
117
- val height: Float,
118
- val horizontal: Float,
119
- val iconSize: Float,
120
- val iconSpacing: Float,
121
- )
122
-
123
- val Large = Dimensions(
124
- height = 32f,
125
- horizontal = 12f,
126
- iconSize = 20f,
127
- iconSpacing = 4f,
128
- )
129
-
130
- val Small = Dimensions(
131
- height = 24f,
132
- horizontal = 10f,
133
- iconSize = 16f,
134
- iconSpacing = 4f,
135
- )
136
- }