@momo-kits/native-kits 0.165.2-beta.2-debug → 0.167.1-beta.10-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.
- package/compose/build.gradle.kts +1 -1
- package/compose/compose.podspec +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +6 -28
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +13 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +22 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +11 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +33 -47
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +32 -6
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +3 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +2 -3
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +2 -1
- package/gradle.properties +1 -1
- package/ios/native-kits.podspec +1 -1
- package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
- package/package.json +1 -1
- package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +0 -32
- package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +0 -16
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -5
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -60
- package/local.properties +0 -8
package/compose/build.gradle.kts
CHANGED
package/compose/compose.podspec
CHANGED
|
@@ -38,13 +38,13 @@ import vn.momo.kits.components.Icon
|
|
|
38
38
|
import vn.momo.kits.components.Text
|
|
39
39
|
import vn.momo.kits.const.AppTheme
|
|
40
40
|
import vn.momo.kits.const.Colors
|
|
41
|
+
import vn.momo.kits.const.KitDesignSystem
|
|
41
42
|
import vn.momo.kits.const.Spacing
|
|
42
43
|
import vn.momo.kits.const.Typography
|
|
43
44
|
import vn.momo.kits.const.getFontFamily
|
|
44
45
|
import vn.momo.kits.modifier.kitsAutomationId
|
|
45
46
|
import vn.momo.kits.modifier.noFeedbackClickable
|
|
46
47
|
import vn.momo.kits.modifier.setAutomationId
|
|
47
|
-
import vn.momo.kits.navigation.component.HEADER_FONT_FAMILY
|
|
48
48
|
import vn.momo.kits.navigation.component.HEADER_HEIGHT
|
|
49
49
|
import vn.momo.kits.utils.getAppStatusBarHeight
|
|
50
50
|
import kotlin.math.max
|
|
@@ -362,7 +362,7 @@ private fun LiteScreenLayout(
|
|
|
362
362
|
text = title,
|
|
363
363
|
color = headerColor.tintIconColor,
|
|
364
364
|
style = titleStyle,
|
|
365
|
-
fontFamily =
|
|
365
|
+
fontFamily = if (KitDesignSystem.isWhiteList) "MoMoTrustDisplay" else "SFProText",
|
|
366
366
|
modifier = titleModifier,
|
|
367
367
|
maxLines = 1,
|
|
368
368
|
overflow = TextOverflow.Ellipsis
|
|
@@ -18,7 +18,7 @@ import vn.momo.kits.const.Spacing
|
|
|
18
18
|
enum class DividerType { DEFAULT, DASH }
|
|
19
19
|
|
|
20
20
|
@Composable
|
|
21
|
-
fun Divider(useMargin: Boolean =
|
|
21
|
+
fun Divider(useMargin: Boolean = false, type: DividerType = DividerType.DEFAULT) {
|
|
22
22
|
val color = AppTheme.current.colors.border.default
|
|
23
23
|
val margin = if (useMargin) Spacing.XS else 0.dp
|
|
24
24
|
if (type == DividerType.DASH) {
|
|
@@ -266,7 +266,7 @@ fun Input(
|
|
|
266
266
|
)
|
|
267
267
|
}
|
|
268
268
|
|
|
269
|
-
val passwordFontFamily = getFontFamily(
|
|
269
|
+
val passwordFontFamily = getFontFamily("SFProText", FontWeight.Normal)
|
|
270
270
|
val passwordFontSize = scaleSize(24.sp)
|
|
271
271
|
val visualTransformation = remember(secureTextEntry, inputState.passHidden, passwordFontFamily) {
|
|
272
272
|
if (secureTextEntry && !inputState.passHidden)
|
|
@@ -117,7 +117,7 @@ val defaultTheme = Theme(
|
|
|
117
117
|
container = Colors.blue_08
|
|
118
118
|
)
|
|
119
119
|
),
|
|
120
|
-
font = "
|
|
120
|
+
font = "SFProText",
|
|
121
121
|
assets = ThemeAssets(
|
|
122
122
|
headerBackground = null
|
|
123
123
|
)
|
|
@@ -174,7 +174,7 @@ val darkTheme = Theme(
|
|
|
174
174
|
container = Colors.blue_08
|
|
175
175
|
)
|
|
176
176
|
),
|
|
177
|
-
font = "
|
|
177
|
+
font = "SFProText",
|
|
178
178
|
assets = ThemeAssets(
|
|
179
179
|
headerBackground = null
|
|
180
180
|
)
|
|
@@ -89,14 +89,13 @@ fun scaleSize(textStyle: TextStyle): TextStyle {
|
|
|
89
89
|
* SDK không đóng gói font riêng nữa: app host đã bundle sẵn toàn bộ font từ `font-source`
|
|
90
90
|
* cho cả React Native lẫn native, nên bản copy trong `composeResources` chỉ làm phình app.
|
|
91
91
|
*/
|
|
92
|
-
private const val
|
|
93
|
-
private const val NEW_DEFAULT_FONT_FILE = "MomoTrustSans-Regular.ttf"
|
|
92
|
+
private const val DEFAULT_FONT_FILE = "SFProText-Regular.ttf"
|
|
94
93
|
|
|
95
94
|
private val hostFontFiles: Map<String, String> = mapOf(
|
|
96
95
|
"SFProText-100" to "SFProText-Thin.ttf",
|
|
97
96
|
"SFProText-200" to "SFProText-Ultralight.ttf",
|
|
98
97
|
"SFProText-300" to "SFProText-Light.ttf",
|
|
99
|
-
"SFProText-400" to
|
|
98
|
+
"SFProText-400" to DEFAULT_FONT_FILE,
|
|
100
99
|
"SFProText-500" to "SFProText-Medium.ttf",
|
|
101
100
|
"SFProText-600" to "SFProText-Semibold.ttf",
|
|
102
101
|
"SFProText-700" to "SFProText-Bold.ttf",
|
|
@@ -120,34 +119,13 @@ private val hostFontFiles: Map<String, String> = mapOf(
|
|
|
120
119
|
)
|
|
121
120
|
}
|
|
122
121
|
|
|
123
|
-
/**
|
|
124
|
-
* Font mặc định mới, chỉ áp cho user nằm trong whitelist design system ([KitDesignSystem]).
|
|
125
|
-
* Ngoài whitelist thì quay về [LEGACY_DEFAULT_FONT_FAMILY] như trước.
|
|
126
|
-
*/
|
|
127
|
-
private const val NEW_DEFAULT_FONT_FAMILY = "MomoTrustSans"
|
|
128
|
-
private const val LEGACY_DEFAULT_FONT_FAMILY = "SFProText"
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Font thuoc bo design system moi. MoMoTrustDisplay chi duoc header dung tu DS-791
|
|
132
|
-
* (commit header title 5bfde6251); truoc do header lay font theo theme, nen ngoai
|
|
133
|
-
* whitelist ca hai deu ha ve [LEGACY_DEFAULT_FONT_FAMILY].
|
|
134
|
-
*/
|
|
135
|
-
private val newFontFamilies = setOf(NEW_DEFAULT_FONT_FAMILY, "MoMoTrustDisplay")
|
|
136
|
-
|
|
137
122
|
@Composable
|
|
138
123
|
fun getFontFamily(fontFamily: String, fontWeight: FontWeight? = FontWeight.Normal): FontFamily {
|
|
139
|
-
val
|
|
140
|
-
val
|
|
141
|
-
|
|
142
|
-
LEGACY_DEFAULT_FONT_FAMILY
|
|
143
|
-
} else {
|
|
144
|
-
fontFamily
|
|
145
|
-
}
|
|
146
|
-
val defaultFile = if (isWhiteList) NEW_DEFAULT_FONT_FILE else LEGACY_DEFAULT_FONT_FILE
|
|
147
|
-
val key = "$resolvedFamily-${fontWeight?.weight}"
|
|
148
|
-
val fileName = hostFontFiles[key] ?: defaultFile
|
|
124
|
+
val family = if (KitDesignSystem.isWhiteList && fontFamily == "SFProText") "MomoTrustSans" else fontFamily
|
|
125
|
+
val key = "$family-${fontWeight?.weight}"
|
|
126
|
+
val fileName = hostFontFiles[key] ?: DEFAULT_FONT_FILE
|
|
149
127
|
return hostFontFamily(fileName)
|
|
150
|
-
?: hostFontFamily(
|
|
128
|
+
?: hostFontFamily(DEFAULT_FONT_FILE)
|
|
151
129
|
?: FontFamily.Default
|
|
152
130
|
}
|
|
153
131
|
|
|
@@ -4,6 +4,7 @@ import androidx.compose.foundation.background
|
|
|
4
4
|
import androidx.compose.foundation.layout.Arrangement
|
|
5
5
|
import androidx.compose.foundation.layout.Box
|
|
6
6
|
import androidx.compose.foundation.layout.BoxWithConstraints
|
|
7
|
+
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
|
7
8
|
import androidx.compose.foundation.layout.FlowRow
|
|
8
9
|
import androidx.compose.foundation.layout.PaddingValues
|
|
9
10
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
@@ -14,6 +15,7 @@ import androidx.compose.runtime.CompositionLocalProvider
|
|
|
14
15
|
import androidx.compose.ui.Modifier
|
|
15
16
|
import androidx.compose.ui.draw.clip
|
|
16
17
|
import androidx.compose.ui.draw.shadow
|
|
18
|
+
import androidx.compose.ui.graphics.Color
|
|
17
19
|
import androidx.compose.ui.unit.dp
|
|
18
20
|
import vn.momo.kits.components.Image
|
|
19
21
|
import vn.momo.kits.const.AppTheme
|
|
@@ -21,30 +23,30 @@ import vn.momo.kits.const.Radius
|
|
|
21
23
|
import vn.momo.kits.const.Spacing
|
|
22
24
|
|
|
23
25
|
@Composable
|
|
24
|
-
|
|
26
|
+
@OptIn(ExperimentalLayoutApi::class)
|
|
27
|
+
fun Card(
|
|
25
28
|
useShadow: Boolean = false,
|
|
26
29
|
backgroundImage: String? = null,
|
|
30
|
+
backgroundColor: Color? = null,
|
|
27
31
|
contentPadding: PaddingValues = PaddingValues(Spacing.M),
|
|
28
32
|
modifier: Modifier = Modifier,
|
|
29
33
|
content: @Composable () -> Unit,
|
|
30
34
|
) {
|
|
31
|
-
val columns =
|
|
32
|
-
val
|
|
35
|
+
val columns = gridColumns()
|
|
36
|
+
val gap = Spacing.S
|
|
33
37
|
val shape = RoundedCornerShape(Radius.M)
|
|
34
|
-
var surface = modifier.fillMaxWidth().padding(horizontal =
|
|
35
|
-
if (useShadow) surface = surface.shadow(
|
|
36
|
-
surface = surface.clip(shape)
|
|
37
|
-
if (backgroundImage == null) surface = surface.background(AppTheme.current.colors.background.surface)
|
|
38
|
+
var surface = modifier.fillMaxWidth().padding(horizontal = Spacing.M)
|
|
39
|
+
if (useShadow) surface = surface.shadow(6.dp, shape)
|
|
40
|
+
surface = surface.clip(shape).background(backgroundColor ?: AppTheme.current.colors.background.surface)
|
|
38
41
|
Box(modifier = surface) {
|
|
39
42
|
if (backgroundImage != null) {
|
|
40
43
|
Image(source = backgroundImage, modifier = Modifier.matchParentSize())
|
|
41
44
|
}
|
|
42
45
|
BoxWithConstraints(modifier = Modifier.fillMaxWidth().padding(contentPadding)) {
|
|
43
|
-
|
|
44
|
-
CompositionLocalProvider(LocalGridContext provides GridContext(columns, gutter, sizePerSpan)) {
|
|
46
|
+
CompositionLocalProvider(LocalGridContext provides gridContext(constraints.maxWidth, columns, gap)) {
|
|
45
47
|
FlowRow(
|
|
46
|
-
horizontalArrangement = Arrangement.spacedBy(
|
|
47
|
-
verticalArrangement = Arrangement.spacedBy(
|
|
48
|
+
horizontalArrangement = Arrangement.spacedBy(gap),
|
|
49
|
+
verticalArrangement = Arrangement.spacedBy(gap),
|
|
48
50
|
) { content() }
|
|
49
51
|
}
|
|
50
52
|
}
|
|
@@ -6,33 +6,46 @@ import androidx.compose.foundation.layout.width
|
|
|
6
6
|
import androidx.compose.runtime.Composable
|
|
7
7
|
import androidx.compose.runtime.compositionLocalOf
|
|
8
8
|
import androidx.compose.ui.Modifier
|
|
9
|
+
import androidx.compose.ui.platform.LocalDensity
|
|
9
10
|
import androidx.compose.ui.unit.Dp
|
|
10
11
|
import androidx.compose.ui.unit.dp
|
|
12
|
+
import vn.momo.kits.platform.getScreenDimensions
|
|
13
|
+
import kotlin.math.floor
|
|
11
14
|
|
|
12
15
|
internal data class GridContext(
|
|
13
16
|
val numberOfColumns: Int = 12,
|
|
14
|
-
val
|
|
15
|
-
val
|
|
17
|
+
val gutterPx: Int = 0,
|
|
18
|
+
val columnPx: Float = 0f,
|
|
19
|
+
val density: Float = 1f,
|
|
16
20
|
) {
|
|
17
|
-
fun sizeForSpan(span: Int): Dp =
|
|
21
|
+
fun sizeForSpan(span: Int): Dp = (floor(columnPx * span + gutterPx * (span - 1)) / density).dp
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
internal val LocalGridContext = compositionLocalOf<GridContext?> { null }
|
|
21
25
|
|
|
22
26
|
@Composable
|
|
23
|
-
internal fun
|
|
24
|
-
|
|
27
|
+
internal fun gridColumns(): Int = if (getScreenDimensions().width > 600) 24 else 12
|
|
28
|
+
|
|
29
|
+
@Composable
|
|
30
|
+
internal fun gridContext(maxWidthPx: Int, columns: Int, gap: Dp): GridContext {
|
|
31
|
+
val density = LocalDensity.current
|
|
32
|
+
val gutterPx = with(density) { gap.roundToPx() }
|
|
33
|
+
return GridContext(columns, gutterPx, (maxWidthPx - gutterPx * (columns - 1)).toFloat() / columns, density.density)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Composable
|
|
37
|
+
fun Item(
|
|
38
|
+
widthSpan: Int? = null,
|
|
25
39
|
heightSpan: Int = 0,
|
|
26
40
|
modifier: Modifier = Modifier,
|
|
41
|
+
contentModifier: Modifier = Modifier,
|
|
27
42
|
content: @Composable () -> Unit,
|
|
28
43
|
) {
|
|
29
44
|
val grid = LocalGridContext.current
|
|
30
45
|
var m = modifier
|
|
31
46
|
if (grid != null) {
|
|
32
|
-
m = m.width(grid.sizeForSpan(widthSpan))
|
|
47
|
+
m = m.width(grid.sizeForSpan(widthSpan ?: grid.numberOfColumns))
|
|
33
48
|
if (heightSpan > 0) m = m.height(grid.sizeForSpan(heightSpan))
|
|
34
49
|
}
|
|
35
|
-
|
|
36
|
-
// on top of each other — matches the React Item's flex-column content.
|
|
37
|
-
Column(modifier = m) { content() }
|
|
50
|
+
Column(modifier = m.then(contentModifier)) { content() }
|
|
38
51
|
}
|
|
@@ -3,6 +3,7 @@ package vn.momo.kits.layout
|
|
|
3
3
|
import androidx.compose.foundation.layout.Arrangement
|
|
4
4
|
import androidx.compose.foundation.layout.Box
|
|
5
5
|
import androidx.compose.foundation.layout.BoxWithConstraints
|
|
6
|
+
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
|
6
7
|
import androidx.compose.foundation.layout.FlowRow
|
|
7
8
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
8
9
|
import androidx.compose.foundation.layout.padding
|
|
@@ -11,27 +12,28 @@ import androidx.compose.runtime.CompositionLocalProvider
|
|
|
11
12
|
import androidx.compose.ui.Modifier
|
|
12
13
|
import androidx.compose.ui.unit.dp
|
|
13
14
|
import vn.momo.kits.components.Image
|
|
15
|
+
import vn.momo.kits.const.Spacing
|
|
14
16
|
|
|
15
17
|
@Composable
|
|
16
|
-
|
|
18
|
+
@OptIn(ExperimentalLayoutApi::class)
|
|
19
|
+
fun Section(
|
|
17
20
|
useMargin: Boolean = true,
|
|
18
21
|
backgroundImage: String? = null,
|
|
19
22
|
modifier: Modifier = Modifier,
|
|
20
23
|
content: @Composable () -> Unit,
|
|
21
24
|
) {
|
|
22
|
-
val columns =
|
|
23
|
-
val
|
|
24
|
-
val margin = if (useMargin)
|
|
25
|
-
Box(modifier =
|
|
25
|
+
val columns = gridColumns()
|
|
26
|
+
val gap = Spacing.M
|
|
27
|
+
val margin = if (useMargin) Spacing.M else 0.dp
|
|
28
|
+
Box(modifier = Modifier.fillMaxWidth().padding(horizontal = margin).then(modifier)) {
|
|
26
29
|
if (backgroundImage != null) {
|
|
27
30
|
Image(source = backgroundImage, modifier = Modifier.matchParentSize())
|
|
28
31
|
}
|
|
29
32
|
BoxWithConstraints(modifier = Modifier.fillMaxWidth()) {
|
|
30
|
-
|
|
31
|
-
CompositionLocalProvider(LocalGridContext provides GridContext(columns, gutter, sizePerSpan)) {
|
|
33
|
+
CompositionLocalProvider(LocalGridContext provides gridContext(constraints.maxWidth, columns, gap)) {
|
|
32
34
|
FlowRow(
|
|
33
|
-
horizontalArrangement = Arrangement.spacedBy(
|
|
34
|
-
verticalArrangement = Arrangement.spacedBy(
|
|
35
|
+
horizontalArrangement = Arrangement.spacedBy(gap),
|
|
36
|
+
verticalArrangement = Arrangement.spacedBy(gap),
|
|
35
37
|
) { content() }
|
|
36
38
|
}
|
|
37
39
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
package vn.momo.kits.navigation
|
|
2
2
|
|
|
3
3
|
import androidx.compose.animation.animateColorAsState
|
|
4
|
-
import androidx.compose.animation.core.animateDpAsState
|
|
5
4
|
import androidx.compose.foundation.ScrollState
|
|
6
5
|
import androidx.compose.foundation.background
|
|
7
6
|
import androidx.compose.foundation.border
|
|
8
7
|
import androidx.compose.foundation.gestures.ScrollableState
|
|
8
|
+
import androidx.compose.foundation.gestures.animateScrollBy
|
|
9
9
|
import androidx.compose.foundation.layout.Box
|
|
10
10
|
import androidx.compose.foundation.layout.Column
|
|
11
11
|
import androidx.compose.foundation.layout.ColumnScope
|
|
@@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.imePadding
|
|
|
21
21
|
import androidx.compose.foundation.layout.offset
|
|
22
22
|
import androidx.compose.foundation.layout.padding
|
|
23
23
|
import androidx.compose.foundation.lazy.LazyListState
|
|
24
|
-
import androidx.compose.foundation.lazy.rememberLazyListState
|
|
25
24
|
import androidx.compose.foundation.rememberScrollState
|
|
26
25
|
import androidx.compose.foundation.verticalScroll
|
|
27
26
|
import androidx.compose.material.ExperimentalMaterialApi
|
|
@@ -45,8 +44,11 @@ import androidx.compose.ui.layout.onGloballyPositioned
|
|
|
45
44
|
import androidx.compose.ui.platform.LocalDensity
|
|
46
45
|
import androidx.compose.ui.unit.Dp
|
|
47
46
|
import androidx.compose.ui.unit.dp
|
|
47
|
+
import androidx.compose.ui.unit.lerp
|
|
48
48
|
import androidx.compose.ui.zIndex
|
|
49
49
|
import kotlinx.coroutines.flow.Flow
|
|
50
|
+
import kotlinx.coroutines.flow.filter
|
|
51
|
+
import kotlinx.coroutines.launch
|
|
50
52
|
import vn.momo.kits.components.InputSearch
|
|
51
53
|
import vn.momo.kits.const.AppNavigationBar
|
|
52
54
|
import vn.momo.kits.const.AppStatusBar
|
|
@@ -154,13 +156,15 @@ internal fun StackScreen(
|
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
val limit = with(density) {
|
|
157
|
-
(statusBar).toPx()
|
|
159
|
+
(statusBar + HEADER_HEIGHT.dp).toPx()
|
|
158
160
|
}.toInt()
|
|
159
161
|
|
|
160
|
-
val
|
|
161
|
-
|
|
162
|
+
val lazyListState = options.scrollData.scrollState as? LazyListState
|
|
163
|
+
val (scrollState, _) = if (lazyListState != null)
|
|
164
|
+
lazyListState.proxyScrollState(limit, 1)
|
|
162
165
|
else
|
|
163
|
-
(options.scrollData.scrollState as? ScrollState ?: rememberScrollState()).proxyLimitedScrollState(limit,
|
|
166
|
+
(options.scrollData.scrollState as? ScrollState ?: rememberScrollState()).proxyLimitedScrollState(limit, 1)
|
|
167
|
+
val snapState: ScrollableState = lazyListState ?: scrollState
|
|
164
168
|
|
|
165
169
|
val footerHeightPx = remember { mutableIntStateOf(0) }
|
|
166
170
|
val headerRightWidthPx = remember { mutableIntStateOf(0) }
|
|
@@ -205,7 +209,7 @@ internal fun StackScreen(
|
|
|
205
209
|
}
|
|
206
210
|
|
|
207
211
|
Column(Modifier.zIndex(5f)) {
|
|
208
|
-
SearchAnimated(
|
|
212
|
+
SearchAnimated(snapState = snapState)
|
|
209
213
|
}
|
|
210
214
|
|
|
211
215
|
Column(Modifier.zIndex(2f).fillMaxSize()) {
|
|
@@ -269,11 +273,7 @@ internal fun ColumnScope.MainContent(content: @Composable () -> Unit, isBottomTa
|
|
|
269
273
|
if (inputSearchType == InputSearchType.Animated) {
|
|
270
274
|
val scrollDp = with(density) { scrollState.value.toDp() }
|
|
271
275
|
|
|
272
|
-
|
|
273
|
-
targetValue = (HEADER_HEIGHT.dp - scrollDp).coerceIn(0.dp, HEADER_HEIGHT.dp),
|
|
274
|
-
label = "AnimatedTopPadding"
|
|
275
|
-
)
|
|
276
|
-
Spacer(Modifier.height(animatedTopPadding))
|
|
276
|
+
Spacer(Modifier.height((HEADER_HEIGHT.dp - scrollDp).coerceIn(0.dp, HEADER_HEIGHT.dp)))
|
|
277
277
|
}
|
|
278
278
|
Column(
|
|
279
279
|
Modifier
|
|
@@ -413,7 +413,7 @@ data class InputSearchLayoutParams(
|
|
|
413
413
|
@Suppress("FrequentlyChangingValue")
|
|
414
414
|
@Composable
|
|
415
415
|
internal fun SearchAnimated(
|
|
416
|
-
|
|
416
|
+
snapState: ScrollableState
|
|
417
417
|
) {
|
|
418
418
|
val scrollState = LocalScrollState.current
|
|
419
419
|
val options = LocalOptions.current
|
|
@@ -453,44 +453,24 @@ internal fun SearchAnimated(
|
|
|
453
453
|
}
|
|
454
454
|
|
|
455
455
|
InputSearchType.Animated -> {
|
|
456
|
-
val
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
)
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
targetValue = (minEndPadding + scrollDp).coerceIn(minEndPadding, maxEndPadding),
|
|
468
|
-
label = "AnimatedEndPadding"
|
|
469
|
-
)
|
|
470
|
-
|
|
471
|
-
val maxPadding = remember(maxTopPadding, maxStartPadding, maxEndPadding) {
|
|
472
|
-
maxOf(maxEndPadding, maxStartPadding, maxTopPadding)
|
|
473
|
-
}
|
|
474
|
-
val snapScrollValue = with(density) { maxPadding.toPx().toInt() }
|
|
475
|
-
|
|
476
|
-
LaunchedEffect(isScrollInProgress && scrollState.value != 0 && scrollState.value != snapScrollValue) {
|
|
477
|
-
if (scrollDp < maxPadding) {
|
|
478
|
-
if (!isScrollInProgress) {
|
|
479
|
-
val midpoint = (maxTopPadding - minTopPadding) / 2
|
|
480
|
-
|
|
481
|
-
if (scrollDp < midpoint) {
|
|
482
|
-
scrollState.animateScrollTo(0)
|
|
483
|
-
} else {
|
|
484
|
-
scrollState.animateScrollTo(snapScrollValue)
|
|
485
|
-
}
|
|
456
|
+
val collapsePx = with(density) { HEADER_HEIGHT.dp.roundToPx() }
|
|
457
|
+
val progress = (scrollState.value / collapsePx.toFloat()).coerceIn(0f, 1f)
|
|
458
|
+
|
|
459
|
+
LaunchedEffect(snapState, collapsePx) {
|
|
460
|
+
snapshotFlow { snapState.isScrollInProgress }
|
|
461
|
+
.filter { !it }
|
|
462
|
+
.collect {
|
|
463
|
+
val offset = snapState.headerOffsetPx() ?: return@collect
|
|
464
|
+
if (offset <= 0 || offset >= collapsePx) return@collect
|
|
465
|
+
val target = if (offset < collapsePx / 2) 0 else collapsePx
|
|
466
|
+
launch { snapState.animateScrollBy((target - offset).toFloat()) }
|
|
486
467
|
}
|
|
487
|
-
}
|
|
488
468
|
}
|
|
489
469
|
|
|
490
470
|
InputSearchLayoutParams(
|
|
491
|
-
topPadding =
|
|
492
|
-
startPadding =
|
|
493
|
-
endPadding =
|
|
471
|
+
topPadding = lerp(maxTopPadding, minTopPadding, progress),
|
|
472
|
+
startPadding = lerp(minStartPadding, maxStartPadding, progress),
|
|
473
|
+
endPadding = lerp(minEndPadding, maxEndPadding, progress)
|
|
494
474
|
)
|
|
495
475
|
}
|
|
496
476
|
|
|
@@ -519,6 +499,12 @@ internal fun SearchAnimated(
|
|
|
519
499
|
}
|
|
520
500
|
}
|
|
521
501
|
|
|
502
|
+
private fun ScrollableState.headerOffsetPx(): Int? = when (this) {
|
|
503
|
+
is LazyListState -> if (firstVisibleItemIndex == 0) firstVisibleItemScrollOffset else null
|
|
504
|
+
is ScrollState -> value
|
|
505
|
+
else -> null
|
|
506
|
+
}
|
|
507
|
+
|
|
522
508
|
private fun quantize(value: Int, stepPx: Int): Int {
|
|
523
509
|
if (stepPx <= 1) return value
|
|
524
510
|
return (value / stepPx) * stepPx
|
|
@@ -15,11 +15,14 @@ import androidx.compose.foundation.layout.offset
|
|
|
15
15
|
import androidx.compose.foundation.layout.padding
|
|
16
16
|
import androidx.compose.foundation.layout.size
|
|
17
17
|
import androidx.compose.foundation.layout.width
|
|
18
|
+
import androidx.compose.foundation.layout.wrapContentHeight
|
|
18
19
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
19
20
|
import androidx.compose.runtime.Composable
|
|
20
21
|
import androidx.compose.runtime.getValue
|
|
21
22
|
import androidx.compose.ui.Alignment
|
|
22
23
|
import androidx.compose.ui.Modifier
|
|
24
|
+
import androidx.compose.ui.draw.clipToBounds
|
|
25
|
+
import androidx.compose.ui.graphics.graphicsLayer
|
|
23
26
|
import androidx.compose.ui.graphics.Brush
|
|
24
27
|
import androidx.compose.ui.graphics.Color
|
|
25
28
|
import androidx.compose.ui.layout.onGloballyPositioned
|
|
@@ -28,6 +31,7 @@ import androidx.compose.ui.text.style.TextAlign
|
|
|
28
31
|
import androidx.compose.ui.unit.Dp
|
|
29
32
|
import androidx.compose.ui.unit.dp
|
|
30
33
|
import vn.momo.kits.components.Icon
|
|
34
|
+
import vn.momo.kits.components.Image
|
|
31
35
|
import vn.momo.kits.components.InputSearchProps
|
|
32
36
|
import vn.momo.kits.const.AppStatusBar
|
|
33
37
|
import vn.momo.kits.const.AppTheme
|
|
@@ -63,11 +67,10 @@ internal fun Header(onBackHandler: (() -> Unit)? = null) {
|
|
|
63
67
|
else -> HEADER_HEIGHT
|
|
64
68
|
}
|
|
65
69
|
val opacity by animateFloatAsState(
|
|
66
|
-
targetValue =
|
|
67
|
-
0f
|
|
68
|
-
|
|
69
|
-
(scrollState.value / opacityHeight.toFloat())
|
|
70
|
-
.coerceIn(0f, 1f)
|
|
70
|
+
targetValue = when {
|
|
71
|
+
options.headerType is HeaderType.Transparent -> 0f
|
|
72
|
+
opacityHeight <= 0 -> if (scrollState.value > 0) 1f else 0f
|
|
73
|
+
else -> (scrollState.value / opacityHeight.toFloat()).coerceIn(0f, 1f)
|
|
71
74
|
}
|
|
72
75
|
)
|
|
73
76
|
|
|
@@ -88,15 +91,38 @@ internal fun Header(onBackHandler: (() -> Unit)? = null) {
|
|
|
88
91
|
// Centered title needs a full-width overlay to stay screen-centered, not boxed between back button and header right.
|
|
89
92
|
val centerTitle = titlePosition == TitlePosition.CENTER && options.headerTitle is HeaderTitle.Default
|
|
90
93
|
|
|
94
|
+
val headerImage = AppTheme.current.assets.headerBackground
|
|
95
|
+
.takeUnless { options.headerType is HeaderType.Transparent }
|
|
96
|
+
|
|
91
97
|
Box(
|
|
92
98
|
Modifier.height(AppStatusBar.current + HEADER_HEIGHT.dp)
|
|
93
99
|
.fillMaxWidth()
|
|
94
|
-
.
|
|
100
|
+
.conditional(headerImage.isNullOrEmpty()) {
|
|
101
|
+
background(background.copy(alpha = animatedAlpha))
|
|
102
|
+
}
|
|
95
103
|
.conditional(IsShowBaseLineDebug) {
|
|
96
104
|
border(1.dp, Colors.blue_03)
|
|
97
105
|
},
|
|
98
106
|
contentAlignment = Alignment.BottomCenter
|
|
99
107
|
) {
|
|
108
|
+
if (!headerImage.isNullOrEmpty()) {
|
|
109
|
+
Box(
|
|
110
|
+
Modifier
|
|
111
|
+
.matchParentSize()
|
|
112
|
+
.clipToBounds()
|
|
113
|
+
.graphicsLayer { alpha = animatedAlpha }
|
|
114
|
+
.background(background)
|
|
115
|
+
) {
|
|
116
|
+
Image(
|
|
117
|
+
source = headerImage,
|
|
118
|
+
loading = false,
|
|
119
|
+
modifier = Modifier
|
|
120
|
+
.fillMaxWidth()
|
|
121
|
+
.wrapContentHeight(Alignment.Top, unbounded = true)
|
|
122
|
+
.height(HEADER_BACKGROUND_HEIGHT),
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
100
126
|
Row(
|
|
101
127
|
modifier = Modifier.height(HEADER_HEIGHT.dp)
|
|
102
128
|
.fillMaxWidth()
|
|
@@ -27,6 +27,8 @@ enum class AnimatedHeaderRatio(val value: Float){
|
|
|
27
27
|
RATIO_3_2(3f / 2f)
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
internal val HEADER_BACKGROUND_HEIGHT = 154.dp
|
|
31
|
+
|
|
30
32
|
@Suppress("FrequentlyChangingValue")
|
|
31
33
|
@Composable
|
|
32
34
|
internal fun HeaderBackground() {
|
|
@@ -37,7 +39,7 @@ internal fun HeaderBackground() {
|
|
|
37
39
|
val backgroundColor = options.backgroundColor ?: AppTheme.current.colors.background.default
|
|
38
40
|
|
|
39
41
|
val minHeight = AppStatusBar.current + HEADER_HEIGHT.dp
|
|
40
|
-
val maxHeight =
|
|
42
|
+
val maxHeight = HEADER_BACKGROUND_HEIGHT
|
|
41
43
|
val opacity by animateFloatAsState(
|
|
42
44
|
targetValue = (1 - (scrollState.value * 1f / HEADER_HEIGHT * 1f)).coerceIn(0f, 1f),
|
|
43
45
|
)
|
|
@@ -9,11 +9,10 @@ import androidx.compose.ui.text.style.TextOverflow
|
|
|
9
9
|
import androidx.compose.ui.unit.sp
|
|
10
10
|
import androidx.compose.ui.zIndex
|
|
11
11
|
import vn.momo.kits.components.Text
|
|
12
|
+
import vn.momo.kits.const.KitDesignSystem
|
|
12
13
|
import vn.momo.kits.const.Typography
|
|
13
14
|
import vn.momo.kits.modifier.setAutomationId
|
|
14
15
|
|
|
15
|
-
internal const val HEADER_FONT_FAMILY = "MoMoTrustDisplay"
|
|
16
|
-
|
|
17
16
|
@Composable
|
|
18
17
|
internal fun HeaderTitle(
|
|
19
18
|
title: String = "",
|
|
@@ -29,7 +28,7 @@ internal fun HeaderTitle(
|
|
|
29
28
|
fontSize = 15.sp,
|
|
30
29
|
lineHeight = 22.sp,
|
|
31
30
|
),
|
|
32
|
-
fontFamily =
|
|
31
|
+
fontFamily = if (KitDesignSystem.isWhiteList) "MoMoTrustDisplay" else "SFProText",
|
|
33
32
|
color = color,
|
|
34
33
|
maxLines = 1,
|
|
35
34
|
overflow = TextOverflow.Ellipsis
|
|
@@ -27,6 +27,7 @@ import vn.momo.kits.components.Skeleton
|
|
|
27
27
|
import vn.momo.kits.components.Text
|
|
28
28
|
import vn.momo.kits.const.AppTheme
|
|
29
29
|
import vn.momo.kits.const.Colors
|
|
30
|
+
import vn.momo.kits.const.KitDesignSystem
|
|
30
31
|
import vn.momo.kits.const.Spacing
|
|
31
32
|
import vn.momo.kits.const.Typography
|
|
32
33
|
import vn.momo.kits.const.getFontFamily
|
|
@@ -79,7 +80,7 @@ internal fun HeaderUser(
|
|
|
79
80
|
text = data.title,
|
|
80
81
|
color = data.tintColor,
|
|
81
82
|
style = Typography.actionXsBold,
|
|
82
|
-
fontFamily =
|
|
83
|
+
fontFamily = if (KitDesignSystem.isWhiteList) "MoMoTrustDisplay" else "SFProText",
|
|
83
84
|
maxLines = 1,
|
|
84
85
|
overflow = TextOverflow.Ellipsis
|
|
85
86
|
)
|
package/gradle.properties
CHANGED
package/ios/native-kits.podspec
CHANGED
package/package.json
CHANGED
package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<Scheme
|
|
3
|
-
version = "1.3">
|
|
4
|
-
<BuildAction>
|
|
5
|
-
<BuildActionEntries>
|
|
6
|
-
<BuildActionEntry
|
|
7
|
-
buildForRunning = "YES">
|
|
8
|
-
<BuildableReference
|
|
9
|
-
BuildableIdentifier = "primary"
|
|
10
|
-
BlueprintIdentifier = "A6A920D22B2ADD1E00C1A11F"
|
|
11
|
-
BuildableName = "Example"
|
|
12
|
-
BlueprintName = "Example"
|
|
13
|
-
ReferencedContainer = "container:Example.xcodeproj">
|
|
14
|
-
</BuildableReference>
|
|
15
|
-
</BuildActionEntry>
|
|
16
|
-
</BuildActionEntries>
|
|
17
|
-
</BuildAction>
|
|
18
|
-
<LaunchAction
|
|
19
|
-
useCustomWorkingDirectory = "NO"
|
|
20
|
-
buildConfiguration = "Debug"
|
|
21
|
-
allowLocationSimulation = "YES">
|
|
22
|
-
<BuildableProductRunnable>
|
|
23
|
-
<BuildableReference
|
|
24
|
-
BuildableIdentifier = "primary"
|
|
25
|
-
BlueprintIdentifier = "A6A920D22B2ADD1E00C1A11F"
|
|
26
|
-
BuildableName = "Example"
|
|
27
|
-
BlueprintName = "Example"
|
|
28
|
-
ReferencedContainer = "container:Example.xcodeproj">
|
|
29
|
-
</BuildableReference>
|
|
30
|
-
</BuildableProductRunnable>
|
|
31
|
-
</LaunchAction>
|
|
32
|
-
</Scheme>
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
-
<plist version="1.0">
|
|
4
|
-
<dict>
|
|
5
|
-
<key>SchemeUserState</key>
|
|
6
|
-
<dict>
|
|
7
|
-
<key>Example.xcscheme</key>
|
|
8
|
-
<dict>
|
|
9
|
-
<key>orderHint</key>
|
|
10
|
-
<integer>7</integer>
|
|
11
|
-
</dict>
|
|
12
|
-
</dict>
|
|
13
|
-
</dict>
|
|
14
|
-
</plist>
|
|
Binary file
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
-
<plist version="1.0">
|
|
4
|
-
<dict>
|
|
5
|
-
<key>BuildLocationStyle</key>
|
|
6
|
-
<string>UseAppPreferences</string>
|
|
7
|
-
<key>CustomBuildLocationType</key>
|
|
8
|
-
<string>RelativeToDerivedData</string>
|
|
9
|
-
<key>DerivedDataCustomLocation</key>
|
|
10
|
-
<string>DerivedData</string>
|
|
11
|
-
<key>DerivedDataLocationStyle</key>
|
|
12
|
-
<string>WorkspaceRelativePath</string>
|
|
13
|
-
<key>ShowSharedSchemesAutomaticallyEnabled</key>
|
|
14
|
-
<true/>
|
|
15
|
-
</dict>
|
|
16
|
-
</plist>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<Scheme
|
|
3
|
-
LastUpgradeVersion = "1600"
|
|
4
|
-
version = "1.3">
|
|
5
|
-
<BuildAction
|
|
6
|
-
parallelizeBuildables = "YES"
|
|
7
|
-
buildImplicitDependencies = "YES">
|
|
8
|
-
<BuildActionEntries>
|
|
9
|
-
<BuildActionEntry
|
|
10
|
-
buildForTesting = "YES"
|
|
11
|
-
buildForRunning = "YES"
|
|
12
|
-
buildForProfiling = "YES"
|
|
13
|
-
buildForArchiving = "YES"
|
|
14
|
-
buildForAnalyzing = "YES">
|
|
15
|
-
<BuildableReference
|
|
16
|
-
BuildableIdentifier = "primary"
|
|
17
|
-
BlueprintIdentifier = "3B6FB503A75BF5BC1FA6F30BC06B9D28"
|
|
18
|
-
BuildableName = "MoMoUIKits.framework"
|
|
19
|
-
BlueprintName = "MoMoUIKits"
|
|
20
|
-
ReferencedContainer = "container:Pods.xcodeproj">
|
|
21
|
-
</BuildableReference>
|
|
22
|
-
</BuildActionEntry>
|
|
23
|
-
</BuildActionEntries>
|
|
24
|
-
</BuildAction>
|
|
25
|
-
<TestAction
|
|
26
|
-
buildConfiguration = "Debug"
|
|
27
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
-
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
-
<Testables>
|
|
31
|
-
</Testables>
|
|
32
|
-
</TestAction>
|
|
33
|
-
<LaunchAction
|
|
34
|
-
buildConfiguration = "Debug"
|
|
35
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
36
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
37
|
-
launchStyle = "0"
|
|
38
|
-
useCustomWorkingDirectory = "NO"
|
|
39
|
-
ignoresPersistentStateOnLaunch = "NO"
|
|
40
|
-
debugDocumentVersioning = "YES"
|
|
41
|
-
debugServiceExtension = "internal"
|
|
42
|
-
allowLocationSimulation = "YES">
|
|
43
|
-
</LaunchAction>
|
|
44
|
-
<ProfileAction
|
|
45
|
-
buildConfiguration = "Release"
|
|
46
|
-
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
47
|
-
savedToolIdentifier = ""
|
|
48
|
-
useCustomWorkingDirectory = "NO"
|
|
49
|
-
debugDocumentVersioning = "YES">
|
|
50
|
-
</ProfileAction>
|
|
51
|
-
<AnalyzeAction
|
|
52
|
-
buildConfiguration = "Debug">
|
|
53
|
-
</AnalyzeAction>
|
|
54
|
-
<ArchiveAction
|
|
55
|
-
buildConfiguration = "Release"
|
|
56
|
-
revealArchiveInOrganizer = "YES">
|
|
57
|
-
</ArchiveAction>
|
|
58
|
-
</Scheme>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<Scheme
|
|
3
|
-
LastUpgradeVersion = "1600"
|
|
4
|
-
version = "1.3">
|
|
5
|
-
<BuildAction
|
|
6
|
-
parallelizeBuildables = "YES"
|
|
7
|
-
buildImplicitDependencies = "YES">
|
|
8
|
-
<BuildActionEntries>
|
|
9
|
-
<BuildActionEntry
|
|
10
|
-
buildForTesting = "YES"
|
|
11
|
-
buildForRunning = "YES"
|
|
12
|
-
buildForProfiling = "YES"
|
|
13
|
-
buildForArchiving = "YES"
|
|
14
|
-
buildForAnalyzing = "YES">
|
|
15
|
-
<BuildableReference
|
|
16
|
-
BuildableIdentifier = "primary"
|
|
17
|
-
BlueprintIdentifier = "0AEE99A309977BD12A049FF48AF9BA4B"
|
|
18
|
-
BuildableName = "Pods_Example.framework"
|
|
19
|
-
BlueprintName = "Pods-Example"
|
|
20
|
-
ReferencedContainer = "container:Pods.xcodeproj">
|
|
21
|
-
</BuildableReference>
|
|
22
|
-
</BuildActionEntry>
|
|
23
|
-
</BuildActionEntries>
|
|
24
|
-
</BuildAction>
|
|
25
|
-
<TestAction
|
|
26
|
-
buildConfiguration = "Debug"
|
|
27
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
-
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
-
<Testables>
|
|
31
|
-
</Testables>
|
|
32
|
-
</TestAction>
|
|
33
|
-
<LaunchAction
|
|
34
|
-
buildConfiguration = "Debug"
|
|
35
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
36
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
37
|
-
launchStyle = "0"
|
|
38
|
-
useCustomWorkingDirectory = "NO"
|
|
39
|
-
ignoresPersistentStateOnLaunch = "NO"
|
|
40
|
-
debugDocumentVersioning = "YES"
|
|
41
|
-
debugServiceExtension = "internal"
|
|
42
|
-
allowLocationSimulation = "YES">
|
|
43
|
-
</LaunchAction>
|
|
44
|
-
<ProfileAction
|
|
45
|
-
buildConfiguration = "Release"
|
|
46
|
-
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
47
|
-
savedToolIdentifier = ""
|
|
48
|
-
useCustomWorkingDirectory = "NO"
|
|
49
|
-
debugDocumentVersioning = "YES">
|
|
50
|
-
</ProfileAction>
|
|
51
|
-
<AnalyzeAction
|
|
52
|
-
buildConfiguration = "Debug">
|
|
53
|
-
</AnalyzeAction>
|
|
54
|
-
<ArchiveAction
|
|
55
|
-
buildConfiguration = "Release"
|
|
56
|
-
revealArchiveInOrganizer = "YES">
|
|
57
|
-
</ArchiveAction>
|
|
58
|
-
</Scheme>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<Scheme
|
|
3
|
-
LastUpgradeVersion = "1600"
|
|
4
|
-
version = "1.3">
|
|
5
|
-
<BuildAction
|
|
6
|
-
parallelizeBuildables = "YES"
|
|
7
|
-
buildImplicitDependencies = "YES">
|
|
8
|
-
<BuildActionEntries>
|
|
9
|
-
<BuildActionEntry
|
|
10
|
-
buildForTesting = "YES"
|
|
11
|
-
buildForRunning = "YES"
|
|
12
|
-
buildForProfiling = "YES"
|
|
13
|
-
buildForArchiving = "YES"
|
|
14
|
-
buildForAnalyzing = "YES">
|
|
15
|
-
<BuildableReference
|
|
16
|
-
BuildableIdentifier = "primary"
|
|
17
|
-
BlueprintIdentifier = "3847153A6E5EEFB86565BA840768F429"
|
|
18
|
-
BuildableName = "SDWebImage.framework"
|
|
19
|
-
BlueprintName = "SDWebImage"
|
|
20
|
-
ReferencedContainer = "container:Pods.xcodeproj">
|
|
21
|
-
</BuildableReference>
|
|
22
|
-
</BuildActionEntry>
|
|
23
|
-
</BuildActionEntries>
|
|
24
|
-
</BuildAction>
|
|
25
|
-
<TestAction
|
|
26
|
-
buildConfiguration = "Debug"
|
|
27
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
-
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
-
<Testables>
|
|
31
|
-
</Testables>
|
|
32
|
-
</TestAction>
|
|
33
|
-
<LaunchAction
|
|
34
|
-
buildConfiguration = "Debug"
|
|
35
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
36
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
37
|
-
launchStyle = "0"
|
|
38
|
-
useCustomWorkingDirectory = "NO"
|
|
39
|
-
ignoresPersistentStateOnLaunch = "NO"
|
|
40
|
-
debugDocumentVersioning = "YES"
|
|
41
|
-
debugServiceExtension = "internal"
|
|
42
|
-
allowLocationSimulation = "YES">
|
|
43
|
-
</LaunchAction>
|
|
44
|
-
<ProfileAction
|
|
45
|
-
buildConfiguration = "Release"
|
|
46
|
-
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
47
|
-
savedToolIdentifier = ""
|
|
48
|
-
useCustomWorkingDirectory = "NO"
|
|
49
|
-
debugDocumentVersioning = "YES">
|
|
50
|
-
</ProfileAction>
|
|
51
|
-
<AnalyzeAction
|
|
52
|
-
buildConfiguration = "Debug">
|
|
53
|
-
</AnalyzeAction>
|
|
54
|
-
<ArchiveAction
|
|
55
|
-
buildConfiguration = "Release"
|
|
56
|
-
revealArchiveInOrganizer = "YES">
|
|
57
|
-
</ArchiveAction>
|
|
58
|
-
</Scheme>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<Scheme
|
|
3
|
-
LastUpgradeVersion = "1600"
|
|
4
|
-
version = "1.3">
|
|
5
|
-
<BuildAction
|
|
6
|
-
parallelizeBuildables = "YES"
|
|
7
|
-
buildImplicitDependencies = "YES">
|
|
8
|
-
<BuildActionEntries>
|
|
9
|
-
<BuildActionEntry
|
|
10
|
-
buildForTesting = "YES"
|
|
11
|
-
buildForRunning = "YES"
|
|
12
|
-
buildForProfiling = "YES"
|
|
13
|
-
buildForArchiving = "YES"
|
|
14
|
-
buildForAnalyzing = "YES">
|
|
15
|
-
<BuildableReference
|
|
16
|
-
BuildableIdentifier = "primary"
|
|
17
|
-
BlueprintIdentifier = "92EBFA3E7005B4C18A9C0B44324EB80F"
|
|
18
|
-
BuildableName = "SDWebImageSwiftUI.framework"
|
|
19
|
-
BlueprintName = "SDWebImageSwiftUI"
|
|
20
|
-
ReferencedContainer = "container:Pods.xcodeproj">
|
|
21
|
-
</BuildableReference>
|
|
22
|
-
</BuildActionEntry>
|
|
23
|
-
</BuildActionEntries>
|
|
24
|
-
</BuildAction>
|
|
25
|
-
<TestAction
|
|
26
|
-
buildConfiguration = "Debug"
|
|
27
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
-
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
-
<Testables>
|
|
31
|
-
</Testables>
|
|
32
|
-
</TestAction>
|
|
33
|
-
<LaunchAction
|
|
34
|
-
buildConfiguration = "Debug"
|
|
35
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
36
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
37
|
-
launchStyle = "0"
|
|
38
|
-
useCustomWorkingDirectory = "NO"
|
|
39
|
-
ignoresPersistentStateOnLaunch = "NO"
|
|
40
|
-
debugDocumentVersioning = "YES"
|
|
41
|
-
debugServiceExtension = "internal"
|
|
42
|
-
allowLocationSimulation = "YES">
|
|
43
|
-
</LaunchAction>
|
|
44
|
-
<ProfileAction
|
|
45
|
-
buildConfiguration = "Release"
|
|
46
|
-
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
47
|
-
savedToolIdentifier = ""
|
|
48
|
-
useCustomWorkingDirectory = "NO"
|
|
49
|
-
debugDocumentVersioning = "YES">
|
|
50
|
-
</ProfileAction>
|
|
51
|
-
<AnalyzeAction
|
|
52
|
-
buildConfiguration = "Debug">
|
|
53
|
-
</AnalyzeAction>
|
|
54
|
-
<ArchiveAction
|
|
55
|
-
buildConfiguration = "Release"
|
|
56
|
-
revealArchiveInOrganizer = "YES">
|
|
57
|
-
</ArchiveAction>
|
|
58
|
-
</Scheme>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<Scheme
|
|
3
|
-
LastUpgradeVersion = "1600"
|
|
4
|
-
version = "1.3">
|
|
5
|
-
<BuildAction
|
|
6
|
-
parallelizeBuildables = "YES"
|
|
7
|
-
buildImplicitDependencies = "YES">
|
|
8
|
-
<BuildActionEntries>
|
|
9
|
-
<BuildActionEntry
|
|
10
|
-
buildForTesting = "YES"
|
|
11
|
-
buildForRunning = "YES"
|
|
12
|
-
buildForProfiling = "YES"
|
|
13
|
-
buildForArchiving = "YES"
|
|
14
|
-
buildForAnalyzing = "YES">
|
|
15
|
-
<BuildableReference
|
|
16
|
-
BuildableIdentifier = "primary"
|
|
17
|
-
BlueprintIdentifier = "6510766A9670BFA3B251E2A62446FC5D"
|
|
18
|
-
BuildableName = "SkeletonUI.framework"
|
|
19
|
-
BlueprintName = "SkeletonUI"
|
|
20
|
-
ReferencedContainer = "container:Pods.xcodeproj">
|
|
21
|
-
</BuildableReference>
|
|
22
|
-
</BuildActionEntry>
|
|
23
|
-
</BuildActionEntries>
|
|
24
|
-
</BuildAction>
|
|
25
|
-
<TestAction
|
|
26
|
-
buildConfiguration = "Debug"
|
|
27
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
-
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
-
<Testables>
|
|
31
|
-
</Testables>
|
|
32
|
-
</TestAction>
|
|
33
|
-
<LaunchAction
|
|
34
|
-
buildConfiguration = "Debug"
|
|
35
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
36
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
37
|
-
launchStyle = "0"
|
|
38
|
-
useCustomWorkingDirectory = "NO"
|
|
39
|
-
ignoresPersistentStateOnLaunch = "NO"
|
|
40
|
-
debugDocumentVersioning = "YES"
|
|
41
|
-
debugServiceExtension = "internal"
|
|
42
|
-
allowLocationSimulation = "YES">
|
|
43
|
-
</LaunchAction>
|
|
44
|
-
<ProfileAction
|
|
45
|
-
buildConfiguration = "Release"
|
|
46
|
-
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
47
|
-
savedToolIdentifier = ""
|
|
48
|
-
useCustomWorkingDirectory = "NO"
|
|
49
|
-
debugDocumentVersioning = "YES">
|
|
50
|
-
</ProfileAction>
|
|
51
|
-
<AnalyzeAction
|
|
52
|
-
buildConfiguration = "Debug">
|
|
53
|
-
</AnalyzeAction>
|
|
54
|
-
<ArchiveAction
|
|
55
|
-
buildConfiguration = "Release"
|
|
56
|
-
revealArchiveInOrganizer = "YES">
|
|
57
|
-
</ArchiveAction>
|
|
58
|
-
</Scheme>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<Scheme
|
|
3
|
-
LastUpgradeVersion = "1600"
|
|
4
|
-
version = "1.3">
|
|
5
|
-
<BuildAction
|
|
6
|
-
parallelizeBuildables = "YES"
|
|
7
|
-
buildImplicitDependencies = "YES">
|
|
8
|
-
<BuildActionEntries>
|
|
9
|
-
<BuildActionEntry
|
|
10
|
-
buildForTesting = "YES"
|
|
11
|
-
buildForRunning = "YES"
|
|
12
|
-
buildForProfiling = "YES"
|
|
13
|
-
buildForArchiving = "YES"
|
|
14
|
-
buildForAnalyzing = "YES">
|
|
15
|
-
<BuildableReference
|
|
16
|
-
BuildableIdentifier = "primary"
|
|
17
|
-
BlueprintIdentifier = "BF2A15FEC3F3424BBC4B9AD5F86F2D54"
|
|
18
|
-
BuildableName = "LottiePrivacyInfo.bundle"
|
|
19
|
-
BlueprintName = "lottie-ios-LottiePrivacyInfo"
|
|
20
|
-
ReferencedContainer = "container:Pods.xcodeproj">
|
|
21
|
-
</BuildableReference>
|
|
22
|
-
</BuildActionEntry>
|
|
23
|
-
</BuildActionEntries>
|
|
24
|
-
</BuildAction>
|
|
25
|
-
<TestAction
|
|
26
|
-
buildConfiguration = "Debug"
|
|
27
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
-
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
-
<Testables>
|
|
31
|
-
</Testables>
|
|
32
|
-
</TestAction>
|
|
33
|
-
<LaunchAction
|
|
34
|
-
buildConfiguration = "Debug"
|
|
35
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
36
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
37
|
-
launchStyle = "0"
|
|
38
|
-
useCustomWorkingDirectory = "NO"
|
|
39
|
-
ignoresPersistentStateOnLaunch = "NO"
|
|
40
|
-
debugDocumentVersioning = "YES"
|
|
41
|
-
debugServiceExtension = "internal"
|
|
42
|
-
allowLocationSimulation = "YES">
|
|
43
|
-
</LaunchAction>
|
|
44
|
-
<ProfileAction
|
|
45
|
-
buildConfiguration = "Release"
|
|
46
|
-
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
47
|
-
savedToolIdentifier = ""
|
|
48
|
-
useCustomWorkingDirectory = "NO"
|
|
49
|
-
debugDocumentVersioning = "YES">
|
|
50
|
-
</ProfileAction>
|
|
51
|
-
<AnalyzeAction
|
|
52
|
-
buildConfiguration = "Debug">
|
|
53
|
-
</AnalyzeAction>
|
|
54
|
-
<ArchiveAction
|
|
55
|
-
buildConfiguration = "Release"
|
|
56
|
-
revealArchiveInOrganizer = "YES">
|
|
57
|
-
</ArchiveAction>
|
|
58
|
-
</Scheme>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<Scheme
|
|
3
|
-
LastUpgradeVersion = "1600"
|
|
4
|
-
version = "1.3">
|
|
5
|
-
<BuildAction
|
|
6
|
-
parallelizeBuildables = "YES"
|
|
7
|
-
buildImplicitDependencies = "YES">
|
|
8
|
-
<BuildActionEntries>
|
|
9
|
-
<BuildActionEntry
|
|
10
|
-
buildForTesting = "YES"
|
|
11
|
-
buildForRunning = "YES"
|
|
12
|
-
buildForProfiling = "YES"
|
|
13
|
-
buildForArchiving = "YES"
|
|
14
|
-
buildForAnalyzing = "YES">
|
|
15
|
-
<BuildableReference
|
|
16
|
-
BuildableIdentifier = "primary"
|
|
17
|
-
BlueprintIdentifier = "0B967D7F8561D42493EE289EC8D450D1"
|
|
18
|
-
BuildableName = "Lottie.framework"
|
|
19
|
-
BlueprintName = "lottie-ios"
|
|
20
|
-
ReferencedContainer = "container:Pods.xcodeproj">
|
|
21
|
-
</BuildableReference>
|
|
22
|
-
</BuildActionEntry>
|
|
23
|
-
</BuildActionEntries>
|
|
24
|
-
</BuildAction>
|
|
25
|
-
<TestAction
|
|
26
|
-
buildConfiguration = "Debug"
|
|
27
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
-
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
-
<Testables>
|
|
31
|
-
</Testables>
|
|
32
|
-
</TestAction>
|
|
33
|
-
<LaunchAction
|
|
34
|
-
buildConfiguration = "Debug"
|
|
35
|
-
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
36
|
-
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
37
|
-
launchStyle = "0"
|
|
38
|
-
useCustomWorkingDirectory = "NO"
|
|
39
|
-
ignoresPersistentStateOnLaunch = "NO"
|
|
40
|
-
debugDocumentVersioning = "YES"
|
|
41
|
-
debugServiceExtension = "internal"
|
|
42
|
-
allowLocationSimulation = "YES">
|
|
43
|
-
</LaunchAction>
|
|
44
|
-
<ProfileAction
|
|
45
|
-
buildConfiguration = "Release"
|
|
46
|
-
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
47
|
-
savedToolIdentifier = ""
|
|
48
|
-
useCustomWorkingDirectory = "NO"
|
|
49
|
-
debugDocumentVersioning = "YES">
|
|
50
|
-
</ProfileAction>
|
|
51
|
-
<AnalyzeAction
|
|
52
|
-
buildConfiguration = "Debug">
|
|
53
|
-
</AnalyzeAction>
|
|
54
|
-
<ArchiveAction
|
|
55
|
-
buildConfiguration = "Release"
|
|
56
|
-
revealArchiveInOrganizer = "YES">
|
|
57
|
-
</ArchiveAction>
|
|
58
|
-
</Scheme>
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
-
<plist version="1.0">
|
|
4
|
-
<dict>
|
|
5
|
-
<key>SchemeUserState</key>
|
|
6
|
-
<dict>
|
|
7
|
-
<key>MoMoUIKits.xcscheme</key>
|
|
8
|
-
<dict>
|
|
9
|
-
<key>isShown</key>
|
|
10
|
-
<false />
|
|
11
|
-
<key>orderHint</key>
|
|
12
|
-
<integer>0</integer>
|
|
13
|
-
</dict>
|
|
14
|
-
<key>Pods-Example.xcscheme</key>
|
|
15
|
-
<dict>
|
|
16
|
-
<key>isShown</key>
|
|
17
|
-
<false />
|
|
18
|
-
<key>orderHint</key>
|
|
19
|
-
<integer>1</integer>
|
|
20
|
-
</dict>
|
|
21
|
-
<key>SDWebImage.xcscheme</key>
|
|
22
|
-
<dict>
|
|
23
|
-
<key>isShown</key>
|
|
24
|
-
<false />
|
|
25
|
-
<key>orderHint</key>
|
|
26
|
-
<integer>2</integer>
|
|
27
|
-
</dict>
|
|
28
|
-
<key>SDWebImageSwiftUI.xcscheme</key>
|
|
29
|
-
<dict>
|
|
30
|
-
<key>isShown</key>
|
|
31
|
-
<false />
|
|
32
|
-
<key>orderHint</key>
|
|
33
|
-
<integer>3</integer>
|
|
34
|
-
</dict>
|
|
35
|
-
<key>SkeletonUI.xcscheme</key>
|
|
36
|
-
<dict>
|
|
37
|
-
<key>isShown</key>
|
|
38
|
-
<false />
|
|
39
|
-
<key>orderHint</key>
|
|
40
|
-
<integer>4</integer>
|
|
41
|
-
</dict>
|
|
42
|
-
<key>lottie-ios-LottiePrivacyInfo.xcscheme</key>
|
|
43
|
-
<dict>
|
|
44
|
-
<key>isShown</key>
|
|
45
|
-
<false />
|
|
46
|
-
<key>orderHint</key>
|
|
47
|
-
<integer>5</integer>
|
|
48
|
-
</dict>
|
|
49
|
-
<key>lottie-ios.xcscheme</key>
|
|
50
|
-
<dict>
|
|
51
|
-
<key>isShown</key>
|
|
52
|
-
<false />
|
|
53
|
-
<key>orderHint</key>
|
|
54
|
-
<integer>6</integer>
|
|
55
|
-
</dict>
|
|
56
|
-
</dict>
|
|
57
|
-
<key>SuppressBuildableAutocreation</key>
|
|
58
|
-
<dict />
|
|
59
|
-
</dict>
|
|
60
|
-
</plist>
|
package/local.properties
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
## This file must *NOT* be checked into Version Control Systems,
|
|
2
|
-
# as it contains information specific to your local configuration.
|
|
3
|
-
#
|
|
4
|
-
# Location of the SDK. This is only used by Gradle.
|
|
5
|
-
# For customization when using a Version Control System, please read the
|
|
6
|
-
# header note.
|
|
7
|
-
#Tue Apr 08 11:13:31 ICT 2025
|
|
8
|
-
sdk.dir=/Users/sonnguyen/Library/Android/sdk
|