@momo-kits/native-kits 0.160.1-beta.2-debug → 0.160.1-beta.20-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 (33) hide show
  1. package/.claude/settings.local.json +5 -2
  2. package/compose/build.gradle.kts +5 -2
  3. package/compose/build.gradle.kts.backup +4 -1
  4. package/compose/compose.podspec +1 -1
  5. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +10 -1
  6. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +8 -11
  7. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +4 -3
  8. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +4 -0
  9. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +5 -1
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +5 -1
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +19 -14
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +17 -0
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +22 -10
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +1 -0
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +2 -2
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +57 -0
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +23 -1
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +16 -5
  19. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +19 -7
  20. package/gradle/libs.versions.toml +3 -1
  21. package/gradle.properties +1 -1
  22. package/ios/Input/Input.swift +33 -4
  23. package/local.properties +2 -2
  24. package/package.json +1 -1
  25. package/example/ios/Example.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  26. package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  27. package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -5
  28. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
  29. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
  30. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
  31. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
  32. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
  33. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +0 -46
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Bash(which glab:*)",
5
- "WebFetch(domain:gitlab.mservice.com.vn)"
4
+ "Bash(yarn react-native:*)",
5
+ "Read(//Users/phuc/.claude/skills/ai-skill-generator/**)",
6
+ "Bash(python3 scripts/install_skill.py --update)",
7
+ "Bash(cd /Users/phuc/momo-kits/.claude/skills/design-system-kits && mkdir -p .claude/skills/design-system-kits && mv SKILL.md README.md references .claude/skills/design-system-kits/)",
8
+ "Bash(mv .claude/skills/design-system-kits/* . && rmdir .claude/skills/design-system-kits && rmdir .claude/skills)"
6
9
  ]
7
10
  }
8
11
  }
@@ -30,7 +30,7 @@ kotlin {
30
30
  }
31
31
 
32
32
  val fwName = gitlabArtifactId
33
- val iosTargets = listOf(iosX64(), iosArm64(), iosSimulatorArm64())
33
+ val iosTargets = listOf(iosArm64(), iosSimulatorArm64())
34
34
  iosTargets.forEach {
35
35
  it.binaries.framework {
36
36
  baseName = fwName
@@ -40,7 +40,7 @@ kotlin {
40
40
  }
41
41
 
42
42
  cocoapods {
43
- version = "0.160.1-beta.2-debug"
43
+ version = "0.160.1-beta.20-debug"
44
44
  summary = "IOS Shared module"
45
45
  homepage = "https://momo.vn"
46
46
  ios.deploymentTarget = "15.0"
@@ -73,6 +73,9 @@ kotlin {
73
73
  implementation(libs.jetbrains.serialization.json)
74
74
  implementation(libs.kotlinx.datetime)
75
75
  api(libs.native.max.api)
76
+ // AI-GENERATED START: compottie multiplatform lottie engine for LottieEngine.Compose
77
+ implementation(libs.compottie)
78
+ // AI-GENERATED END: compottie multiplatform lottie engine for LottieEngine.Compose
76
79
  }
77
80
  androidMain.dependencies {
78
81
  implementation(libs.ktor.client.okhttp)
@@ -30,7 +30,7 @@ kotlin {
30
30
  }
31
31
 
32
32
  val fwName = gitlabArtifactId
33
- val iosTargets = listOf(iosX64(), iosArm64(), iosSimulatorArm64())
33
+ val iosTargets = listOf(iosArm64(), iosSimulatorArm64())
34
34
  iosTargets.forEach {
35
35
  it.binaries.framework {
36
36
  baseName = fwName
@@ -73,6 +73,9 @@ kotlin {
73
73
  implementation(libs.jetbrains.serialization.json)
74
74
  implementation(libs.kotlinx.datetime)
75
75
  api(libs.native.max.api)
76
+ // AI-GENERATED START: compottie multiplatform lottie engine for LottieEngine.Compose
77
+ implementation(libs.compottie)
78
+ // AI-GENERATED END: compottie multiplatform lottie engine for LottieEngine.Compose
76
79
  }
77
80
  androidMain.dependencies {
78
81
  implementation(libs.ktor.client.okhttp)
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |spec|
2
2
  spec.name = 'compose'
3
- spec.version = '0.159.1-beta.7'
3
+ spec.version = '0.159.1-beta.16'
4
4
  spec.homepage = 'https://momo.vn'
5
5
  spec.source = { :http=> ''}
6
6
  spec.authors = ''
@@ -70,15 +70,24 @@ actual fun getScreenHeight(): Dp {
70
70
  return getScreenDimensions().height.dp + if (getOSVersion() >= 35) 0.dp else AppStatusBar.current + AppNavigationBar.current
71
71
  }
72
72
 
73
- actual fun getOSVersion(): Int = Build.VERSION.SDK_INT
73
+ actual fun getOSVersion(): OSVersion = OSVersion.Android(sdk = Build.VERSION.SDK_INT)
74
74
 
75
75
  @Composable
76
76
  actual fun LottieAnimation(
77
77
  path: String,
78
78
  tintColor: Color?,
79
79
  bgColor: Color?,
80
+ placedAsOverlay: Boolean,
81
+ useCompose: Boolean,
80
82
  modifier: Modifier
81
83
  ) {
84
+ // AI-GENERATED START: dispatch to Compottie renderer when useCompose
85
+ if (useCompose) {
86
+ ComposeLottieAnimation(path, tintColor, bgColor, placedAsOverlay, modifier)
87
+ return
88
+ }
89
+ // AI-GENERATED END: dispatch to Compottie renderer when useCompose
90
+
82
91
  val json = readJson(path)
83
92
 
84
93
  if (json.isEmpty()) {
@@ -1,16 +1,12 @@
1
1
  package vn.momo.kits.application
2
2
 
3
- import androidx.compose.runtime.Composable
4
3
  import androidx.compose.runtime.Immutable
5
- import androidx.compose.runtime.ReadOnlyComposable
6
4
  import androidx.compose.runtime.staticCompositionLocalOf
7
5
  import vn.momo.kits.components.TrustBannerData
8
6
 
9
7
  @Immutable
10
8
  data class FeatureFlags(
11
- val isBaselineEnabled: Boolean? = false,
12
- val isWhiteList: Boolean? = false,
13
- val allowFontScale: Boolean? = true,
9
+ val showBaseLineDebug: Boolean? = false,
14
10
  )
15
11
 
16
12
  @Immutable
@@ -32,6 +28,7 @@ data class MiniAppContext(
32
28
  val providerId: String = "",
33
29
  val permissions: List<Map<String, Any>>? = emptyList(),
34
30
  val features: FeatureFlags? = null,
31
+ val scaleSizeMaxRate: Float? = null,
35
32
  ) {
36
33
  companion object {
37
34
 
@@ -63,6 +60,7 @@ data class MiniAppContext(
63
60
  providerId = parent.providerId.ifBlank { child.providerId },
64
61
  permissions = if (!parent.permissions.isNullOrEmpty()) parent.permissions else child.permissions,
65
62
  features = mergeFeatureFlags(parent.features, child.features),
63
+ scaleSizeMaxRate = parent.scaleSizeMaxRate ?: child.scaleSizeMaxRate,
66
64
  )
67
65
  }
68
66
 
@@ -76,7 +74,7 @@ data class MiniAppContext(
76
74
  if (child == null) return parent
77
75
 
78
76
  return FeatureFlags(
79
- isBaselineEnabled = parent.isBaselineEnabled ?: child.isBaselineEnabled
77
+ showBaseLineDebug = parent.showBaseLineDebug ?: child.showBaseLineDebug
80
78
  )
81
79
  }
82
80
  }
@@ -90,15 +88,12 @@ data class ComponentInformation(
90
88
  val action: String? = null
91
89
  )
92
90
 
91
+ var IsShowBaseLineDebug = false
92
+
93
93
  val ApplicationContext = staticCompositionLocalOf<MiniAppContext?> {
94
94
  null
95
95
  }
96
96
 
97
- val IsShowBaseLineDebug: Boolean
98
- @Composable
99
- @ReadOnlyComposable
100
- get() = ApplicationContext.current?.features?.isBaselineEnabled ?: false
101
-
102
97
  val AppConfig = staticCompositionLocalOf<KitConfig?> {
103
98
  null
104
99
  }
@@ -110,3 +105,5 @@ val AppLanguage = staticCompositionLocalOf<String?> {
110
105
  val LocalComponentInformation = staticCompositionLocalOf<ComponentInformation?> {
111
106
  null
112
107
  }
108
+
109
+ val ScaleSizeMaxRate = staticCompositionLocalOf<Float?> { null }
@@ -59,8 +59,9 @@ import vn.momo.kits.modifier.DeprecatedModifier
59
59
  import vn.momo.kits.modifier.conditional
60
60
  import vn.momo.kits.modifier.shadow
61
61
  import vn.momo.kits.navigation.component.SnackBar
62
- import vn.momo.kits.platform.getOSVersion
62
+ import vn.momo.kits.platform.supportsImePadding
63
63
  import vn.momo.kits.utils.getAppStatusBarHeight
64
+ import vn.momo.kits.utils.getNavigationBarHeight
64
65
 
65
66
  enum class HeaderType {
66
67
  DEFAULT,
@@ -102,7 +103,7 @@ fun Screen(
102
103
  val keyboardController = LocalSoftwareKeyboardController.current
103
104
 
104
105
  val isKeyboardVisible = isKeyboardVisible()
105
- val indicator = getAppStatusBarHeight()
106
+ val indicator = getNavigationBarHeight()
106
107
  val bottomPadding = if (isKeyboardVisible) 0.dp else indicator
107
108
 
108
109
  val headerHeight = if (animatedHeader !== null)
@@ -134,7 +135,7 @@ fun Screen(
134
135
  Box(
135
136
  Modifier.fillMaxSize()
136
137
  .background(backgroundColor ?: AppTheme.current.colors.background.default)
137
- .conditional(useAvoidKeyboard && getOSVersion() > 29) {
138
+ .conditional(useAvoidKeyboard && supportsImePadding()) {
138
139
  imePadding()
139
140
  }.then(DeprecatedModifier())
140
141
  ) {
@@ -21,6 +21,10 @@ import androidx.compose.ui.graphics.Color
21
21
  import androidx.compose.ui.graphics.PathEffect
22
22
  import androidx.compose.ui.graphics.StrokeCap
23
23
  import androidx.compose.ui.unit.dp
24
+ import io.ktor.util.Platform
25
+ import vn.momo.kits.application.IsShowBaseLineDebug
26
+ import vn.momo.kits.const.Colors
27
+ import vn.momo.kits.modifier.conditional
24
28
  import vn.momo.kits.platform.getPlatformName
25
29
  import vn.momo.kits.platform.getStatusBarHeight
26
30
 
@@ -221,6 +221,7 @@ fun Input(
221
221
  onBlur: () -> Unit = {},
222
222
  loading: Boolean = false,
223
223
  required: Boolean = false,
224
+ maxLength: Int? = null,
224
225
  fontWeight: InputFontWeight = InputFontWeight.REGULAR,
225
226
  keyboardType: KeyboardType = KeyboardType.Text,
226
227
  modifier: Modifier = Modifier,
@@ -319,7 +320,10 @@ fun Input(
319
320
  onBlur()
320
321
  }
321
322
  },
322
- onValueChange = onChangeText,
323
+ onValueChange = { newText ->
324
+ val limitedText = maxLength?.let { newText.take(it) } ?: newText
325
+ onChangeText(limitedText)
326
+ },
323
327
  decorationBox = { innerTextField ->
324
328
  // Floating label
325
329
  if (floatingValue.isNotEmpty() || floatingIcon.isNotEmpty()) {
@@ -8,6 +8,7 @@ import androidx.compose.animation.core.rememberInfiniteTransition
8
8
  import androidx.compose.animation.core.tween
9
9
  import androidx.compose.foundation.background
10
10
  import androidx.compose.foundation.border
11
+ import androidx.compose.ui.draw.alpha
11
12
  import androidx.compose.foundation.clickable
12
13
  import androidx.compose.foundation.layout.Arrangement
13
14
  import androidx.compose.foundation.layout.Box
@@ -129,8 +130,11 @@ fun InputOTP(
129
130
  if (!it.isFocused && isBlurred) onBlur()
130
131
  if (it.isFocused && !isBlurred) isBlurred = true
131
132
  },
132
- decorationBox = { _ ->
133
+ decorationBox = { innerTextField ->
133
134
  Box {
135
+ Box(
136
+ modifier = Modifier.fillMaxWidth().height(56.dp).alpha(0f)
137
+ ) { innerTextField() }
134
138
  if (floatingValue.isNotEmpty()) {
135
139
  Box(
136
140
  modifier = Modifier.wrapContentSize()
@@ -105,6 +105,8 @@ data class InputSearchProps(
105
105
  val iconModifier: Modifier = Modifier,
106
106
  val onClearPress: () -> Unit = {},
107
107
  val leftPosition: Dp? = null,
108
+ val placeholderCustomRender: (@Composable () -> Unit)? = null,
109
+ val searchIcon: (@Composable () -> Unit)? = null
108
110
  )
109
111
 
110
112
  @Composable
@@ -145,12 +147,13 @@ fun InputSearch(
145
147
  )
146
148
  }
147
149
 
148
- Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier
149
- .fillMaxWidth()
150
- .height(36.dp)
151
- .conditional(IsShowBaseLineDebug) {
152
- border(1.dp, Colors.blue_03)
153
- }
150
+ Row(
151
+ verticalAlignment = Alignment.CenterVertically, modifier = Modifier
152
+ .fillMaxWidth()
153
+ .height(36.dp)
154
+ .conditional(IsShowBaseLineDebug) {
155
+ border(1.dp, Colors.blue_03)
156
+ }
154
157
  ) {
155
158
  BasicTextField(
156
159
  enabled = !inputSearchProps.disabled,
@@ -184,13 +187,14 @@ fun InputSearch(
184
187
  horizontalArrangement = Arrangement.Start,
185
188
  verticalAlignment = Alignment.CenterVertically
186
189
  ) {
190
+
187
191
  Row(
188
192
  modifier = Modifier.padding(
189
193
  horizontal = Spacing.M
190
194
  ),
191
195
  verticalAlignment = Alignment.CenterVertically
192
196
  ) {
193
- Icon(
197
+ inputSearchProps.searchIcon?.invoke() ?: Icon(
194
198
  source = "navigation_search",
195
199
  modifier = Modifier.padding(end = Spacing.XS),
196
200
  size = 24.dp,
@@ -198,13 +202,14 @@ fun InputSearch(
198
202
  )
199
203
  Box(Modifier.weight(1f)) {
200
204
  if (inputSearchProps.text.value.isEmpty()) {
201
- Text(
202
- text = inputSearchProps.placeholder,
203
- style = placeHolderStyle,
204
- maxLines = 1,
205
- color = placeholderColor,
206
- overflow = TextOverflow.Ellipsis
207
- )
205
+ inputSearchProps.placeholderCustomRender?.invoke()
206
+ ?: Text(
207
+ text = inputSearchProps.placeholder,
208
+ style = placeHolderStyle,
209
+ maxLines = 1,
210
+ color = placeholderColor,
211
+ overflow = TextOverflow.Ellipsis
212
+ )
208
213
  }
209
214
  innerTextField()
210
215
  }
@@ -0,0 +1,17 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.runtime.Composable
4
+ import androidx.compose.runtime.CompositionLocalProvider
5
+ import vn.momo.kits.application.ScaleSizeMaxRate
6
+
7
+ @Composable
8
+ fun ScaleSizeScope(
9
+ scaleSizeMaxRate: Float? = null,
10
+ content: @Composable () -> Unit
11
+ ) {
12
+ CompositionLocalProvider(
13
+ ScaleSizeMaxRate provides scaleSizeMaxRate,
14
+ ) {
15
+ content()
16
+ }
17
+ }
@@ -15,7 +15,7 @@ import androidx.compose.ui.unit.sp
15
15
  import org.jetbrains.compose.resources.Font
16
16
  import org.jetbrains.compose.resources.FontResource
17
17
  import org.jetbrains.compose.resources.InternalResourceApi
18
- import vn.momo.kits.application.ApplicationContext
18
+ import vn.momo.kits.application.ScaleSizeMaxRate
19
19
  import vn.momo.kits.platform.getScreenDimensions
20
20
  import vn.momo.uikits.resources.Res
21
21
  import vn.momo.uikits.resources.momosignature
@@ -33,22 +33,34 @@ import kotlin.math.max
33
33
  import kotlin.math.min
34
34
 
35
35
  const val DEFAULT_SCREEN_SIZE = 375f
36
- const val MAX_FONT_SCALE = 1.2f
36
+ const val MAX_FONT_SCALE = 1.5f
37
+ const val MAX_DEVICE_SCALE = 5
37
38
 
38
39
  @Composable
39
40
  fun scaleSize(size: Float): Float {
40
- val allowFontScale = ApplicationContext.current?.features?.allowFontScale ?: true
41
- if (!allowFontScale) return size
42
-
41
+ val scaleSizeMaxRate: Float = ScaleSizeMaxRate.current ?: MAX_FONT_SCALE
43
42
  val deviceWidth = getScreenDimensions().width
44
43
  val deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE
45
- val fontScale = LocalDensity.current.fontScale
46
44
 
47
- val maxSize = size * MAX_FONT_SCALE
48
- val fontSizeScaleDevice = if (deviceScale > 1) deviceScale * size else size
49
- val fontSizeScaleOS = if (fontScale > 1) fontScale * size else size
45
+ val density = LocalDensity.current
46
+ val fontScale = density.fontScale
47
+
48
+ var fontSizeScaleDevice = size
49
+ var fontSizeScaleOS = size
50
50
 
51
- return min(max(fontSizeScaleDevice, fontSizeScaleOS), maxSize)
51
+ if (deviceScale > 1) {
52
+ fontSizeScaleDevice =
53
+ min(deviceScale * fontSizeScaleDevice, fontSizeScaleDevice + MAX_DEVICE_SCALE)
54
+ }
55
+
56
+ if (fontScale > 1) {
57
+ fontSizeScaleOS = min(fontScale * fontSizeScaleOS, fontSizeScaleOS * scaleSizeMaxRate)
58
+ }
59
+
60
+ return max(
61
+ fontSizeScaleDevice,
62
+ fontSizeScaleOS
63
+ )
52
64
  }
53
65
 
54
66
  @Composable
@@ -61,6 +61,7 @@ fun NavigationContainer(
61
61
  ApplicationContext provides mergedContext,
62
62
  AppConfig provides config,
63
63
  AppLanguage provides language,
64
+ ScaleSizeMaxRate provides mergedContext?.scaleSizeMaxRate,
64
65
  ) {
65
66
  LaunchedEffect(Unit) {
66
67
  setNavigator?.invoke(navigator)
@@ -62,7 +62,7 @@ import vn.momo.kits.navigation.component.HeaderRight
62
62
  import vn.momo.kits.navigation.component.HeaderType
63
63
  import vn.momo.kits.navigation.component.InputSearchType
64
64
  import vn.momo.kits.platform.BackHandler
65
- import vn.momo.kits.platform.getOSVersion
65
+ import vn.momo.kits.platform.supportsImePadding
66
66
  import vn.momo.kits.navigation.tracking.ScreenTracker
67
67
  import vn.momo.kits.navigation.tracking.ScreenTrackingState
68
68
  import kotlinx.coroutines.delay
@@ -166,7 +166,7 @@ internal fun StackScreen(
166
166
  .conditional(options.keyboardOptions.keyboardShouldPersistTaps) {
167
167
  hideKeyboardOnTap()
168
168
  }
169
- .conditional(options.keyboardOptions.useAvoidKeyboard && getOSVersion() > 29) {
169
+ .conditional(options.keyboardOptions.useAvoidKeyboard && supportsImePadding()) {
170
170
  imePadding()
171
171
  }
172
172
  ) {
@@ -0,0 +1,57 @@
1
+ /*
2
+ File: compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt
3
+ Created At: 2026-05-25 11:30:00 +07:00
4
+ Created By: AI
5
+ AI Agent: Claude Code
6
+ Model: claude-opus-4-7
7
+ */
8
+ package vn.momo.kits.platform
9
+
10
+ import androidx.compose.foundation.Image
11
+ import androidx.compose.foundation.background
12
+ import androidx.compose.foundation.layout.Box
13
+ import androidx.compose.foundation.layout.fillMaxSize
14
+ import androidx.compose.runtime.Composable
15
+ import androidx.compose.runtime.getValue
16
+ import androidx.compose.ui.Modifier
17
+ import androidx.compose.ui.graphics.Color
18
+ import androidx.compose.ui.graphics.ColorFilter
19
+ import io.github.alexzhirkevich.compottie.Compottie
20
+ import io.github.alexzhirkevich.compottie.LottieCompositionSpec
21
+ import io.github.alexzhirkevich.compottie.rememberLottieComposition
22
+ import io.github.alexzhirkevich.compottie.rememberLottiePainter
23
+ import vn.momo.kits.utils.readJson
24
+
25
+ // AI-GENERATED START: internal compottie renderer used when LottieEngine.Compose is selected
26
+ @Composable
27
+ internal fun ComposeLottieAnimation(
28
+ path: String,
29
+ tintColor: Color?,
30
+ bgColor: Color?,
31
+ @Suppress("UNUSED_PARAMETER") placedAsOverlay: Boolean,
32
+ modifier: Modifier,
33
+ ) {
34
+ val json = readJson(path)
35
+
36
+ if (json.isEmpty()) {
37
+ Box(modifier.background(bgColor ?: Color.Transparent))
38
+ return
39
+ }
40
+
41
+ val composition by rememberLottieComposition {
42
+ LottieCompositionSpec.JsonString(json)
43
+ }
44
+
45
+ Box(modifier.background(bgColor ?: Color.Transparent)) {
46
+ Image(
47
+ painter = rememberLottiePainter(
48
+ composition = composition,
49
+ iterations = Compottie.IterateForever,
50
+ ),
51
+ contentDescription = null,
52
+ colorFilter = tintColor?.let { ColorFilter.tint(it) },
53
+ modifier = Modifier.fillMaxSize(),
54
+ )
55
+ }
56
+ }
57
+ // AI-GENERATED END: internal compottie renderer used when LottieEngine.Compose is selected
@@ -30,15 +30,37 @@ expect fun ProvideNavigationEventDispatcherOwner(content: @Composable () -> Unit
30
30
  @Composable
31
31
  expect fun getScreenHeight(): Dp
32
32
 
33
- expect fun getOSVersion(): Int
33
+ sealed interface OSVersion {
34
+ val value: Int
35
+ data class Android(val sdk: Int) : OSVersion { override val value: Int get() = sdk }
36
+ data class IOS(val major: Int) : OSVersion { override val value: Int get() = major }
34
37
 
38
+ operator fun compareTo(other: Int): Int = value.compareTo(other)
39
+ }
40
+ expect fun getOSVersion(): OSVersion
41
+
42
+ fun supportsImePadding(): Boolean = when (val v = getOSVersion()) {
43
+ is OSVersion.Android -> v.sdk > 29
44
+ is OSVersion.IOS -> true
45
+ }
46
+
47
+ // AI-GENERATED START: useCompose flag to switch between native and Compose (compottie) renderer
48
+ /**
49
+ * @param useCompose when `true`, renders via the pure-Compose Compottie engine instead of the
50
+ * platform-native engine (airbnb-lottie on Android, lottie-ios on iOS). Defaults to `false` for
51
+ * backward compatibility. Note: `tintColor` becomes a single global `ColorFilter.tint` and
52
+ * `placedAsOverlay` is a no-op when `useCompose = true`.
53
+ */
35
54
  @Composable
36
55
  expect fun LottieAnimation(
37
56
  path: String,
38
57
  tintColor: Color? = null,
39
58
  bgColor: Color? = null,
59
+ placedAsOverlay: Boolean = false,
60
+ useCompose: Boolean = false,
40
61
  modifier: Modifier = Modifier
41
62
  )
63
+ // AI-GENERATED END: useCompose flag to switch between native and Compose (compottie) renderer
42
64
 
43
65
  expect fun NativePaint.setColor(
44
66
  color: Color = Color.Black
@@ -24,14 +24,25 @@ fun getResource(name: String): DrawableResource {
24
24
  @Composable
25
25
  fun readJson(name: String): String {
26
26
  val path = name.plus(".json")
27
+ // AI-GENERATED START: try raw path first (Android assets find it at the root), then fall
28
+ // back to the fully-qualified compose-resources path (iOS NSBundle needs the
29
+ // "composeResources/<package>/" prefix because DefaultIOsResourceReader prepends only
30
+ // "compose-resources/" to whatever path you pass).
31
+ val candidatePaths = listOf(
32
+ path,
33
+ "composeResources/vn.momo.compose.resources/$path",
34
+ )
35
+ // AI-GENERATED END
27
36
 
28
37
  val jsonContent by rememberState(path, { "" }) {
29
38
  val cached = resourceCache.getOrPut(path) {
30
- val content = try {
31
- readResourceBytes(path).decodeToString()
32
- } catch (_: Exception) {
33
- ""
34
- }
39
+ val content = candidatePaths.firstNotNullOfOrNull { candidate ->
40
+ try {
41
+ readResourceBytes(candidate).decodeToString()
42
+ } catch (_: Exception) {
43
+ null
44
+ }
45
+ }.orEmpty()
35
46
  ResourceCache.JSON(content)
36
47
  } as ResourceCache.JSON
37
48
 
@@ -12,17 +12,19 @@ import androidx.compose.runtime.getValue
12
12
  import androidx.compose.runtime.mutableStateOf
13
13
  import androidx.compose.runtime.remember
14
14
  import androidx.compose.runtime.setValue
15
+ import androidx.compose.ui.ExperimentalComposeUiApi
15
16
  import androidx.compose.ui.InternalComposeUiApi
16
17
  import androidx.compose.ui.Modifier
17
18
  import androidx.compose.ui.backhandler.LocalCompatNavigationEventDispatcherOwner
18
19
  import androidx.compose.ui.graphics.Color
19
20
  import androidx.compose.ui.graphics.NativePaint
20
21
  import androidx.compose.ui.graphics.toArgb
21
- import androidx.compose.ui.interop.UIKitView
22
22
  import androidx.compose.ui.semantics.SemanticsPropertyKey
23
23
  import androidx.compose.ui.semantics.semantics
24
24
  import androidx.compose.ui.unit.Dp
25
25
  import androidx.compose.ui.unit.dp
26
+ import androidx.compose.ui.viewinterop.UIKitInteropProperties
27
+ import androidx.compose.ui.viewinterop.UIKitView
26
28
  import cocoapods.lottie_ios.CompatibleAnimation
27
29
  import cocoapods.lottie_ios.CompatibleAnimationKeypath
28
30
  import cocoapods.lottie_ios.CompatibleAnimationView
@@ -85,18 +87,27 @@ actual fun getScreenHeight(): Dp {
85
87
  return getScreenDimensions().height.dp
86
88
  }
87
89
 
88
- actual fun getOSVersion(): Int {
89
- return UIDevice.currentDevice.systemVersion.substringBefore(".").toIntOrNull() ?: 0
90
- }
90
+ actual fun getOSVersion(): OSVersion = OSVersion.IOS(
91
+ major = UIDevice.currentDevice.systemVersion.substringBefore(".").toIntOrNull() ?: 0
92
+ )
91
93
 
92
- @OptIn(ExperimentalForeignApi::class)
94
+ @OptIn(ExperimentalForeignApi::class, ExperimentalComposeUiApi::class)
93
95
  @Composable
94
96
  actual fun LottieAnimation(
95
97
  path: String,
96
98
  tintColor: Color?,
97
99
  bgColor: Color?,
100
+ placedAsOverlay: Boolean,
101
+ useCompose: Boolean,
98
102
  modifier: Modifier
99
103
  ) {
104
+ // AI-GENERATED START: dispatch to Compottie renderer when useCompose
105
+ if (useCompose) {
106
+ ComposeLottieAnimation(path, tintColor, bgColor, placedAsOverlay, modifier)
107
+ return
108
+ }
109
+ // AI-GENERATED END: dispatch to Compottie renderer when useCompose
110
+
100
111
  var animation by remember { mutableStateOf<CompatibleAnimation?>(null) }
101
112
 
102
113
  LaunchedEffect(Unit) {
@@ -112,11 +123,12 @@ actual fun LottieAnimation(
112
123
  Box(modifier) {
113
124
  UIKitView(
114
125
  modifier = Modifier.fillMaxSize(),
126
+ properties = UIKitInteropProperties(placedAsOverlay = placedAsOverlay),
115
127
  factory = {
116
128
  CompatibleAnimationView(value).apply {
117
129
  translatesAutoresizingMaskIntoConstraints = true
118
130
 
119
- setBackgroundColor(bgColor?.toUIColor() ?: UIColor.whiteColor)
131
+ setBackgroundColor(bgColor?.toUIColor() ?: UIColor.clearColor)
120
132
 
121
133
  setLoopAnimationCount(-1.0)
122
134
  setAnimationSpeed(1.0)
@@ -137,7 +149,7 @@ actual fun LottieAnimation(
137
149
  },
138
150
 
139
151
  update = { view ->
140
- view.setBackgroundColor(bgColor?.toUIColor() ?: UIColor.whiteColor)
152
+ view.setBackgroundColor(bgColor?.toUIColor() ?: UIColor.clearColor)
141
153
 
142
154
  if (tintColor != null) {
143
155
  val uiColor = tintColor.toUIColor()
@@ -13,12 +13,13 @@ androidGradlePlugin = "8.13.2"
13
13
  r8 = "8.9.35"
14
14
  kotlinx-datetime = "0.7.1"
15
15
  airbnb-lottie = "5.2.0"
16
+ compottie = "2.2.0-beta01"
16
17
  androidx-activity = "1.9.1"
17
18
  androidx-appcompat = "1.7.0"
18
19
  material = "1.10.0"
19
20
  maxapi = "0.1.1"
20
21
  vanniktechMavenPublish = "0.34.0"
21
- kits = "0.160.1-beta.2"
22
+ kits = "0.159.1-beta.7"
22
23
  nativemaxapi = "0.0.6"
23
24
 
24
25
  [libraries]
@@ -38,6 +39,7 @@ coil-multiplatform-compose = { module = "io.coil-kt.coil3:coil-compose", version
38
39
  coil-multiplatform-network-ktor = { module = "io.coil-kt.coil3:coil-network-ktor3", version.ref = "coil3-multiplatform" }
39
40
  r8 = { module = "com.android.tools:r8", version.ref = "r8" }
40
41
  airbnb-lottie = { group = "com.airbnb.android", name = "lottie-compose", version.ref = "airbnb-lottie" }
42
+ compottie = { module = "io.github.alexzhirkevich:compottie", version.ref = "compottie" }
41
43
  native-max-api = { group = "vn.momo.maxapi", name = "NativeMaxApi", version.ref = "nativemaxapi" }
42
44
  kits = { module = "vn.momo.kits:kits", version.ref = "kits" }
43
45
  androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" }
package/gradle.properties CHANGED
@@ -18,7 +18,7 @@ kotlin.apple.xcodeCompatibility.nowarn=true
18
18
  name="ComposeKits"
19
19
  group=vn.momo.kits
20
20
  artifact.id=kits
21
- version=0.160.1-beta.2
21
+ version=0.160.1-beta.20
22
22
 
23
23
  repo=GitLab
24
24
  url=https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven
@@ -22,6 +22,7 @@ public struct Input: View {
22
22
  public var leadingIconColor: Color
23
23
  public var loading: Bool
24
24
  public var required: Bool
25
+ public var maxLength: Int?
25
26
  public var fontWeight: InputFontWeight
26
27
  public var keyboardType: UIKeyboardType
27
28
  public var autofocus: Bool
@@ -52,6 +53,7 @@ public struct Input: View {
52
53
  leadingIconColor: Color = Colors.black12,
53
54
  loading: Bool = false,
54
55
  required: Bool = false,
56
+ maxLength: Int? = nil,
55
57
  fontWeight: InputFontWeight = .regular,
56
58
  keyboardType: UIKeyboardType = .default,
57
59
  autofocus: Bool = false,
@@ -78,6 +80,7 @@ public struct Input: View {
78
80
  self.leadingIconColor = leadingIconColor
79
81
  self.loading = loading
80
82
  self.required = required
83
+ self.maxLength = maxLength
81
84
  self.fontWeight = fontWeight
82
85
  self.keyboardType = keyboardType
83
86
  self.autofocus = autofocus
@@ -93,10 +96,10 @@ public struct Input: View {
93
96
  get: { self.text },
94
97
  set: { newValue in
95
98
  self.text = newValue
96
- self.onChangeText?(newValue)
99
+ self.onChangeText?(limitText(newValue))
97
100
  }
98
101
  )
99
-
102
+
100
103
  VStack(alignment: .leading, spacing: 4) {
101
104
  ZStack(alignment: .topLeading) {
102
105
  // Floating label
@@ -142,6 +145,7 @@ public struct Input: View {
142
145
  fontWeight: fontWeight == .bold ? .bold : .regular,
143
146
  textColor: UIColor(getTextColor()),
144
147
  isDisabled: disabled || readOnly,
148
+ maxLength: maxLength,
145
149
  onFocusChange: { focused in
146
150
  handleFocusChange(focused)
147
151
  },
@@ -156,6 +160,12 @@ public struct Input: View {
156
160
  .foregroundColor(getTextColor())
157
161
  .disabled(disabled || readOnly)
158
162
  .applyPrimaryCursorColor()
163
+ .onChange(of: text) { newValue in
164
+ let limited = limitText(newValue)
165
+ if limited != newValue {
166
+ text = limited
167
+ }
168
+ }
159
169
  }
160
170
  }
161
171
 
@@ -239,6 +249,13 @@ public struct Input: View {
239
249
  isPasswordHidden.toggle()
240
250
  onRightIconPressed?()
241
251
  }
252
+
253
+ private func limitText(_ value: String) -> String {
254
+ guard let maxLength = maxLength else {
255
+ return value
256
+ }
257
+ return String(value.prefix(maxLength))
258
+ }
242
259
 
243
260
  private func borderColor() -> Color {
244
261
  if disabled {
@@ -279,6 +296,7 @@ private struct SecureInputField: UIViewRepresentable {
279
296
  var fontWeight: UIFont.Weight
280
297
  var textColor: UIColor
281
298
  var isDisabled: Bool
299
+ var maxLength: Int?
282
300
  var onFocusChange: (Bool) -> Void
283
301
  var onChangeText: ((String) -> Void)?
284
302
 
@@ -307,6 +325,7 @@ private struct SecureInputField: UIViewRepresentable {
307
325
  }
308
326
 
309
327
  func updateUIView(_ textField: UITextField, context: Context) {
328
+ context.coordinator.parent = self
310
329
  if textField.text != text {
311
330
  textField.text = text
312
331
  }
@@ -342,7 +361,7 @@ private struct SecureInputField: UIViewRepresentable {
342
361
  }
343
362
 
344
363
  func textFieldDidEndEditing(_ textField: UITextField) {
345
- parent.text = textField.text ?? ""
364
+ parent.text = limitText(textField.text ?? "")
346
365
  parent.onFocusChange(false)
347
366
  }
348
367
 
@@ -357,7 +376,10 @@ private struct SecureInputField: UIViewRepresentable {
357
376
 
358
377
  @objc func textFieldDidChange(_ textField: UITextField) {
359
378
  if isResettingText { return }
360
- let newText = textField.text ?? ""
379
+ let newText = limitText(textField.text ?? "")
380
+ if textField.text != newText {
381
+ textField.text = newText
382
+ }
361
383
  parent.text = newText
362
384
  parent.onChangeText?(newText)
363
385
  }
@@ -366,6 +388,13 @@ private struct SecureInputField: UIViewRepresentable {
366
388
  textField.resignFirstResponder()
367
389
  return true
368
390
  }
391
+
392
+ private func limitText(_ value: String) -> String {
393
+ guard let maxLength = parent.maxLength else {
394
+ return value
395
+ }
396
+ return String(value.prefix(maxLength))
397
+ }
369
398
  }
370
399
  }
371
400
 
package/local.properties CHANGED
@@ -4,5 +4,5 @@
4
4
  # Location of the SDK. This is only used by Gradle.
5
5
  # For customization when using a Version Control System, please read the
6
6
  # header note.
7
- #Wed Aug 21 14:20:12 ICT 2024
8
- sdk.dir=/Users/huynhdung/Library/Android/sdk
7
+ #Mon Dec 22 10:07:29 ICT 2025
8
+ sdk.dir=/Users/phuc/Library/Android/sdk
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momo-kits/native-kits",
3
- "version": "0.160.1-beta.2-debug",
3
+ "version": "0.160.1-beta.20-debug",
4
4
  "private": false,
5
5
  "dependencies": {},
6
6
  "devDependencies": {},
@@ -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_^#shared#^_</key>
8
- <dict>
9
- <key>orderHint</key>
10
- <integer>0</integer>
11
- </dict>
12
- </dict>
13
- </dict>
14
- </plist>
@@ -1,5 +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
- </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,46 +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
- </dict>
43
- <key>SuppressBuildableAutocreation</key>
44
- <dict />
45
- </dict>
46
- </plist>