@momo-kits/native-kits 0.165.1-beta.10 → 0.165.2-beta.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 (152) hide show
  1. package/CLAUDE.md +1 -0
  2. package/ios/Application/Navigation/NavigatorManager.swift +0 -27
  3. package/ios/Information/Information.swift +5 -2
  4. package/ios/InputMoney/InputMoney.swift +76 -21
  5. package/ios/Typography/Text.swift +41 -1
  6. package/ios/native-kits.podspec +1 -1
  7. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  8. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +9 -1
  9. package/package.json +1 -1
  10. package/publish.sh +25 -0
  11. package/.codegraph/codegraph.db +0 -0
  12. package/.codegraph/daemon.log +0 -100
  13. package/build.gradle.kts +0 -11
  14. package/compose/build.gradle.kts +0 -190
  15. package/compose/build.gradle.kts.backup +0 -190
  16. package/compose/compose.podspec +0 -47
  17. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  18. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  19. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  20. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  21. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -150
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -831
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -134
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -475
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -216
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -264
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -328
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -97
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -552
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -16
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -296
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -52
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -38
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -39
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -299
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -129
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -207
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -609
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -175
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -225
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -331
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -81
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -106
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -75
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -309
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -37
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -364
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -69
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -105
  138. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -40
  139. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -98
  140. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  141. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  142. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  143. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -217
  144. package/gradle/libs.versions.toml +0 -69
  145. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  146. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  147. package/gradle.properties +0 -26
  148. package/gradlew +0 -252
  149. package/gradlew.bat +0 -94
  150. package/ios-demo/README.md +0 -120
  151. package/local.properties +0 -8
  152. package/settings.gradle.kts +0 -64
@@ -1,66 +0,0 @@
1
- package vn.momo.kits.modifier
2
-
3
- import androidx.compose.animation.core.animateFloatAsState
4
- import androidx.compose.foundation.clickable
5
- import androidx.compose.foundation.gestures.detectTapGestures
6
- import androidx.compose.foundation.interaction.MutableInteractionSource
7
- import androidx.compose.foundation.interaction.collectIsPressedAsState
8
- import androidx.compose.runtime.getValue
9
- import androidx.compose.runtime.remember
10
- import androidx.compose.ui.Modifier
11
- import androidx.compose.ui.composed
12
- import androidx.compose.ui.graphics.graphicsLayer
13
- import androidx.compose.ui.input.pointer.pointerInput
14
- import androidx.compose.ui.platform.LocalFocusManager
15
- import androidx.compose.ui.platform.LocalSoftwareKeyboardController
16
- import androidx.compose.ui.semantics.Role
17
-
18
- fun Modifier.noFeedbackClickable(
19
- enabled: Boolean = true, onClickLabel: String? = null, role: Role? = null, onClick: () -> Unit
20
- ): Modifier = composed {
21
- clickable(
22
- interactionSource = remember { MutableInteractionSource() },
23
- indication = null,
24
- enabled,
25
- onClickLabel,
26
- role,
27
- onClick
28
- )
29
- }
30
-
31
- fun Modifier.activeOpacityClickable(
32
- activeOpacity: Float = 0.2f,
33
- enabled: Boolean = true,
34
- onClickLabel: String? = null,
35
- role: Role? = null,
36
- onClick: () -> Unit
37
- ): Modifier = composed {
38
- val interactionSource = remember { MutableInteractionSource() }
39
- val isPressed by interactionSource.collectIsPressedAsState()
40
- val animatedAlpha by animateFloatAsState(
41
- targetValue = if (isPressed) activeOpacity else 1f,
42
- label = "ActiveOpacity"
43
- )
44
-
45
- this
46
- .graphicsLayer { alpha = animatedAlpha }
47
- .clickable(
48
- interactionSource = interactionSource,
49
- indication = null,
50
- enabled,
51
- onClickLabel,
52
- role,
53
- onClick
54
- )
55
- }
56
- fun Modifier.hideKeyboardOnTap() = composed {
57
- val focusManager = LocalFocusManager.current
58
- val keyboardManager = LocalSoftwareKeyboardController.current
59
-
60
- pointerInput(Unit) {
61
- detectTapGestures {
62
- keyboardManager?.hide()
63
- focusManager.clearFocus()
64
- }
65
- }
66
- }
@@ -1,11 +0,0 @@
1
- package vn.momo.kits.modifier
2
-
3
- import androidx.compose.ui.Modifier
4
-
5
- fun Modifier.conditional(condition: Boolean, modifier: Modifier.() -> Modifier): Modifier {
6
- return if (condition) {
7
- then(modifier(Modifier))
8
- } else {
9
- this
10
- }
11
- }
@@ -1,104 +0,0 @@
1
- package vn.momo.kits.modifier
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.runtime.Composable
10
- import androidx.compose.runtime.getValue
11
- import androidx.compose.ui.Modifier
12
- import androidx.compose.ui.draw.drawWithContent
13
- import androidx.compose.ui.geometry.Offset
14
- import androidx.compose.ui.graphics.Color
15
- import androidx.compose.ui.graphics.drawscope.clipRect
16
- import androidx.compose.ui.text.TextStyle
17
- import androidx.compose.ui.text.drawText
18
- import androidx.compose.ui.text.font.FontWeight
19
- import androidx.compose.ui.text.rememberTextMeasurer
20
- import androidx.compose.ui.unit.sp
21
- import vn.momo.kits.application.IsShowBaseLineDebug
22
- import vn.momo.kits.const.Colors
23
-
24
- @Suppress("ExperimentalAnnotationRetention")
25
- @RequiresOptIn(
26
- message = "This is internal API of native-kits, become internal in next sprint",
27
- level = RequiresOptIn.Level.WARNING,
28
- )
29
- @Retention(AnnotationRetention.BINARY)
30
- @Target(
31
- AnnotationTarget.CLASS,
32
- AnnotationTarget.FUNCTION,
33
- AnnotationTarget.PROPERTY,
34
- )
35
- annotation class InternalApi
36
-
37
- @Composable
38
- fun DeprecatedModifier(text: String = "Deprecated component"): Modifier = debugMarker(
39
- label = text,
40
- background = Colors.red_04.copy(alpha = 0.7f),
41
- textColor = Colors.red_01,
42
- animationLabel = "deprecatedMarquee",
43
- )
44
-
45
- @Composable
46
- private fun debugMarker(
47
- label: String,
48
- background: Color,
49
- textColor: Color,
50
- animationLabel: String,
51
- ): Modifier {
52
- if (!IsShowBaseLineDebug) return Modifier
53
-
54
- val textMeasurer = rememberTextMeasurer()
55
- val marquee = rememberInfiniteTransition(label = animationLabel)
56
- val progress by marquee.animateFloat(
57
- initialValue = 0f,
58
- targetValue = 1f,
59
- animationSpec = infiniteRepeatable(
60
- animation = tween(durationMillis = 4000, easing = LinearEasing),
61
- repeatMode = RepeatMode.Restart,
62
- ),
63
- label = "${animationLabel}Progress",
64
- )
65
-
66
- return Modifier.drawWithContent {
67
- drawContent()
68
- drawRect(color = background)
69
-
70
- if (size.width <= 0f || size.height <= 0f) return@drawWithContent
71
-
72
- val fontPx = (size.width * 0.1f).coerceIn(12.sp.toPx(), 20.sp.toPx())
73
- val style = TextStyle(
74
- color = textColor,
75
- fontSize = fontPx.toSp(),
76
- fontWeight = FontWeight.Bold,
77
- )
78
-
79
- val intrinsic = textMeasurer.measure(
80
- text = label,
81
- style = style,
82
- maxLines = 1,
83
- softWrap = false,
84
- )
85
- val textW = intrinsic.size.width
86
- val textH = intrinsic.size.height
87
- val y = (size.height - textH) / 2f
88
-
89
- if (textW <= size.width) {
90
- drawText(
91
- textLayoutResult = intrinsic,
92
- topLeft = Offset((size.width - textW) / 2f, y),
93
- )
94
- } else {
95
- clipRect(right = size.width, bottom = size.height) {
96
- val gap = textW * 0.5f
97
- val travel = textW + gap
98
- val x = -progress * travel
99
- drawText(textLayoutResult = intrinsic, topLeft = Offset(x, y))
100
- drawText(textLayoutResult = intrinsic, topLeft = Offset(x + travel, y))
101
- }
102
- }
103
- }
104
- }
@@ -1,48 +0,0 @@
1
- package vn.momo.kits.modifier
2
-
3
- import androidx.compose.ui.Modifier
4
- import androidx.compose.ui.draw.drawBehind
5
- import androidx.compose.ui.graphics.Color
6
- import androidx.compose.ui.graphics.Paint
7
- import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
8
- import androidx.compose.ui.unit.Dp
9
- import androidx.compose.ui.unit.dp
10
- import vn.momo.kits.platform.setColor
11
- import vn.momo.kits.platform.setMaskFilter
12
- fun Modifier.shadow(
13
- color: Color = Color.Black,
14
- borderRadius: Dp = 0.dp,
15
- blurRadius: Float = 0f,
16
- offsetY: Dp = 0.dp,
17
- offsetX: Dp = 0.dp,
18
- spread: Dp = 0f.dp,
19
- modifier: Modifier = Modifier
20
- ) = this.then(
21
- modifier.drawBehind {
22
- this.drawIntoCanvas {
23
- val paint = Paint()
24
- val frameworkPaint = paint.asFrameworkPaint()
25
- val spreadPixel = spread.toPx()
26
- val leftPixel = (0f - spreadPixel) + offsetX.toPx()
27
- val topPixel = (0f - spreadPixel) + offsetY.toPx()
28
- val rightPixel = (this.size.width + spreadPixel)
29
- val bottomPixel = (0f + spreadPixel) - offsetY.toPx()
30
-
31
- if (blurRadius != 0f) {
32
- frameworkPaint.setMaskFilter(blurRadius)
33
- }
34
-
35
- frameworkPaint.setColor(color)
36
-
37
- it.drawRoundRect(
38
- left = leftPixel,
39
- top = topPixel,
40
- right = rightPixel,
41
- bottom = bottomPixel,
42
- radiusX = borderRadius.toPx(),
43
- radiusY = borderRadius.toPx(),
44
- paint
45
- )
46
- }
47
- }
48
- )
@@ -1,51 +0,0 @@
1
- package vn.momo.kits.modifier
2
-
3
- import androidx.compose.runtime.Composable
4
- import androidx.compose.runtime.State
5
- import androidx.compose.ui.Modifier
6
- import androidx.compose.ui.layout.Measurable
7
- import androidx.compose.ui.layout.MeasureResult
8
- import androidx.compose.ui.layout.MeasureScope
9
- import androidx.compose.ui.node.LayoutModifierNode
10
- import androidx.compose.ui.node.ModifierNodeElement
11
- import androidx.compose.ui.unit.Constraints
12
- import androidx.compose.ui.unit.IntOffset
13
-
14
- @Composable
15
- fun Modifier.dynamicSize(
16
- widthState: State<Int>? = null,
17
- heightState: State<Int>? = null,
18
- ) = this then DynamicSizeElement(widthState, heightState)
19
-
20
- private data class DynamicSizeElement(
21
- val widthState: State<Int>?,
22
- val heightState: State<Int>?,
23
- ) : ModifierNodeElement<DynamicSizeNode>() {
24
- override fun create(): DynamicSizeNode {
25
- return DynamicSizeNode(widthState, heightState)
26
- }
27
-
28
- override fun update(node: DynamicSizeNode) {
29
- node.widthState = widthState
30
- node.heightState = heightState
31
- }
32
-
33
- }
34
-
35
- private class DynamicSizeNode(
36
- var widthState: State<Int>?,
37
- var heightState: State<Int>?,
38
- ) : Modifier.Node(), LayoutModifierNode {
39
- override fun MeasureScope.measure(
40
- measurable: Measurable,
41
- constraints: Constraints
42
- ): MeasureResult {
43
- val p = measurable.measure(constraints)
44
- return layout(
45
- width = widthState?.value ?: p.width,
46
- height = heightState?.value ?: p.height,
47
- ) {
48
- p.place(IntOffset.Zero)
49
- }
50
- }
51
- }
@@ -1,299 +0,0 @@
1
- package vn.momo.kits.navigation
2
-
3
- import androidx.compose.animation.core.Animatable
4
- import androidx.compose.animation.core.CubicBezierEasing
5
- import androidx.compose.animation.core.tween
6
- import androidx.compose.foundation.background
7
- import androidx.compose.foundation.border
8
- import androidx.compose.foundation.gestures.detectDragGestures
9
- import androidx.compose.foundation.layout.Box
10
- import androidx.compose.foundation.layout.BoxWithConstraints
11
- import androidx.compose.foundation.layout.Column
12
- import androidx.compose.foundation.layout.Row
13
- import androidx.compose.foundation.layout.Spacer
14
- import androidx.compose.foundation.layout.fillMaxHeight
15
- import androidx.compose.foundation.layout.fillMaxSize
16
- import androidx.compose.foundation.layout.fillMaxWidth
17
- import androidx.compose.foundation.layout.height
18
- import androidx.compose.foundation.layout.heightIn
19
- import androidx.compose.foundation.layout.offset
20
- import androidx.compose.foundation.layout.padding
21
- import androidx.compose.foundation.layout.size
22
- import androidx.compose.foundation.layout.width
23
- import androidx.compose.foundation.shape.RoundedCornerShape
24
- import androidx.compose.runtime.Composable
25
- import androidx.compose.runtime.DisposableEffect
26
- import androidx.compose.runtime.LaunchedEffect
27
- import androidx.compose.runtime.remember
28
- import androidx.compose.runtime.rememberCoroutineScope
29
- import androidx.compose.ui.Alignment
30
- import androidx.compose.ui.Modifier
31
- import androidx.compose.ui.graphics.Brush
32
- import androidx.compose.ui.graphics.Color
33
- import androidx.compose.ui.input.pointer.pointerInput
34
- import androidx.compose.ui.platform.LocalDensity
35
- import androidx.compose.ui.unit.IntOffset
36
- import androidx.compose.ui.unit.dp
37
- import kotlinx.coroutines.launch
38
- import vn.momo.kits.components.Divider
39
- import vn.momo.kits.components.Icon
40
- import vn.momo.kits.components.Text
41
- import vn.momo.kits.const.AppTheme
42
- import vn.momo.kits.const.Colors
43
- import vn.momo.kits.const.Radius
44
- import vn.momo.kits.const.Spacing
45
- import vn.momo.kits.application.LocalContext
46
- import vn.momo.kits.application.IsShowBaseLineDebug
47
- import vn.momo.kits.const.AppNavigationBar
48
- import vn.momo.kits.const.Typography
49
- import vn.momo.kits.navigation.tracking.ScreenTracker
50
- import vn.momo.kits.modifier.conditional
51
- import vn.momo.kits.modifier.noFeedbackClickable
52
- import vn.momo.kits.platform.BackHandler
53
- import vn.momo.kits.platform.getScreenHeight
54
-
55
- @Composable
56
- internal fun BottomSheet(
57
- content: @Composable () -> Unit,
58
- header: BottomHeader,
59
- isSurface: Boolean = false,
60
- barrierDismissible: Boolean = true,
61
- draggable: Boolean = true,
62
- useBottomInset: Boolean = true,
63
- footerComponent: (@Composable () -> Unit)? = null,
64
- onDismiss: (() -> Unit)?
65
- ) {
66
- val screenHeightDp = getScreenHeight()
67
- val screenHeightPx = with(LocalDensity.current) { screenHeightDp.toPx() }
68
- val sheetOffset = remember { Animatable(screenHeightPx) }
69
-
70
- val backgroundAlpha = remember { Animatable(0f) }
71
- val dynamicAlpha = ((1f - (sheetOffset.value / screenHeightPx)).coerceIn(0f, 1f)) * 0.3f
72
- val alpha = backgroundAlpha.value + dynamicAlpha
73
-
74
- val sheetCloseOffset = with(LocalDensity.current) { 100.dp.toPx() }
75
-
76
- val coroutineScope = rememberCoroutineScope()
77
-
78
- val maxApi = LocalMaxApi.current
79
- val context = LocalContext.current
80
-
81
- DisposableEffect(Unit) {
82
- ScreenTracker.trackPopupDisplayed(
83
- maxApi = maxApi,
84
- context = context,
85
- parentScreenName = ScreenTracker.getLastScreenName()
86
- )
87
- onDispose { }
88
- }
89
-
90
- suspend fun openEvent(){
91
- backgroundAlpha.animateTo(
92
- targetValue = 0.3f,
93
- animationSpec = tween(
94
- durationMillis = 100,
95
- easing = CubicBezierEasing(0.05f, 0.7f, 0.1f, 1f)
96
- )
97
- )
98
- sheetOffset.animateTo(
99
- targetValue = 0f,
100
- animationSpec = tween(
101
- durationMillis = 350,
102
- easing = CubicBezierEasing(0.05f, 0.7f, 0.1f, 1f)
103
- )
104
- )
105
- }
106
-
107
- fun closeEvent(){
108
- coroutineScope.launch {
109
- sheetOffset.animateTo(
110
- targetValue = screenHeightPx,
111
- animationSpec = tween(
112
- durationMillis = 200,
113
- easing = CubicBezierEasing(0.3f, 0.0f, 0.8f, 0.15f)
114
- )
115
- )
116
- backgroundAlpha.animateTo(
117
- targetValue = 0f,
118
- animationSpec = tween(
119
- durationMillis = 100,
120
- easing = CubicBezierEasing(0.3f, 0.0f, 0.8f, 0.15f)
121
- )
122
- )
123
- OverplayComponentRegistry.hardClearAfterDismiss()
124
- }
125
- }
126
-
127
- LaunchedEffect(Unit) {
128
- openEvent()
129
- }
130
-
131
- DisposableEffect(Unit) {
132
- OverplayComponentRegistry.bindClose { closeEvent() }
133
- onDispose {
134
- onDismiss?.invoke()
135
- }
136
- }
137
-
138
- BackHandler(true){
139
- closeEvent()
140
- }
141
-
142
- BoxWithConstraints(
143
- modifier = Modifier
144
- .fillMaxSize()
145
- .background(Color.Black.copy(alpha = alpha))
146
- .noFeedbackClickable {
147
- if(barrierDismissible) closeEvent()
148
- }
149
- ) {
150
- val parentHeight = with(LocalDensity.current) { constraints.maxHeight.toDp() }
151
-
152
- Box(
153
- modifier = Modifier
154
- .align(Alignment.BottomCenter)
155
- .offset { IntOffset(x = 0, y = sheetOffset.value.toInt()) }
156
- .fillMaxWidth()
157
- .heightIn(max = parentHeight - 90.dp)
158
- .background(
159
- color = if (isSurface) AppTheme.current.colors.background.surface else AppTheme.current.colors.background.default,
160
- shape = RoundedCornerShape(topStart = Radius.M, topEnd = Radius.M)
161
- )
162
- .conditional(IsShowBaseLineDebug) {
163
- border(1.dp, Colors.blue_03)
164
- }
165
- .noFeedbackClickable { },
166
- contentAlignment = Alignment.BottomCenter
167
- ) {
168
- val bottomInset = if (useBottomInset) {
169
- (AppNavigationBar.current - keyboardSizeState().value).coerceAtLeast(0.dp)
170
- } else 0.dp
171
- Column(Modifier.padding(bottom = bottomInset)) {
172
- Box(
173
- modifier = Modifier
174
- .height(72.dp)
175
- .fillMaxWidth()
176
- .conditional(draggable) {
177
- pointerInput(Unit) {
178
- detectDragGestures(
179
- onDrag = { change, dragAmount ->
180
- change.consume()
181
- coroutineScope.launch {
182
- val newOffset = (sheetOffset.value + dragAmount.y).coerceAtLeast(0f)
183
- sheetOffset.snapTo(newOffset)
184
- }
185
- },
186
- onDragEnd = {
187
- coroutineScope.launch {
188
- if (sheetOffset.value > sheetCloseOffset) {
189
- closeEvent()
190
- } else {
191
- sheetOffset.animateTo(0f)
192
- }
193
- }
194
- }
195
- )
196
- }
197
- }
198
- ) {
199
- Column(
200
- modifier = Modifier
201
- .fillMaxSize()
202
- .padding(horizontal = Spacing.M),
203
- horizontalAlignment = Alignment.CenterHorizontally
204
- ) {
205
- Spacer(Modifier.height(8.dp))
206
- Box(
207
- modifier = Modifier
208
- .height(4.dp)
209
- .width(40.dp)
210
- .background(
211
- color = Colors.black_06,
212
- shape = RoundedCornerShape(Radius.S)
213
- )
214
- )
215
- Spacer(Modifier.height(4.dp))
216
- Box(Modifier.fillMaxWidth().height(56.dp), contentAlignment = Alignment.Center){
217
- when (header) {
218
- is BottomHeader.Title -> {
219
- Row(modifier = Modifier.fillMaxSize(), verticalAlignment = Alignment.CenterVertically) {
220
- Box(Modifier.size(24.dp))
221
- Box(Modifier.fillMaxHeight().weight(1f), contentAlignment = Alignment.Center){
222
- Text(
223
- text = header.data,
224
- color = Colors.black_17,
225
- style = Typography.headerDefaultBold
226
- )
227
- }
228
- Box(Modifier
229
- .size(24.dp)
230
- .noFeedbackClickable {
231
- closeEvent()
232
- },
233
- contentAlignment = Alignment.Center
234
- ){
235
- Icon(source = "navigation_close")
236
- }
237
- }
238
- }
239
- is BottomHeader.Custom -> {
240
- header.content()
241
- }
242
- }
243
- }
244
- }
245
- }
246
- Divider()
247
- if (footerComponent != null) {
248
- Box(Modifier.weight(1f, fill = false)) {
249
- content()
250
- }
251
- BottomSheetFooter(footerComponent)
252
- } else {
253
- content()
254
- }
255
- }
256
- }
257
- }
258
- }
259
-
260
- @Composable
261
- private fun BottomSheetFooter(footerComponent: @Composable () -> Unit) {
262
- val shadowBrush = remember {
263
- Brush.verticalGradient(
264
- colors = listOf(Color.Transparent, Color.Black.copy(alpha = 0.05f))
265
- )
266
- }
267
-
268
- Box {
269
- Box(
270
- Modifier
271
- .fillMaxWidth()
272
- .background(AppTheme.current.colors.background.surface)
273
- .conditional(IsShowBaseLineDebug) {
274
- border(1.dp, Colors.blue_03)
275
- }
276
- .padding(vertical = Spacing.S)
277
- ) {
278
- footerComponent()
279
- }
280
-
281
- Box(
282
- modifier = Modifier
283
- .fillMaxWidth()
284
- .height(6.dp)
285
- .offset(x = 0.dp, y = (-6).dp)
286
- .background(shadowBrush)
287
- )
288
- }
289
- }
290
-
291
- sealed class BottomHeader {
292
- data class Title(
293
- val data: String = "Bottom Sheet Title",
294
- ) : BottomHeader()
295
-
296
- data class Custom(
297
- val content: @Composable () -> Unit
298
- ) : BottomHeader()
299
- }