@momo-kits/native-kits 0.163.1-beta.9-debug → 0.163.1-beta.9
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.
- package/package.json +1 -1
- package/build.gradle.kts +0 -11
- package/compose/build.gradle.kts +0 -190
- package/compose/build.gradle.kts.backup +0 -190
- package/compose/compose.podspec +0 -47
- package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -150
- package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
- package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
- package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -106
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -294
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -826
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -112
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -477
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -214
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -216
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -259
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -182
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -328
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -97
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -217
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -470
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -131
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -203
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -175
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -276
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -65
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -48
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -51
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -253
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -129
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -100
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -172
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -360
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -581
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -156
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -225
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -320
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -81
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -309
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -34
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -360
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -128
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -69
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -105
- package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -207
- package/gradle/libs.versions.toml +0 -69
- package/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/gradle/wrapper/gradle-wrapper.properties +0 -8
- package/gradle.properties +0 -26
- package/gradlew +0 -252
- package/gradlew.bat +0 -94
- package/ios-demo/README.md +0 -120
- package/local.properties +0 -8
- package/settings.gradle.kts +0 -64
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.const
|
|
2
|
-
|
|
3
|
-
import androidx.compose.runtime.Composable
|
|
4
|
-
import androidx.compose.runtime.Immutable
|
|
5
|
-
import androidx.compose.ui.platform.LocalDensity
|
|
6
|
-
import androidx.compose.ui.text.TextStyle
|
|
7
|
-
import androidx.compose.ui.text.font.FontFamily
|
|
8
|
-
import androidx.compose.ui.text.font.FontWeight
|
|
9
|
-
import androidx.compose.ui.text.style.TextDecoration
|
|
10
|
-
import androidx.compose.ui.unit.*
|
|
11
|
-
import org.jetbrains.compose.resources.Font
|
|
12
|
-
import org.jetbrains.compose.resources.FontResource
|
|
13
|
-
import org.jetbrains.compose.resources.InternalResourceApi
|
|
14
|
-
import vn.momo.kits.application.LocalContext
|
|
15
|
-
import vn.momo.kits.platform.getScreenDimensions
|
|
16
|
-
import vn.momo.uikits.resources.*
|
|
17
|
-
import kotlin.math.max
|
|
18
|
-
import kotlin.math.min
|
|
19
|
-
|
|
20
|
-
const val DEFAULT_SCREEN_SIZE = 375f
|
|
21
|
-
const val MAX_FONT_SCALE = 1.5f
|
|
22
|
-
const val MAX_DEVICE_SCALE = 5
|
|
23
|
-
|
|
24
|
-
@Composable
|
|
25
|
-
fun scaleSize(size: Float): Float {
|
|
26
|
-
val context = LocalContext.current
|
|
27
|
-
// Host-pushed context wins; otherwise fall back to the app-wide KitFontScale holder.
|
|
28
|
-
val useOsScale = context?.useOSScaleRate ?: KitFontScale.useOSScaleRate
|
|
29
|
-
if (!useOsScale) {
|
|
30
|
-
return size * (context?.userScaleRate ?: KitFontScale.userScaleRate)
|
|
31
|
-
}
|
|
32
|
-
val scaleSizeMaxRate: Float = MAX_FONT_SCALE
|
|
33
|
-
val deviceWidth = getScreenDimensions().width
|
|
34
|
-
val deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE
|
|
35
|
-
|
|
36
|
-
val density = LocalDensity.current
|
|
37
|
-
val fontScale = density.fontScale
|
|
38
|
-
|
|
39
|
-
var fontSizeScaleDevice = size
|
|
40
|
-
var fontSizeScaleOS = size
|
|
41
|
-
|
|
42
|
-
if (deviceScale > 1) {
|
|
43
|
-
fontSizeScaleDevice =
|
|
44
|
-
min(deviceScale * fontSizeScaleDevice, fontSizeScaleDevice + MAX_DEVICE_SCALE)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (fontScale > 1) {
|
|
48
|
-
fontSizeScaleOS = min(fontScale * fontSizeScaleOS, fontSizeScaleOS * scaleSizeMaxRate)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return max(
|
|
52
|
-
fontSizeScaleDevice,
|
|
53
|
-
fontSizeScaleOS
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
@Composable
|
|
58
|
-
fun scaleSize(size: TextUnit): TextUnit {
|
|
59
|
-
if (!size.isSp) return size
|
|
60
|
-
|
|
61
|
-
val density = LocalDensity.current
|
|
62
|
-
|
|
63
|
-
val scaled = scaleSize(size.value)
|
|
64
|
-
val spValue = scaled / density.fontScale
|
|
65
|
-
|
|
66
|
-
return TextUnit(value = spValue, type = TextUnitType.Sp)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
@Composable
|
|
70
|
-
fun scaleSize(size: Dp): Dp {
|
|
71
|
-
return scaleSize(size.value).dp
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@Composable
|
|
75
|
-
fun scaleSize(textStyle: TextStyle): TextStyle {
|
|
76
|
-
return textStyle.copy(
|
|
77
|
-
fontSize = if (textStyle.fontSize != TextUnit.Unspecified)
|
|
78
|
-
scaleSize(textStyle.fontSize)
|
|
79
|
-
else
|
|
80
|
-
TextUnit.Unspecified,
|
|
81
|
-
|
|
82
|
-
lineHeight = if (textStyle.lineHeight != TextUnit.Unspecified)
|
|
83
|
-
scaleSize(textStyle.lineHeight)
|
|
84
|
-
else
|
|
85
|
-
TextUnit.Unspecified,
|
|
86
|
-
)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
@OptIn(InternalResourceApi::class)
|
|
91
|
-
@Composable
|
|
92
|
-
internal fun getFont(font: FontResource): FontFamily {
|
|
93
|
-
return FontFamily(Font(font))
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
@Composable
|
|
97
|
-
fun getFontFamily(fontFamily: String, fontWeight: FontWeight? = FontWeight.Normal): FontFamily {
|
|
98
|
-
val key = "$fontFamily-${fontWeight?.weight}"
|
|
99
|
-
val fontMap = mapOf(
|
|
100
|
-
"SFProText-100" to Res.font.sfprotext_thin,
|
|
101
|
-
"SFProText-200" to Res.font.sfprotext_ultralight,
|
|
102
|
-
"SFProText-300" to Res.font.sfprotext_light,
|
|
103
|
-
"SFProText-400" to Res.font.sfprotext_regular,
|
|
104
|
-
"SFProText-500" to Res.font.sfprotext_medium,
|
|
105
|
-
"SFProText-600" to Res.font.sfprotext_semibold,
|
|
106
|
-
"SFProText-700" to Res.font.sfprotext_bold,
|
|
107
|
-
"SFProText-800" to Res.font.sfprotext_heavy,
|
|
108
|
-
"SFProText-900" to Res.font.sfprotext_black,
|
|
109
|
-
|
|
110
|
-
"MoMoSignature-100" to Res.font.momosignature,
|
|
111
|
-
"MoMoSignature-200" to Res.font.momosignature,
|
|
112
|
-
"MoMoSignature-300" to Res.font.momosignature,
|
|
113
|
-
"MoMoSignature-400" to Res.font.momosignature,
|
|
114
|
-
"MoMoSignature-500" to Res.font.momosignature,
|
|
115
|
-
"MoMoSignature-600" to Res.font.momosignature,
|
|
116
|
-
"MoMoSignature-700" to Res.font.momosignature,
|
|
117
|
-
"MoMoSignature-800" to Res.font.momosignature,
|
|
118
|
-
"MoMoSignature-900" to Res.font.momosignature,
|
|
119
|
-
|
|
120
|
-
"MoMoTrustDisplay-100" to Res.font.momotrustdisplay,
|
|
121
|
-
"MoMoTrustDisplay-200" to Res.font.momotrustdisplay,
|
|
122
|
-
"MoMoTrustDisplay-300" to Res.font.momotrustdisplay,
|
|
123
|
-
"MoMoTrustDisplay-400" to Res.font.momotrustdisplay,
|
|
124
|
-
"MoMoTrustDisplay-500" to Res.font.momotrustdisplay,
|
|
125
|
-
"MoMoTrustDisplay-600" to Res.font.momotrustdisplay,
|
|
126
|
-
"MoMoTrustDisplay-700" to Res.font.momotrustdisplay,
|
|
127
|
-
"MoMoTrustDisplay-800" to Res.font.momotrustdisplay,
|
|
128
|
-
"MoMoTrustDisplay-900" to Res.font.momotrustdisplay,
|
|
129
|
-
)
|
|
130
|
-
val font = fontMap[key] ?: Res.font.sfprotext_regular
|
|
131
|
-
return getFont(font)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
@Immutable
|
|
135
|
-
class AppTypography internal constructor(
|
|
136
|
-
val headlineDefaultBold: TextStyle,
|
|
137
|
-
val headerMBold: TextStyle,
|
|
138
|
-
val headerDefaultBold: TextStyle,
|
|
139
|
-
val headerSSemibold: TextStyle,
|
|
140
|
-
val headerXsSemibold: TextStyle,
|
|
141
|
-
val bodyDefaultRegular: TextStyle,
|
|
142
|
-
val bodyDefaultRegularStrikethrough: TextStyle,
|
|
143
|
-
val descriptionDefaultRegular: TextStyle,
|
|
144
|
-
val descriptionDefaultRegularStrikethrough: TextStyle,
|
|
145
|
-
val descriptionXsRegular: TextStyle,
|
|
146
|
-
val descriptionXsRegularStrikethrough: TextStyle,
|
|
147
|
-
val labelDefaultMedium: TextStyle,
|
|
148
|
-
val labelSMedium: TextStyle,
|
|
149
|
-
val labelXsMedium: TextStyle,
|
|
150
|
-
val actionDefaultBold: TextStyle,
|
|
151
|
-
val actionSBold: TextStyle,
|
|
152
|
-
val actionXsBold: TextStyle,
|
|
153
|
-
val actionXxsBold: TextStyle,
|
|
154
|
-
) {
|
|
155
|
-
constructor(
|
|
156
|
-
default: TextStyle = TextStyle(
|
|
157
|
-
fontSize = 14.sp,
|
|
158
|
-
lineHeight = 20.sp,
|
|
159
|
-
fontWeight = FontWeight.Normal
|
|
160
|
-
),
|
|
161
|
-
headlineDefaultBold: TextStyle = TextStyle(
|
|
162
|
-
fontSize = 24.sp,
|
|
163
|
-
lineHeight = 34.sp,
|
|
164
|
-
fontWeight = FontWeight.Bold
|
|
165
|
-
),
|
|
166
|
-
headerMBold: TextStyle = TextStyle(
|
|
167
|
-
fontSize = 18.sp,
|
|
168
|
-
lineHeight = 26.sp,
|
|
169
|
-
fontWeight = FontWeight.Bold
|
|
170
|
-
),
|
|
171
|
-
headerDefaultBold: TextStyle = TextStyle(
|
|
172
|
-
fontSize = 16.sp,
|
|
173
|
-
lineHeight = 22.sp,
|
|
174
|
-
fontWeight = FontWeight.Bold
|
|
175
|
-
),
|
|
176
|
-
headerSSemibold: TextStyle = TextStyle(
|
|
177
|
-
fontSize = 14.sp,
|
|
178
|
-
lineHeight = 20.sp,
|
|
179
|
-
fontWeight = FontWeight.SemiBold
|
|
180
|
-
),
|
|
181
|
-
headerXsSemibold: TextStyle = TextStyle(
|
|
182
|
-
fontSize = 12.sp,
|
|
183
|
-
lineHeight = 18.sp,
|
|
184
|
-
fontWeight = FontWeight.SemiBold
|
|
185
|
-
),
|
|
186
|
-
bodyDefaultRegular: TextStyle = TextStyle(
|
|
187
|
-
fontSize = 14.sp,
|
|
188
|
-
lineHeight = 20.sp,
|
|
189
|
-
fontWeight = FontWeight.Normal
|
|
190
|
-
),
|
|
191
|
-
bodyDefaultRegularStrikethrough: TextStyle = TextStyle(
|
|
192
|
-
fontSize = 14.sp,
|
|
193
|
-
lineHeight = 20.sp,
|
|
194
|
-
fontWeight = FontWeight.Normal,
|
|
195
|
-
textDecoration = TextDecoration.LineThrough
|
|
196
|
-
),
|
|
197
|
-
descriptionDefaultRegular: TextStyle = TextStyle(
|
|
198
|
-
fontSize = 12.sp,
|
|
199
|
-
lineHeight = 18.sp,
|
|
200
|
-
fontWeight = FontWeight.Normal
|
|
201
|
-
),
|
|
202
|
-
descriptionDefaultRegularStrikethrough: TextStyle = TextStyle(
|
|
203
|
-
fontSize = 12.sp,
|
|
204
|
-
lineHeight = 18.sp,
|
|
205
|
-
fontWeight = FontWeight.Normal,
|
|
206
|
-
textDecoration = TextDecoration.LineThrough
|
|
207
|
-
),
|
|
208
|
-
descriptionXsRegular: TextStyle = TextStyle(
|
|
209
|
-
fontSize = 10.sp,
|
|
210
|
-
lineHeight = 14.sp,
|
|
211
|
-
fontWeight = FontWeight.Normal
|
|
212
|
-
),
|
|
213
|
-
descriptionXsRegularStrikethrough: TextStyle = TextStyle(
|
|
214
|
-
fontSize = 10.sp,
|
|
215
|
-
lineHeight = 14.sp,
|
|
216
|
-
fontWeight = FontWeight.Normal,
|
|
217
|
-
textDecoration = TextDecoration.LineThrough
|
|
218
|
-
),
|
|
219
|
-
labelDefaultMedium: TextStyle = TextStyle(
|
|
220
|
-
fontSize = 14.sp,
|
|
221
|
-
lineHeight = 20.sp,
|
|
222
|
-
fontWeight = FontWeight.Medium
|
|
223
|
-
),
|
|
224
|
-
labelSMedium: TextStyle = TextStyle(
|
|
225
|
-
fontSize = 12.sp,
|
|
226
|
-
lineHeight = 18.sp,
|
|
227
|
-
fontWeight = FontWeight.Medium
|
|
228
|
-
),
|
|
229
|
-
labelXsMedium: TextStyle = TextStyle(
|
|
230
|
-
fontSize = 10.sp,
|
|
231
|
-
lineHeight = 14.sp,
|
|
232
|
-
fontWeight = FontWeight.Medium
|
|
233
|
-
),
|
|
234
|
-
actionDefaultBold: TextStyle = TextStyle(
|
|
235
|
-
fontSize = 16.sp,
|
|
236
|
-
lineHeight = 22.sp,
|
|
237
|
-
fontWeight = FontWeight.Bold
|
|
238
|
-
),
|
|
239
|
-
actionSBold: TextStyle = TextStyle(
|
|
240
|
-
fontSize = 14.sp,
|
|
241
|
-
lineHeight = 20.sp,
|
|
242
|
-
fontWeight = FontWeight.Bold
|
|
243
|
-
),
|
|
244
|
-
actionXsBold: TextStyle = TextStyle(
|
|
245
|
-
fontSize = 12.sp,
|
|
246
|
-
lineHeight = 18.sp,
|
|
247
|
-
fontWeight = FontWeight.Bold
|
|
248
|
-
),
|
|
249
|
-
actionXxsBold: TextStyle = TextStyle(
|
|
250
|
-
fontSize = 10.sp,
|
|
251
|
-
lineHeight = 14.sp,
|
|
252
|
-
fontWeight = FontWeight.Bold
|
|
253
|
-
),
|
|
254
|
-
) : this(
|
|
255
|
-
headlineDefaultBold = headlineDefaultBold,
|
|
256
|
-
headerMBold = headerMBold,
|
|
257
|
-
headerDefaultBold = headerDefaultBold,
|
|
258
|
-
headerSSemibold = headerSSemibold,
|
|
259
|
-
headerXsSemibold = headerXsSemibold,
|
|
260
|
-
bodyDefaultRegular = bodyDefaultRegular,
|
|
261
|
-
bodyDefaultRegularStrikethrough = bodyDefaultRegularStrikethrough,
|
|
262
|
-
descriptionDefaultRegular = descriptionDefaultRegular,
|
|
263
|
-
descriptionDefaultRegularStrikethrough = descriptionDefaultRegularStrikethrough,
|
|
264
|
-
descriptionXsRegular = descriptionXsRegular,
|
|
265
|
-
descriptionXsRegularStrikethrough = descriptionXsRegularStrikethrough,
|
|
266
|
-
labelDefaultMedium = labelDefaultMedium,
|
|
267
|
-
labelSMedium = labelSMedium,
|
|
268
|
-
labelXsMedium = labelXsMedium,
|
|
269
|
-
actionDefaultBold = actionDefaultBold,
|
|
270
|
-
actionSBold = actionSBold,
|
|
271
|
-
actionXsBold = actionXsBold,
|
|
272
|
-
actionXxsBold = actionXxsBold
|
|
273
|
-
)
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
val Typography = AppTypography()
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.layout
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.background
|
|
4
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
5
|
-
import androidx.compose.foundation.layout.Box
|
|
6
|
-
import androidx.compose.foundation.layout.BoxWithConstraints
|
|
7
|
-
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
|
8
|
-
import androidx.compose.foundation.layout.FlowRow
|
|
9
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
10
|
-
import androidx.compose.foundation.layout.padding
|
|
11
|
-
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
12
|
-
import androidx.compose.runtime.Composable
|
|
13
|
-
import androidx.compose.runtime.CompositionLocalProvider
|
|
14
|
-
import androidx.compose.ui.Modifier
|
|
15
|
-
import androidx.compose.ui.draw.clip
|
|
16
|
-
import androidx.compose.ui.draw.shadow
|
|
17
|
-
import androidx.compose.ui.unit.dp
|
|
18
|
-
import vn.momo.kits.components.Image
|
|
19
|
-
import vn.momo.kits.const.AppTheme
|
|
20
|
-
import vn.momo.kits.const.Radius
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* A white rounded surface card that lays its [Item]s on a 12-column grid
|
|
24
|
-
* (React kit foundations/Layout/Card). 8dp gutter, 12dp padding, 12dp
|
|
25
|
-
* horizontal margin, Radius.M corners, background = theme surface, optional
|
|
26
|
-
* shadow or [backgroundImage]. Items flow left-to-right and wrap.
|
|
27
|
-
*/
|
|
28
|
-
@OptIn(ExperimentalLayoutApi::class)
|
|
29
|
-
@Composable
|
|
30
|
-
fun Card(
|
|
31
|
-
useShadow: Boolean = false,
|
|
32
|
-
backgroundImage: String? = null,
|
|
33
|
-
modifier: Modifier = Modifier,
|
|
34
|
-
content: @Composable () -> Unit,
|
|
35
|
-
) {
|
|
36
|
-
val columns = 12
|
|
37
|
-
val gutter = 8.dp
|
|
38
|
-
val shape = RoundedCornerShape(Radius.M)
|
|
39
|
-
var surface = modifier.fillMaxWidth().padding(horizontal = 12.dp)
|
|
40
|
-
if (useShadow) surface = surface.shadow(4.dp, shape)
|
|
41
|
-
surface = surface.clip(shape)
|
|
42
|
-
// The React kit drops the surface colour when a backgroundImage is supplied
|
|
43
|
-
// (`!!backgroundImage && { backgroundColor: undefined }`).
|
|
44
|
-
if (backgroundImage == null) surface = surface.background(AppTheme.current.colors.background.surface)
|
|
45
|
-
Box(modifier = surface) {
|
|
46
|
-
// React renders this as an absolutely-filled child BEHIND the content
|
|
47
|
-
// (styles.imageBackground: position absolute, inset 0) — matchParentSize
|
|
48
|
-
// fills the card without contributing to its measured size.
|
|
49
|
-
if (backgroundImage != null) {
|
|
50
|
-
Image(source = backgroundImage, modifier = Modifier.matchParentSize())
|
|
51
|
-
}
|
|
52
|
-
BoxWithConstraints(modifier = Modifier.fillMaxWidth().padding(12.dp)) {
|
|
53
|
-
// `- 1.dp / columns` mirrors the React kit's `- 1 / numberOfColumns`
|
|
54
|
-
// nudge: it keeps a full 12-span Item ~1dp narrower than the content
|
|
55
|
-
// box so sub-pixel rounding can never overflow and wrap the FlowRow.
|
|
56
|
-
val sizePerSpan = (maxWidth - gutter * (columns - 1)) / columns - 1.dp / columns
|
|
57
|
-
CompositionLocalProvider(LocalGridContext provides GridContext(columns, gutter, sizePerSpan)) {
|
|
58
|
-
FlowRow(
|
|
59
|
-
horizontalArrangement = Arrangement.spacedBy(gutter),
|
|
60
|
-
verticalArrangement = Arrangement.spacedBy(gutter),
|
|
61
|
-
) { content() }
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.layout
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.layout.Box
|
|
4
|
-
import androidx.compose.foundation.layout.height
|
|
5
|
-
import androidx.compose.foundation.layout.width
|
|
6
|
-
import androidx.compose.runtime.Composable
|
|
7
|
-
import androidx.compose.runtime.compositionLocalOf
|
|
8
|
-
import androidx.compose.ui.Modifier
|
|
9
|
-
import androidx.compose.ui.unit.Dp
|
|
10
|
-
import androidx.compose.ui.unit.dp
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Grid context supplied by [Section] / [Card]: the per-span cell size + gutter,
|
|
14
|
-
* so an [Item] can resolve its pixel width from a 1-12 `widthSpan`. Mirrors the
|
|
15
|
-
* React kit's GridContext (foundations/Layout/GridSystem).
|
|
16
|
-
*/
|
|
17
|
-
data class GridContext(
|
|
18
|
-
val numberOfColumns: Int = 12,
|
|
19
|
-
val gutter: Dp = 12.dp,
|
|
20
|
-
val sizePerSpan: Dp = 0.dp,
|
|
21
|
-
) {
|
|
22
|
-
/** Width covering `span` columns + the (span-1) gutters between them. */
|
|
23
|
-
fun sizeForSpan(span: Int): Dp = sizePerSpan * span + gutter * (span - 1)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Provided by Section/Card; null when an Item is rendered outside a grid. */
|
|
27
|
-
val LocalGridContext = compositionLocalOf<GridContext?> { null }
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* A grid cell. `widthSpan` (1-12) sets the width as a fraction of the parent
|
|
31
|
-
* Section/Card; the parent's flex-wrap flows the cells into rows. Rendered
|
|
32
|
-
* outside a grid it just wraps its content at its natural size.
|
|
33
|
-
*/
|
|
34
|
-
@Composable
|
|
35
|
-
fun Item(
|
|
36
|
-
widthSpan: Int = 12,
|
|
37
|
-
heightSpan: Int = 0,
|
|
38
|
-
modifier: Modifier = Modifier,
|
|
39
|
-
content: @Composable () -> Unit,
|
|
40
|
-
) {
|
|
41
|
-
val grid = LocalGridContext.current
|
|
42
|
-
var m = modifier
|
|
43
|
-
if (grid != null) {
|
|
44
|
-
m = m.width(grid.sizeForSpan(widthSpan))
|
|
45
|
-
if (heightSpan > 0) m = m.height(grid.sizeForSpan(heightSpan))
|
|
46
|
-
}
|
|
47
|
-
Box(modifier = m) { content() }
|
|
48
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.layout
|
|
2
|
-
|
|
3
|
-
import androidx.compose.foundation.layout.Arrangement
|
|
4
|
-
import androidx.compose.foundation.layout.Box
|
|
5
|
-
import androidx.compose.foundation.layout.BoxWithConstraints
|
|
6
|
-
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
|
7
|
-
import androidx.compose.foundation.layout.FlowRow
|
|
8
|
-
import androidx.compose.foundation.layout.fillMaxWidth
|
|
9
|
-
import androidx.compose.foundation.layout.padding
|
|
10
|
-
import androidx.compose.runtime.Composable
|
|
11
|
-
import androidx.compose.runtime.CompositionLocalProvider
|
|
12
|
-
import androidx.compose.ui.Modifier
|
|
13
|
-
import androidx.compose.ui.unit.dp
|
|
14
|
-
import vn.momo.kits.components.Image
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* A transparent 12-column grid row that wraps its [Item]s (React kit
|
|
18
|
-
* foundations/Layout/Section). 12dp gutter; 12dp horizontal margin when
|
|
19
|
-
* `useMargin`; optional [backgroundImage]. Items flow left-to-right and wrap.
|
|
20
|
-
*/
|
|
21
|
-
@OptIn(ExperimentalLayoutApi::class)
|
|
22
|
-
@Composable
|
|
23
|
-
fun Section(
|
|
24
|
-
useMargin: Boolean = true,
|
|
25
|
-
backgroundImage: String? = null,
|
|
26
|
-
modifier: Modifier = Modifier,
|
|
27
|
-
content: @Composable () -> Unit,
|
|
28
|
-
) {
|
|
29
|
-
val columns = 12
|
|
30
|
-
val gutter = 12.dp
|
|
31
|
-
val margin = if (useMargin) 12.dp else 0.dp
|
|
32
|
-
Box(modifier = modifier.fillMaxWidth().padding(horizontal = margin)) {
|
|
33
|
-
// React renders this as an absolutely-filled child behind the content
|
|
34
|
-
// (styles.imageBackground: position absolute, inset 0).
|
|
35
|
-
if (backgroundImage != null) {
|
|
36
|
-
Image(source = backgroundImage, modifier = Modifier.matchParentSize())
|
|
37
|
-
}
|
|
38
|
-
BoxWithConstraints(modifier = Modifier.fillMaxWidth()) {
|
|
39
|
-
// `- 1.dp / columns` mirrors the React kit's `- 1 / numberOfColumns`
|
|
40
|
-
// nudge — keeps a full 12-span Item ~1dp inside the content box so
|
|
41
|
-
// sub-pixel rounding can never overflow and wrap the FlowRow.
|
|
42
|
-
val sizePerSpan = (maxWidth - gutter * (columns - 1)) / columns - 1.dp / columns
|
|
43
|
-
CompositionLocalProvider(LocalGridContext provides GridContext(columns, gutter, sizePerSpan)) {
|
|
44
|
-
FlowRow(
|
|
45
|
-
horizontalArrangement = Arrangement.spacedBy(gutter),
|
|
46
|
-
verticalArrangement = Arrangement.spacedBy(gutter),
|
|
47
|
-
) { content() }
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
package vn.momo.kits.modifier
|
|
2
|
-
|
|
3
|
-
import androidx.compose.ui.Modifier
|
|
4
|
-
import androidx.compose.ui.node.ModifierNodeElement
|
|
5
|
-
import androidx.compose.ui.node.SemanticsModifierNode
|
|
6
|
-
import androidx.compose.ui.semantics.SemanticsPropertyReceiver
|
|
7
|
-
import androidx.compose.ui.semantics.contentDescription
|
|
8
|
-
import androidx.compose.ui.semantics.semantics
|
|
9
|
-
import androidx.compose.ui.semantics.testTag
|
|
10
|
-
import vn.momo.kits.platform.getPlatformName
|
|
11
|
-
|
|
12
|
-
fun Modifier.setAutomationId(accessibilityId: String, mergeDescendants: Boolean = false): Modifier {
|
|
13
|
-
return if (getPlatformName() == "Android") {
|
|
14
|
-
semantics {
|
|
15
|
-
contentDescription = accessibilityId
|
|
16
|
-
}
|
|
17
|
-
} else {
|
|
18
|
-
semantics(mergeDescendants = mergeDescendants) {
|
|
19
|
-
testTag = accessibilityId
|
|
20
|
-
}
|
|
21
|
-
}}
|
|
22
|
-
|
|
23
|
-
fun Modifier.kitsAutomationId(accessibilityId: String, label: String? = null) =
|
|
24
|
-
this then KitsAutomationIdElement(accessibilityId, label)
|
|
25
|
-
|
|
26
|
-
private data class KitsAutomationIdElement(
|
|
27
|
-
private val accessibilityId: String,
|
|
28
|
-
private val label: String? = null,
|
|
29
|
-
) : ModifierNodeElement<KitsAutomationIdNode>() {
|
|
30
|
-
override fun create(): KitsAutomationIdNode {
|
|
31
|
-
return KitsAutomationIdNode(accessibilityId, label)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
override fun update(node: KitsAutomationIdNode) {
|
|
35
|
-
node.accessibilityId = accessibilityId
|
|
36
|
-
node.label = label
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private class KitsAutomationIdNode(
|
|
41
|
-
var accessibilityId: String,
|
|
42
|
-
var label: String?,
|
|
43
|
-
) : Modifier.Node(), SemanticsModifierNode {
|
|
44
|
-
override fun SemanticsPropertyReceiver.applySemantics() {
|
|
45
|
-
if (getPlatformName() == "Android") {
|
|
46
|
-
contentDescription = accessibilityId
|
|
47
|
-
} else {
|
|
48
|
-
testTag = accessibilityId
|
|
49
|
-
contentDescription = label ?: accessibilityId
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
@@ -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,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
|
-
}
|