@momo-kits/native-kits 0.162.3-fontscale.3 → 0.162.3-fontscale.4-debug

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 (143) hide show
  1. package/build.gradle.kts +11 -0
  2. package/compose/build.gradle.kts +190 -0
  3. package/compose/build.gradle.kts.backup +190 -0
  4. package/compose/compose.podspec +47 -0
  5. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +7 -0
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +123 -0
  8. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  9. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  10. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  11. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  12. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  13. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  14. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  15. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  16. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  17. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  18. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  19. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  20. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  21. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +52 -0
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +106 -0
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +183 -0
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +207 -0
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +39 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +294 -0
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +826 -0
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +110 -0
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +378 -0
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +82 -0
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +338 -0
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +175 -0
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +358 -0
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +113 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +89 -0
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +128 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +209 -0
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +543 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +140 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +231 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +112 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +477 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +114 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +214 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +240 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +216 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +259 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +182 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +343 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +84 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +328 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +97 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +310 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +59 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +21 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +90 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +323 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +217 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +473 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +122 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +199 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +91 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +470 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +88 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +131 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +203 -0
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +498 -0
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +175 -0
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +182 -0
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +193 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +234 -0
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +188 -0
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +306 -0
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +22 -0
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +276 -0
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +35 -0
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +52 -0
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +66 -0
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +104 -0
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +48 -0
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +253 -0
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +129 -0
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +94 -0
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +157 -0
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +360 -0
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +557 -0
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +164 -0
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +225 -0
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +169 -0
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +320 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +81 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +309 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +34 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +360 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +132 -0
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +128 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +70 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +9 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +58 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +55 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +105 -0
  130. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +32 -0
  131. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +66 -0
  132. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +184 -0
  133. package/gradle/libs.versions.toml +69 -0
  134. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  135. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  136. package/gradle.properties +26 -0
  137. package/gradlew +252 -0
  138. package/gradlew.bat +94 -0
  139. package/ios/Typography/FontScaleStore.swift +8 -9
  140. package/ios/Typography/Text.swift +0 -1
  141. package/local.properties +8 -0
  142. package/package.json +1 -1
  143. package/settings.gradle.kts +64 -0
@@ -0,0 +1,276 @@
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()
@@ -0,0 +1,2 @@
1
+ package vn.momo.kits.layout
2
+
@@ -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,2 @@
1
+ package vn.momo.kits.layout
2
+
@@ -0,0 +1,52 @@
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
+ }
@@ -0,0 +1,66 @@
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
+ }
@@ -0,0 +1,11 @@
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
+ }
@@ -0,0 +1,104 @@
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
+ }
@@ -0,0 +1,48 @@
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
+ )
@@ -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
+ }