@momo-kits/native-kits 0.152.4-beta.2 → 0.152.4-beta.3
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/CODE_OF_CONDUCT.md +133 -0
- package/CONTRIBUTING.md +114 -0
- package/LICENSE +20 -0
- package/README.md +7 -0
- package/build.gradle.kts +32 -0
- package/compose/MoMoComposeKits.podspec +54 -0
- package/compose/build.gradle.kts +149 -0
- package/compose/src/androidMain/AndroidManifest.xml +2 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +105 -0
- package/compose/src/commonMain/composeResources/files/lottie_circle_loader.json +1 -0
- 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 +57 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +201 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +222 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +48 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +306 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +715 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +214 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +236 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +77 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +27 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +334 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +345 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +90 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +131 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +543 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +69 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +143 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +179 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +111 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +384 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +160 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +234 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +223 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +232 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +236 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +228 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +364 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +50 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +34 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +85 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +33 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +338 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +95 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +64 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +89 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +91 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +84 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +208 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +172 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +199 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +237 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +191 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +306 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +13 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +191 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +258 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +35 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +59 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +68 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +49 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +232 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +111 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +94 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +159 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +232 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScaleSizeScope.kt +17 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +459 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +169 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +216 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +180 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +251 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +80 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +306 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +31 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +385 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +38 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +62 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +88 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +144 -0
- package/gradle.properties +19 -0
- package/gradlew +240 -0
- package/gradlew.bat +91 -0
- package/ios/Application/ApplicationEnvironment.swift +50 -0
- package/ios/Application/Components.swift +263 -0
- package/ios/Application/ComposeApi.swift +22 -0
- package/ios/Application/FloatingButton.swift +172 -0
- package/ios/Application/HeaderRight.swift +271 -0
- package/ios/Application/Screen.swift +249 -0
- package/ios/Badge/BadgeDot.swift +31 -0
- package/ios/Button/Button.swift +211 -0
- package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +126 -0
- package/ios/Checkbox/Checkbox.swift +81 -0
- package/ios/Chip/Chip.swift +96 -0
- package/ios/Colors+Radius+Spacing/Colors.swift +172 -0
- package/ios/Colors+Radius+Spacing/Radius.swift +22 -0
- package/ios/Colors+Radius+Spacing/Spacing.swift +12 -0
- package/ios/Extensions/Color++.swift +25 -0
- package/ios/Icon/Icon.swift +51 -0
- package/ios/Image/Image.swift +70 -0
- package/ios/Input/Input.swift +207 -0
- package/ios/Input/InputPhoneNumber.swift +176 -0
- package/ios/Input/InputSearch.swift +238 -0
- package/ios/Input/InputTextArea.swift +242 -0
- package/ios/Lottie/LottieView.swift +86 -0
- package/ios/OTPKeyboard/KeyboardButton.swift +41 -0
- package/ios/OTPKeyboard/OTPKeyboard.swift +145 -0
- package/ios/Popup/PopupDisplay.swift +284 -0
- package/ios/Popup/PopupInput.swift +96 -0
- package/ios/Popup/PopupPromotion.swift +73 -0
- package/ios/PopupView/FullscreenPopup.swift +251 -0
- package/ios/PopupView/Modifiers.swift +158 -0
- package/ios/PopupView/PopupView.swift +289 -0
- package/ios/PopupView/Utils++.swift +281 -0
- package/ios/ScrollIndicator/ScrollIndicator.swift +110 -0
- package/ios/Swipeable/SwipeCell.swift +278 -0
- package/ios/Swipeable/SwipeCellModel.swift +86 -0
- package/ios/Switch/Switch.swift +44 -0
- package/ios/Template/Logo/Logo.swift +75 -0
- package/ios/Template/TrustBanner/TrustBanner.swift +120 -0
- package/ios/Theme.md +18 -0
- package/ios/Typography/Text.swift +140 -0
- package/ios/Typography/Typography.swift +95 -0
- package/ios/native-kits.podspec +18 -0
- package/package.json +6 -7
- package/settings.gradle.kts +25 -0
- package/shared/build.gradle.kts +0 -74
|
@@ -0,0 +1,258 @@
|
|
|
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.Dp
|
|
11
|
+
import androidx.compose.ui.unit.sp
|
|
12
|
+
import org.jetbrains.compose.resources.Font
|
|
13
|
+
import org.jetbrains.compose.resources.FontResource
|
|
14
|
+
import org.jetbrains.compose.resources.InternalResourceApi
|
|
15
|
+
import vn.momo.kits.platform.getScreenDimensions
|
|
16
|
+
import kotlin.math.max
|
|
17
|
+
import kotlin.math.min
|
|
18
|
+
import vn.momo.uikits.resources.Res
|
|
19
|
+
import vn.momo.uikits.resources.momosignature
|
|
20
|
+
import vn.momo.uikits.resources.momotrustdisplay
|
|
21
|
+
import vn.momo.uikits.resources.sfprotext_black
|
|
22
|
+
import vn.momo.uikits.resources.sfprotext_bold
|
|
23
|
+
import vn.momo.uikits.resources.sfprotext_heavy
|
|
24
|
+
import vn.momo.uikits.resources.sfprotext_light
|
|
25
|
+
import vn.momo.uikits.resources.sfprotext_medium
|
|
26
|
+
import vn.momo.uikits.resources.sfprotext_regular
|
|
27
|
+
import vn.momo.uikits.resources.sfprotext_semibold
|
|
28
|
+
import vn.momo.uikits.resources.sfprotext_thin
|
|
29
|
+
import vn.momo.uikits.resources.sfprotext_ultralight
|
|
30
|
+
|
|
31
|
+
const val DEFAULT_SCREEN_SIZE = 375f
|
|
32
|
+
const val MAX_FONT_SCALE = 1.5f
|
|
33
|
+
const val MAX_DEVICE_SCALE = 5
|
|
34
|
+
|
|
35
|
+
@Composable
|
|
36
|
+
fun scaleSize(size: Float): Float {
|
|
37
|
+
val scaleSizeMaxRate: Float = ScaleSizeMaxRate.current ?: MAX_FONT_SCALE
|
|
38
|
+
val deviceWidth = getScreenDimensions().width
|
|
39
|
+
val deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE
|
|
40
|
+
|
|
41
|
+
val density = LocalDensity.current
|
|
42
|
+
val fontScale = density.fontScale
|
|
43
|
+
|
|
44
|
+
val defaultFontSize = size / fontScale //To ignore OS scale
|
|
45
|
+
var fontSizeScaleDevice = defaultFontSize
|
|
46
|
+
var fontSizeScaleOS = defaultFontSize
|
|
47
|
+
|
|
48
|
+
if (deviceScale > 1) {
|
|
49
|
+
fontSizeScaleDevice =
|
|
50
|
+
min(deviceScale * fontSizeScaleDevice, fontSizeScaleDevice + MAX_DEVICE_SCALE)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (fontScale > 1) {
|
|
54
|
+
fontSizeScaleOS = min(fontScale * fontSizeScaleOS, fontSizeScaleOS * scaleSizeMaxRate)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return max(
|
|
58
|
+
fontSizeScaleDevice,
|
|
59
|
+
fontSizeScaleOS
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@Composable
|
|
64
|
+
fun scaleSize(size: Dp): Dp {
|
|
65
|
+
val density = LocalDensity.current
|
|
66
|
+
val px = with(density) { size.toPx() }
|
|
67
|
+
val scaledPx = scaleSize(px)
|
|
68
|
+
return with(density) { scaledPx.toDp() }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@OptIn(InternalResourceApi::class)
|
|
73
|
+
@Composable
|
|
74
|
+
fun getFont(font: FontResource): FontFamily {
|
|
75
|
+
return FontFamily(Font(font))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@Composable
|
|
79
|
+
fun getFontFamily(fontFamily: String, fontWeight: FontWeight? = FontWeight.Normal): FontFamily {
|
|
80
|
+
val key = "$fontFamily-${fontWeight?.weight}"
|
|
81
|
+
val fontMap = mapOf(
|
|
82
|
+
"SFProText-100" to Res.font.sfprotext_thin,
|
|
83
|
+
"SFProText-200" to Res.font.sfprotext_ultralight,
|
|
84
|
+
"SFProText-300" to Res.font.sfprotext_light,
|
|
85
|
+
"SFProText-400" to Res.font.sfprotext_regular,
|
|
86
|
+
"SFProText-500" to Res.font.sfprotext_medium,
|
|
87
|
+
"SFProText-600" to Res.font.sfprotext_semibold,
|
|
88
|
+
"SFProText-700" to Res.font.sfprotext_bold,
|
|
89
|
+
"SFProText-800" to Res.font.sfprotext_heavy,
|
|
90
|
+
"SFProText-900" to Res.font.sfprotext_black,
|
|
91
|
+
|
|
92
|
+
"MoMoSignature-100" to Res.font.momosignature,
|
|
93
|
+
"MoMoSignature-200" to Res.font.momosignature,
|
|
94
|
+
"MoMoSignature-300" to Res.font.momosignature,
|
|
95
|
+
"MoMoSignature-400" to Res.font.momosignature,
|
|
96
|
+
"MoMoSignature-500" to Res.font.momosignature,
|
|
97
|
+
"MoMoSignature-600" to Res.font.momosignature,
|
|
98
|
+
"MoMoSignature-700" to Res.font.momosignature,
|
|
99
|
+
"MoMoSignature-800" to Res.font.momosignature,
|
|
100
|
+
"MoMoSignature-900" to Res.font.momosignature,
|
|
101
|
+
|
|
102
|
+
"MoMoTrustDisplay-100" to Res.font.momotrustdisplay,
|
|
103
|
+
"MoMoTrustDisplay-200" to Res.font.momotrustdisplay,
|
|
104
|
+
"MoMoTrustDisplay-300" to Res.font.momotrustdisplay,
|
|
105
|
+
"MoMoTrustDisplay-400" to Res.font.momotrustdisplay,
|
|
106
|
+
"MoMoTrustDisplay-500" to Res.font.momotrustdisplay,
|
|
107
|
+
"MoMoTrustDisplay-600" to Res.font.momotrustdisplay,
|
|
108
|
+
"MoMoTrustDisplay-700" to Res.font.momotrustdisplay,
|
|
109
|
+
"MoMoTrustDisplay-800" to Res.font.momotrustdisplay,
|
|
110
|
+
"MoMoTrustDisplay-900" to Res.font.momotrustdisplay,
|
|
111
|
+
)
|
|
112
|
+
val font = fontMap[key] ?: Res.font.sfprotext_regular
|
|
113
|
+
return getFont(font)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
@Immutable
|
|
117
|
+
class AppTypography internal constructor(
|
|
118
|
+
val headlineDefaultBold: TextStyle,
|
|
119
|
+
val headerMBold: TextStyle,
|
|
120
|
+
val headerDefaultBold: TextStyle,
|
|
121
|
+
val headerSSemibold: TextStyle,
|
|
122
|
+
val headerXsSemibold: TextStyle,
|
|
123
|
+
val bodyDefaultRegular: TextStyle,
|
|
124
|
+
val bodyDefaultRegularStrikethrough: TextStyle,
|
|
125
|
+
val descriptionDefaultRegular: TextStyle,
|
|
126
|
+
val descriptionDefaultRegularStrikethrough: TextStyle,
|
|
127
|
+
val descriptionXsRegular: TextStyle,
|
|
128
|
+
val descriptionXsRegularStrikethrough: TextStyle,
|
|
129
|
+
val labelDefaultMedium: TextStyle,
|
|
130
|
+
val labelSMedium: TextStyle,
|
|
131
|
+
val labelXsMedium: TextStyle,
|
|
132
|
+
val actionDefaultBold: TextStyle,
|
|
133
|
+
val actionSBold: TextStyle,
|
|
134
|
+
val actionXsBold: TextStyle,
|
|
135
|
+
val actionXxsBold: TextStyle,
|
|
136
|
+
) {
|
|
137
|
+
constructor(
|
|
138
|
+
default: TextStyle = TextStyle(
|
|
139
|
+
fontSize = 14.sp,
|
|
140
|
+
lineHeight = 20.sp,
|
|
141
|
+
fontWeight = FontWeight.Normal
|
|
142
|
+
),
|
|
143
|
+
headlineDefaultBold: TextStyle = TextStyle(
|
|
144
|
+
fontSize = 24.sp,
|
|
145
|
+
lineHeight = 34.sp,
|
|
146
|
+
fontWeight = FontWeight.Bold
|
|
147
|
+
),
|
|
148
|
+
headerMBold: TextStyle = TextStyle(
|
|
149
|
+
fontSize = 18.sp,
|
|
150
|
+
lineHeight = 26.sp,
|
|
151
|
+
fontWeight = FontWeight.Bold
|
|
152
|
+
),
|
|
153
|
+
headerDefaultBold: TextStyle = TextStyle(
|
|
154
|
+
fontSize = 16.sp,
|
|
155
|
+
lineHeight = 22.sp,
|
|
156
|
+
fontWeight = FontWeight.Bold
|
|
157
|
+
),
|
|
158
|
+
headerSSemibold: TextStyle = TextStyle(
|
|
159
|
+
fontSize = 14.sp,
|
|
160
|
+
lineHeight = 20.sp,
|
|
161
|
+
fontWeight = FontWeight.SemiBold
|
|
162
|
+
),
|
|
163
|
+
headerXsSemibold: TextStyle = TextStyle(
|
|
164
|
+
fontSize = 12.sp,
|
|
165
|
+
lineHeight = 18.sp,
|
|
166
|
+
fontWeight = FontWeight.SemiBold
|
|
167
|
+
),
|
|
168
|
+
bodyDefaultRegular: TextStyle = TextStyle(
|
|
169
|
+
fontSize = 14.sp,
|
|
170
|
+
lineHeight = 20.sp,
|
|
171
|
+
fontWeight = FontWeight.Normal
|
|
172
|
+
),
|
|
173
|
+
bodyDefaultRegularStrikethrough: TextStyle = TextStyle(
|
|
174
|
+
fontSize = 14.sp,
|
|
175
|
+
lineHeight = 20.sp,
|
|
176
|
+
fontWeight = FontWeight.Normal,
|
|
177
|
+
textDecoration = TextDecoration.LineThrough
|
|
178
|
+
),
|
|
179
|
+
descriptionDefaultRegular: TextStyle = TextStyle(
|
|
180
|
+
fontSize = 12.sp,
|
|
181
|
+
lineHeight = 18.sp,
|
|
182
|
+
fontWeight = FontWeight.Normal
|
|
183
|
+
),
|
|
184
|
+
descriptionDefaultRegularStrikethrough: TextStyle = TextStyle(
|
|
185
|
+
fontSize = 12.sp,
|
|
186
|
+
lineHeight = 18.sp,
|
|
187
|
+
fontWeight = FontWeight.Normal,
|
|
188
|
+
textDecoration = TextDecoration.LineThrough
|
|
189
|
+
),
|
|
190
|
+
descriptionXsRegular: TextStyle = TextStyle(
|
|
191
|
+
fontSize = 10.sp,
|
|
192
|
+
lineHeight = 14.sp,
|
|
193
|
+
fontWeight = FontWeight.Normal
|
|
194
|
+
),
|
|
195
|
+
descriptionXsRegularStrikethrough: TextStyle = TextStyle(
|
|
196
|
+
fontSize = 10.sp,
|
|
197
|
+
lineHeight = 14.sp,
|
|
198
|
+
fontWeight = FontWeight.Normal,
|
|
199
|
+
textDecoration = TextDecoration.LineThrough
|
|
200
|
+
),
|
|
201
|
+
labelDefaultMedium: TextStyle = TextStyle(
|
|
202
|
+
fontSize = 14.sp,
|
|
203
|
+
lineHeight = 20.sp,
|
|
204
|
+
fontWeight = FontWeight.Medium
|
|
205
|
+
),
|
|
206
|
+
labelSMedium: TextStyle = TextStyle(
|
|
207
|
+
fontSize = 12.sp,
|
|
208
|
+
lineHeight = 18.sp,
|
|
209
|
+
fontWeight = FontWeight.Medium
|
|
210
|
+
),
|
|
211
|
+
labelXsMedium: TextStyle = TextStyle(
|
|
212
|
+
fontSize = 10.sp,
|
|
213
|
+
lineHeight = 14.sp,
|
|
214
|
+
fontWeight = FontWeight.Medium
|
|
215
|
+
),
|
|
216
|
+
actionDefaultBold: TextStyle = TextStyle(
|
|
217
|
+
fontSize = 16.sp,
|
|
218
|
+
lineHeight = 22.sp,
|
|
219
|
+
fontWeight = FontWeight.Bold
|
|
220
|
+
),
|
|
221
|
+
actionSBold: TextStyle = TextStyle(
|
|
222
|
+
fontSize = 14.sp,
|
|
223
|
+
lineHeight = 20.sp,
|
|
224
|
+
fontWeight = FontWeight.Bold
|
|
225
|
+
),
|
|
226
|
+
actionXsBold: TextStyle = TextStyle(
|
|
227
|
+
fontSize = 12.sp,
|
|
228
|
+
lineHeight = 18.sp,
|
|
229
|
+
fontWeight = FontWeight.Bold
|
|
230
|
+
),
|
|
231
|
+
actionXxsBold: TextStyle = TextStyle(
|
|
232
|
+
fontSize = 10.sp,
|
|
233
|
+
lineHeight = 14.sp,
|
|
234
|
+
fontWeight = FontWeight.Bold
|
|
235
|
+
),
|
|
236
|
+
) : this(
|
|
237
|
+
headlineDefaultBold = headlineDefaultBold,
|
|
238
|
+
headerMBold = headerMBold,
|
|
239
|
+
headerDefaultBold = headerDefaultBold,
|
|
240
|
+
headerSSemibold = headerSSemibold,
|
|
241
|
+
headerXsSemibold = headerXsSemibold,
|
|
242
|
+
bodyDefaultRegular = bodyDefaultRegular,
|
|
243
|
+
bodyDefaultRegularStrikethrough = bodyDefaultRegularStrikethrough,
|
|
244
|
+
descriptionDefaultRegular = descriptionDefaultRegular,
|
|
245
|
+
descriptionDefaultRegularStrikethrough = descriptionDefaultRegularStrikethrough,
|
|
246
|
+
descriptionXsRegular = descriptionXsRegular,
|
|
247
|
+
descriptionXsRegularStrikethrough = descriptionXsRegularStrikethrough,
|
|
248
|
+
labelDefaultMedium = labelDefaultMedium,
|
|
249
|
+
labelSMedium = labelSMedium,
|
|
250
|
+
labelXsMedium = labelXsMedium,
|
|
251
|
+
actionDefaultBold = actionDefaultBold,
|
|
252
|
+
actionSBold = actionSBold,
|
|
253
|
+
actionXsBold = actionXsBold,
|
|
254
|
+
actionXxsBold = actionXxsBold
|
|
255
|
+
)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
val Typography = AppTypography()
|
|
@@ -0,0 +1,35 @@
|
|
|
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.ui.Modifier
|
|
8
|
+
import androidx.compose.ui.unit.Dp
|
|
9
|
+
|
|
10
|
+
data class GridContext(
|
|
11
|
+
val numberOfColumns: Number,
|
|
12
|
+
val gutterSize: Number,
|
|
13
|
+
val sizePerSpan: Number,
|
|
14
|
+
val getSizeSpan: (Number) -> Number
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
@Composable
|
|
18
|
+
fun Item(
|
|
19
|
+
heightSpan: Number = 1,
|
|
20
|
+
widthSpan: Number = 1,
|
|
21
|
+
content: @Composable() () -> Unit,
|
|
22
|
+
modifier: Modifier = Modifier,
|
|
23
|
+
grid: GridContext
|
|
24
|
+
) {
|
|
25
|
+
|
|
26
|
+
val widthItem = grid.getSizeSpan(widthSpan)
|
|
27
|
+
val heightItem = grid.getSizeSpan(heightSpan)
|
|
28
|
+
|
|
29
|
+
Box(
|
|
30
|
+
modifier = modifier.width(width = Dp(widthItem.toFloat()))
|
|
31
|
+
.height(height = Dp(heightItem.toFloat()))
|
|
32
|
+
) {
|
|
33
|
+
content()
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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, label: String? = null): Modifier {
|
|
13
|
+
return if (getPlatformName() == "Android") {
|
|
14
|
+
semantics {
|
|
15
|
+
contentDescription = accessibilityId
|
|
16
|
+
}
|
|
17
|
+
} else {
|
|
18
|
+
semantics {
|
|
19
|
+
testTag = accessibilityId
|
|
20
|
+
contentDescription = label ?: accessibilityId
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Alternative for [setAutomationId]
|
|
27
|
+
*
|
|
28
|
+
* reason: [link](https://developer.android.com/develop/ui/compose/custom-modifiers#composable_function_modifiers_are_never_skipped)
|
|
29
|
+
* */
|
|
30
|
+
fun Modifier.kitsAutomationId(accessibilityId: String, label: String? = null) =
|
|
31
|
+
this then KitsAutomationIdElement(accessibilityId, label)
|
|
32
|
+
|
|
33
|
+
private data class KitsAutomationIdElement(
|
|
34
|
+
private val accessibilityId: String,
|
|
35
|
+
private val label: String? = null,
|
|
36
|
+
) : ModifierNodeElement<KitsAutomationIdNode>() {
|
|
37
|
+
override fun create(): KitsAutomationIdNode {
|
|
38
|
+
return KitsAutomationIdNode(accessibilityId, label)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
override fun update(node: KitsAutomationIdNode) {
|
|
42
|
+
node.accessibilityId = accessibilityId
|
|
43
|
+
node.label = label
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private class KitsAutomationIdNode(
|
|
48
|
+
var accessibilityId: String,
|
|
49
|
+
var label: String?,
|
|
50
|
+
) : Modifier.Node(), SemanticsModifierNode {
|
|
51
|
+
override fun SemanticsPropertyReceiver.applySemantics() {
|
|
52
|
+
if (getPlatformName() == "Android") {
|
|
53
|
+
contentDescription = accessibilityId
|
|
54
|
+
} else {
|
|
55
|
+
testTag = accessibilityId
|
|
56
|
+
contentDescription = label ?: accessibilityId
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
|
|
57
|
+
|
|
58
|
+
fun Modifier.hideKeyboardOnTap() = composed {
|
|
59
|
+
val focusManager = LocalFocusManager.current
|
|
60
|
+
val keyboardManager = LocalSoftwareKeyboardController.current
|
|
61
|
+
|
|
62
|
+
pointerInput(Unit) {
|
|
63
|
+
detectTapGestures {
|
|
64
|
+
keyboardManager?.hide()
|
|
65
|
+
focusManager.clearFocus()
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
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.graphics.toArgb
|
|
9
|
+
import androidx.compose.ui.unit.Dp
|
|
10
|
+
import androidx.compose.ui.unit.dp
|
|
11
|
+
import vn.momo.kits.platform.setMaskFilter
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
fun Modifier.shadow(
|
|
15
|
+
color: Color = Color.Black,
|
|
16
|
+
borderRadius: Dp = 0.dp,
|
|
17
|
+
blurRadius: Float = 0f,
|
|
18
|
+
offsetY: Dp = 0.dp,
|
|
19
|
+
offsetX: Dp = 0.dp,
|
|
20
|
+
spread: Dp = 0f.dp,
|
|
21
|
+
modifier: Modifier = Modifier
|
|
22
|
+
) = this.then(
|
|
23
|
+
modifier.drawBehind {
|
|
24
|
+
this.drawIntoCanvas {
|
|
25
|
+
val paint = Paint()
|
|
26
|
+
val frameworkPaint = paint.asFrameworkPaint()
|
|
27
|
+
val spreadPixel = spread.toPx()
|
|
28
|
+
val leftPixel = (0f - spreadPixel) + offsetX.toPx()
|
|
29
|
+
val topPixel = (0f - spreadPixel) + offsetY.toPx()
|
|
30
|
+
val rightPixel = (this.size.width + spreadPixel)
|
|
31
|
+
val bottomPixel = (0f + spreadPixel) - offsetY.toPx()
|
|
32
|
+
|
|
33
|
+
if (blurRadius != 0f) {
|
|
34
|
+
frameworkPaint.setMaskFilter(blurRadius)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
frameworkPaint.color = color.toArgb()
|
|
38
|
+
it.drawRoundRect(
|
|
39
|
+
left = leftPixel,
|
|
40
|
+
top = topPixel,
|
|
41
|
+
right = rightPixel,
|
|
42
|
+
bottom = bottomPixel,
|
|
43
|
+
radiusX = borderRadius.toPx(),
|
|
44
|
+
radiusY = borderRadius.toPx(),
|
|
45
|
+
paint
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
)
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
}
|