@momo-kits/native-kits 0.165.2-beta.2-debug → 0.167.1-beta-search.1-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 (39) hide show
  1. package/CLAUDE.md +7 -0
  2. package/compose/build.gradle.kts +1 -1
  3. package/compose/compose.podspec +1 -1
  4. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +3 -1
  5. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +6 -0
  6. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +1 -0
  7. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +2 -1
  8. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +37 -50
  9. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +30 -1
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +3 -1
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +10 -0
  12. package/gradle.properties +1 -1
  13. package/ios/Application/Navigation/Overplay/ModalScreen.swift +3 -0
  14. package/ios/Popup/PopupDisplay.swift +1 -0
  15. package/ios/Popup/PopupNotify.swift +8 -1
  16. package/ios/Popup/PopupPromotion.swift +3 -3
  17. package/ios/Typography/FontScale.swift +3 -3
  18. package/ios/native-kits.podspec +1 -1
  19. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  20. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +1 -0
  21. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +1 -0
  22. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +2 -2
  23. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +2 -0
  24. package/local.properties +2 -2
  25. package/package.json +6 -6
  26. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +0 -32
  27. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  28. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  29. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +0 -16
  30. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
  31. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -5
  32. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
  33. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
  34. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
  35. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
  36. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
  37. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +0 -58
  38. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +0 -58
  39. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +0 -60
package/CLAUDE.md CHANGED
@@ -97,3 +97,10 @@ Prefer one tight line at the surprising spot over a paragraph. Match the (low) c
97
97
  - **Resource qualifier drift:** the generated Compose `Res` namespace is `vn.momo.uikits.resources`, but `utils/Resources.kt` and `platform/Platform.ios.kt` reference `vn.momo.compose.resources`. Keep bundled strings/dictionaries as plain Kotlin (the `defaultLanguage` map in `Localize.kt`), not `composeResources/values`, to avoid iOS framework resource-loading issues.
98
98
  - Prefer `NavigationContainer` over the deprecated `ApplicationContainer`; prefer `IMaxApi`/`LocalMaxApi` over the deprecated `PlatformApi`.
99
99
  - iOS strings/maps must survive Kotlin/Native framework packaging — keep them compiled-in, not loaded from resource bundles.
100
+
101
+ ## Code comments
102
+ - Only comment when necessary: non-obvious logic, workarounds, or the "why" behind a decision.
103
+ - Don't comment on what the code already says clearly (no "// increment i", no restating function names).
104
+ - Keep comments short: one line when possible, plain and easy to understand.
105
+ - No long comment blocks, no line-by-line narration, no lines that overflow the editor width.
106
+ - Don't leave comments about the change itself (e.g. "// updated this", "// new logic").
@@ -40,7 +40,7 @@ kotlin {
40
40
  }
41
41
 
42
42
  cocoapods {
43
- version = "0.165.2-beta.2-debug"
43
+ version = "0.167.1-beta-search.1-debug"
44
44
  summary = "IOS Shared module"
45
45
  homepage = "https://momo.vn"
46
46
  ios.deploymentTarget = "15.0"
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |spec|
2
2
  spec.name = 'compose'
3
- spec.version = '0.165.2-beta.2-debug'
3
+ spec.version = '0.167.1-beta-search.1-debug'
4
4
  spec.homepage = 'https://momo.vn'
5
5
  spec.source = { :http=> ''}
6
6
  spec.authors = ''
@@ -47,6 +47,7 @@ import vn.momo.kits.modifier.setAutomationId
47
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
+ import vn.momo.kits.utils.horizontalSafeAreaPadding
50
51
  import kotlin.math.max
51
52
  import kotlin.math.roundToInt
52
53
 
@@ -116,7 +117,8 @@ fun LiteScreen(
116
117
  scrollState = finalScrollState,
117
118
  modifier = Modifier
118
119
  .fillMaxSize()
119
- .hideKeyboardOnTap(),
120
+ .hideKeyboardOnTap()
121
+ .horizontalSafeAreaPadding(),
120
122
  contentModifier = contentModifier,
121
123
  verticalArrangement = verticalArrangement,
122
124
  horizontalAlignment = horizontalAlignment,
@@ -20,6 +20,7 @@ import vn.momo.kits.application.LocalLocalize
20
20
  import vn.momo.kits.const.*
21
21
  import vn.momo.kits.modifier.conditional
22
22
  import vn.momo.kits.modifier.setAutomationId
23
+ import vn.momo.kits.platform.getScreenDimensions
23
24
  import kotlin.math.min
24
25
 
25
26
  data class PopupAction(
@@ -33,6 +34,10 @@ enum class PopupActionDirection {
33
34
  AUTO
34
35
  }
35
36
 
37
+ // Portrait width in landscape too, so aspect-ratio images don't push popups past the screen height.
38
+ @Composable
39
+ internal fun popupMaxWidth(): Dp = getScreenDimensions().let { minOf(it.width, it.height) }.dp
40
+
36
41
  private fun heightForLines(
37
42
  layout: TextLayoutResult,
38
43
  ): Float {
@@ -129,6 +134,7 @@ fun PopupNotify(
129
134
  ) {
130
135
  Column(
131
136
  modifier = Modifier
137
+ .widthIn(max = popupMaxWidth())
132
138
  .fillMaxWidth()
133
139
  .padding(horizontal = 12.dp)
134
140
  .clip(RoundedCornerShape(Radius.L))
@@ -29,6 +29,7 @@ fun PopupPromotion(
29
29
  onClose: (() -> Unit) = {},
30
30
  ) {
31
31
  Column(Modifier
32
+ .widthIn(max = popupMaxWidth())
32
33
  .padding(horizontal = Spacing.M)
33
34
  .conditional(IsShowBaseLineDebug) {
34
35
  border(1.dp, Colors.blue_03)
@@ -26,7 +26,8 @@ fun scaleSize(size: Float): Float {
26
26
  return size * (context?.userScaleRate ?: KitFontScale.userScaleRate)
27
27
  }
28
28
  val scaleSizeMaxRate: Float = MAX_FONT_SCALE
29
- val deviceWidth = getScreenDimensions().width
29
+ // Short side, not width: landscape must not inflate every font.
30
+ val deviceWidth = getScreenDimensions().let { minOf(it.width, it.height) }
30
31
  val deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE
31
32
 
32
33
  val density = LocalDensity.current
@@ -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
@@ -71,6 +73,7 @@ import vn.momo.kits.navigation.tracking.ScreenTracker
71
73
  import vn.momo.kits.navigation.tracking.ScreenTrackingState
72
74
  import kotlinx.coroutines.delay
73
75
  import vn.momo.kits.application.LocalContext
76
+ import vn.momo.kits.utils.horizontalSafeAreaPadding
74
77
  import kotlin.time.Clock
75
78
  import kotlin.time.Duration.Companion.milliseconds
76
79
  import kotlin.time.ExperimentalTime
@@ -154,13 +157,15 @@ internal fun StackScreen(
154
157
  }
155
158
 
156
159
  val limit = with(density) {
157
- (statusBar).toPx() + HEADER_HEIGHT
160
+ (statusBar + HEADER_HEIGHT.dp).toPx()
158
161
  }.toInt()
159
162
 
160
- val (scrollState, scrollInProcess) = if (options.scrollData.scrollState is LazyListState)
161
- (options.scrollData.scrollState as? LazyListState ?: rememberLazyListState()).proxyScrollState(limit, 15)
163
+ val lazyListState = options.scrollData.scrollState as? LazyListState
164
+ val (scrollState, _) = if (lazyListState != null)
165
+ lazyListState.proxyScrollState(limit, 1)
162
166
  else
163
- (options.scrollData.scrollState as? ScrollState ?: rememberScrollState()).proxyLimitedScrollState(limit, 15)
167
+ (options.scrollData.scrollState as? ScrollState ?: rememberScrollState()).proxyLimitedScrollState(limit, 1)
168
+ val snapState: ScrollableState = lazyListState ?: scrollState
164
169
 
165
170
  val footerHeightPx = remember { mutableIntStateOf(0) }
166
171
  val headerRightWidthPx = remember { mutableIntStateOf(0) }
@@ -204,16 +209,16 @@ internal fun StackScreen(
204
209
  Header(onBackHandler)
205
210
  }
206
211
 
207
- Column(Modifier.zIndex(5f)) {
208
- SearchAnimated(isScrollInProgress = scrollInProcess)
212
+ Column(Modifier.zIndex(5f).horizontalSafeAreaPadding()) {
213
+ SearchAnimated(snapState = snapState)
209
214
  }
210
215
 
211
- Column(Modifier.zIndex(2f).fillMaxSize()) {
216
+ Column(Modifier.zIndex(2f).fillMaxSize().horizontalSafeAreaPadding()) {
212
217
  MainContent(content = content, isBottomTabRoot = isBottomTabRoot, isBottomTabChild = isBottomTabChild)
213
218
  FooterContent()
214
219
  }
215
220
 
216
- Box(Modifier.zIndex(6f)) {
221
+ Box(Modifier.zIndex(6f).horizontalSafeAreaPadding()) {
217
222
  FloatingContent(isBottomTabChild = isBottomTabChild)
218
223
  }
219
224
 
@@ -269,11 +274,7 @@ internal fun ColumnScope.MainContent(content: @Composable () -> Unit, isBottomTa
269
274
  if (inputSearchType == InputSearchType.Animated) {
270
275
  val scrollDp = with(density) { scrollState.value.toDp() }
271
276
 
272
- val animatedTopPadding by animateDpAsState(
273
- targetValue = (HEADER_HEIGHT.dp - scrollDp).coerceIn(0.dp, HEADER_HEIGHT.dp),
274
- label = "AnimatedTopPadding"
275
- )
276
- Spacer(Modifier.height(animatedTopPadding))
277
+ Spacer(Modifier.height((HEADER_HEIGHT.dp - scrollDp).coerceIn(0.dp, HEADER_HEIGHT.dp)))
277
278
  }
278
279
  Column(
279
280
  Modifier
@@ -413,7 +414,7 @@ data class InputSearchLayoutParams(
413
414
  @Suppress("FrequentlyChangingValue")
414
415
  @Composable
415
416
  internal fun SearchAnimated(
416
- isScrollInProgress: Boolean
417
+ snapState: ScrollableState
417
418
  ) {
418
419
  val scrollState = LocalScrollState.current
419
420
  val options = LocalOptions.current
@@ -453,44 +454,24 @@ internal fun SearchAnimated(
453
454
  }
454
455
 
455
456
  InputSearchType.Animated -> {
456
- val animatedTopPadding by animateDpAsState(
457
- targetValue = (maxTopPadding - scrollDp).coerceIn(minTopPadding, maxTopPadding),
458
- label = "AnimatedTopPadding"
459
- )
460
-
461
- val animatedStartPadding by animateDpAsState(
462
- targetValue = (minStartPadding + scrollDp).coerceIn(minStartPadding, maxStartPadding),
463
- label = "AnimatedStartPadding"
464
- )
465
-
466
- val animatedEndPadding by animateDpAsState(
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
- }
457
+ val collapsePx = with(density) { HEADER_HEIGHT.dp.roundToPx() }
458
+ val progress = (scrollState.value / collapsePx.toFloat()).coerceIn(0f, 1f)
459
+
460
+ LaunchedEffect(snapState, collapsePx) {
461
+ snapshotFlow { snapState.isScrollInProgress }
462
+ .filter { !it }
463
+ .collect {
464
+ val offset = snapState.headerOffsetPx() ?: return@collect
465
+ if (offset <= 0 || offset >= collapsePx) return@collect
466
+ val target = if (offset < collapsePx / 2) 0 else collapsePx
467
+ launch { snapState.animateScrollBy((target - offset).toFloat()) }
486
468
  }
487
- }
488
469
  }
489
470
 
490
471
  InputSearchLayoutParams(
491
- topPadding = animatedTopPadding,
492
- startPadding = animatedStartPadding,
493
- endPadding = animatedEndPadding
472
+ topPadding = lerp(maxTopPadding, minTopPadding, progress),
473
+ startPadding = lerp(minStartPadding, maxStartPadding, progress),
474
+ endPadding = lerp(minEndPadding, maxEndPadding, progress)
494
475
  )
495
476
  }
496
477
 
@@ -519,6 +500,12 @@ internal fun SearchAnimated(
519
500
  }
520
501
  }
521
502
 
503
+ private fun ScrollableState.headerOffsetPx(): Int? = when (this) {
504
+ is LazyListState -> if (firstVisibleItemIndex == 0) firstVisibleItemScrollOffset else null
505
+ is ScrollState -> value
506
+ else -> null
507
+ }
508
+
522
509
  private fun quantize(value: Int, stepPx: Int): Int {
523
510
  if (stepPx <= 1) return value
524
511
  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
@@ -43,6 +47,7 @@ import vn.momo.kits.navigation.LocalNavigator
43
47
  import vn.momo.kits.navigation.LocalOptions
44
48
  import vn.momo.kits.navigation.LocalScrollState
45
49
  import vn.momo.kits.navigation.getInputSearchType
50
+ import vn.momo.kits.utils.horizontalSafeAreaPadding
46
51
 
47
52
  @InternalApi
48
53
  const val HEADER_HEIGHT = 52
@@ -88,18 +93,42 @@ internal fun Header(onBackHandler: (() -> Unit)? = null) {
88
93
  // Centered title needs a full-width overlay to stay screen-centered, not boxed between back button and header right.
89
94
  val centerTitle = titlePosition == TitlePosition.CENTER && options.headerTitle is HeaderTitle.Default
90
95
 
96
+ val headerImage = AppTheme.current.assets.headerBackground
97
+ .takeUnless { options.headerType is HeaderType.Transparent }
98
+
91
99
  Box(
92
100
  Modifier.height(AppStatusBar.current + HEADER_HEIGHT.dp)
93
101
  .fillMaxWidth()
94
- .background(background.copy(alpha = animatedAlpha))
102
+ .conditional(headerImage.isNullOrEmpty()) {
103
+ background(background.copy(alpha = animatedAlpha))
104
+ }
95
105
  .conditional(IsShowBaseLineDebug) {
96
106
  border(1.dp, Colors.blue_03)
97
107
  },
98
108
  contentAlignment = Alignment.BottomCenter
99
109
  ) {
110
+ if (!headerImage.isNullOrEmpty()) {
111
+ Box(
112
+ Modifier
113
+ .matchParentSize()
114
+ .clipToBounds()
115
+ .graphicsLayer { alpha = animatedAlpha }
116
+ .background(background)
117
+ ) {
118
+ Image(
119
+ source = headerImage,
120
+ loading = false,
121
+ modifier = Modifier
122
+ .fillMaxWidth()
123
+ .wrapContentHeight(Alignment.Top, unbounded = true)
124
+ .height(HEADER_BACKGROUND_HEIGHT),
125
+ )
126
+ }
127
+ }
100
128
  Row(
101
129
  modifier = Modifier.height(HEADER_HEIGHT.dp)
102
130
  .fillMaxWidth()
131
+ .horizontalSafeAreaPadding()
103
132
  .padding(horizontal = Spacing.M),
104
133
  verticalAlignment = Alignment.CenterVertically,
105
134
  horizontalArrangement = Arrangement.SpaceBetween
@@ -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 = 154.dp
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
  )
@@ -1,6 +1,11 @@
1
1
  package vn.momo.kits.utils
2
2
 
3
3
  import androidx.compose.foundation.layout.WindowInsets
4
+ import androidx.compose.foundation.layout.WindowInsetsSides
5
+ import androidx.compose.foundation.layout.displayCutout
6
+ import androidx.compose.foundation.layout.only
7
+ import androidx.compose.foundation.layout.union
8
+ import androidx.compose.foundation.layout.windowInsetsPadding
4
9
  import androidx.compose.foundation.layout.asPaddingValues
5
10
  import androidx.compose.foundation.layout.systemBars
6
11
  import androidx.compose.runtime.Composable
@@ -90,6 +95,11 @@ fun getAppStatusBarHeight(): Dp {
90
95
  }
91
96
  }
92
97
 
98
+ // Left/right safe area like SwiftUI (landscape camera/notch); consumed, so nested StackScreens don't pad twice.
99
+ internal fun Modifier.horizontalSafeAreaPadding(): Modifier = composed {
100
+ windowInsetsPadding(WindowInsets.systemBars.union(WindowInsets.displayCutout).only(WindowInsetsSides.Horizontal))
101
+ }
102
+
93
103
  @Composable
94
104
  internal fun getNavigationBarHeight(): Dp {
95
105
  return if (AppNavigationBar.current == 0.dp) {
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.165.2-beta.2
21
+ version=0.167.1-beta-search.1
22
22
 
23
23
  repo=GitLab
24
24
  url=https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven
@@ -36,6 +36,9 @@ struct ModalScreen<Content: View>: View {
36
36
  .scaleEffect(contentScale)
37
37
  .opacity(contentOpacity)
38
38
  }
39
+ // Center on the full screen like Compose; landscape safe areas are asymmetric (camera on one side).
40
+ .frame(maxWidth: .infinity, maxHeight: .infinity)
41
+ .ignoresSafeArea(.container)
39
42
  .onAppear {
40
43
  guard !didAppear else { return }
41
44
  didAppear = true
@@ -196,6 +196,7 @@ public struct PopupDisplay: View {
196
196
  }
197
197
  }
198
198
  .background(Color.white.cornerRadius(15))
199
+ .frame(maxWidth: popupMaxWidth - 24)
199
200
  .padding(.horizontal, 12)
200
201
  .accessibilityElement(children: .ignore)
201
202
  .accessibility(identifier: "popup_notify")
@@ -3,6 +3,12 @@ import SwiftUI
3
3
 
4
4
  public typealias PopupActionDirection = PopupButtonDirection
5
5
 
6
+ // Portrait width in landscape too, so aspect-ratio images don't push popups past the screen height.
7
+ var popupMaxWidth: CGFloat {
8
+ let size = UIScreen.main.bounds.size
9
+ return min(size.width, size.height)
10
+ }
11
+
6
12
  public struct PopupNotifyProps {
7
13
  public var image: String
8
14
  public var title: String
@@ -108,9 +114,10 @@ public struct PopupNotify: View {
108
114
 
109
115
  if props.isShowCloseIcon {
110
116
  closeButton
111
- .offset(x: 1, y: -11)
117
+ .offset(x: 11, y: -11)
112
118
  }
113
119
  }
120
+ .frame(maxWidth: popupMaxWidth - Spacing.M * 2)
114
121
  .padding(.horizontal, Spacing.M)
115
122
  .accessibilityElement(children: .ignore)
116
123
  .accessibilityIdentifier("popup_notify")
@@ -22,7 +22,7 @@ public struct PopupPromotion: View {
22
22
  public var body: some View {
23
23
  VStack(spacing: 8) {
24
24
  if(imageUrl.isEmpty) {
25
- Icon(source: "media_fail", size: UIScreen.main.bounds.width - Spacing.XL * 2)
25
+ Icon(source: "media_fail", size: popupMaxWidth - Spacing.XL * 2)
26
26
  }
27
27
  else {
28
28
  WebImage(url: URL(string: imageUrl)!)
@@ -30,11 +30,11 @@ public struct PopupPromotion: View {
30
30
  .placeholder {
31
31
  Color.gray
32
32
  .aspectRatio(0.72, contentMode: .fit)
33
- .frame(maxWidth: UIScreen.main.bounds.width - Spacing.XL * 2)
33
+ .frame(maxWidth: popupMaxWidth - Spacing.XL * 2)
34
34
  .clipped()
35
35
  }
36
36
  .aspectRatio(0.72, contentMode: .fit)
37
- .frame(maxWidth: UIScreen.main.bounds.width - Spacing.XL * 2, alignment: .center)
37
+ .frame(maxWidth: popupMaxWidth - Spacing.XL * 2, alignment: .center)
38
38
  .clipped()
39
39
  .onTapGesture {
40
40
  onAction?()
@@ -30,9 +30,9 @@ public struct FontScale: Equatable {
30
30
  public func callAsFunction(_ size: CGFloat) -> CGFloat {
31
31
  guard useOSScaleRate else { return size * userScaleRate }
32
32
 
33
- // Device width is read live rather than snapshotted, matching Compose's
34
- // getScreenDimensions() read inside scaleSize(), so a rotation or split-view resize counts.
35
- let deviceScale = UIScreen.main.bounds.width / Self.defaultScreenSize
33
+ // Short side, not width: landscape must not inflate every font (and so every popup's height).
34
+ let bounds = UIScreen.main.bounds.size
35
+ let deviceScale = min(bounds.width, bounds.height) / Self.defaultScreenSize
36
36
 
37
37
  var deviceScaled = size
38
38
  var osScaled = size
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'MoMoUIKits'
3
- s.version = '0.165.2-beta.2'
3
+ s.version = '0.167.1-beta-search.1'
4
4
  s.summary = 'MoMoUIKits for iOS'
5
5
  s.homepage = 'https://momo.vn'
6
6
  s.license = { :type => 'MIT' }
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'MoMoUIKitsDemo'
3
- s.version = '0.165.2-beta.2'
3
+ s.version = '0.167.1-beta-search.1'
4
4
  s.summary = 'Demo browser for MoMoUIKits SwiftUI components'
5
5
  s.homepage = 'https://momo.vn'
6
6
  s.license = { :type => 'MIT' }
@@ -51,6 +51,7 @@ public let ScreenUsages: [ScreenUsage] = [
51
51
  ScreenUsage(title: "InputTextArea", destination: AnyView(InputTextAreaDemo()), icon: getIcon(icon: "FormInput"), hostsOwnChrome: true),
52
52
  ScreenUsage(title: "InputSearch", destination: AnyView(InputSearchDemo()), icon: getIcon(icon: "FormInput"), hostsOwnChrome: true),
53
53
  ScreenUsage(title: "PopupNotify", destination: AnyView(PopupNotifyDemo()), icon: getIcon(icon: "Popup"), hostsOwnChrome: true),
54
+ ScreenUsage(title: "PopupDisplay", destination: AnyView(PopupDisplayDemo()), icon: getIcon(icon: "Popup"), hostsOwnChrome: true),
54
55
  ScreenUsage(title: "PopupPromotion", destination: AnyView(PopupPromotionDemo()), icon: getIcon(icon: "Popup"), hostsOwnChrome: true),
55
56
  ScreenUsage(title: "SnackBar", destination: AnyView(SnackBarDemo()), icon: getIcon(icon: "Popup"), hostsOwnChrome: true),
56
57
  ScreenUsage(title: "Switch", destination: AnyView(SwitchDemo()), icon: getIcon(icon: "Toggle"), hostsOwnChrome: true),
@@ -160,6 +160,7 @@ private struct PopupDisplayDemoContent: View {
160
160
  errorCode: errorCode,
161
161
  isShowCloseIcon: showCloseIcon
162
162
  )
163
+ .padding(.horizontal, Spacing.M)
163
164
  }
164
165
  }
165
166
  }
@@ -26,7 +26,7 @@ private struct PopupNotifyPreview: View {
26
26
  private func show() {
27
27
  navigator.showModal {
28
28
  PopupNotify(props: PopupNotifyProps(
29
- image: "https://i.imgur.com/s70S9s9.png",
29
+ image: "https://static.momocdn.net/app/img/popup_permission/img_permission_popup_camera.png",
30
30
  title: "Title",
31
31
  description: "Check lại một nhịp auto chuyển sang dạng CTA.",
32
32
  error: "9004",
@@ -50,7 +50,7 @@ private let popupDirectionList: [PlaygroundOption] = [
50
50
  @available(iOS 16.0, *)
51
51
  private struct PopupNotifyPlayground: View {
52
52
  @EnvironmentObject private var navigator: Navigator
53
- @State private var image = "https://i.imgur.com/s70S9s9.png"
53
+ @State private var image = "https://static.momocdn.net/app/img/popup_permission/img_permission_popup_camera.png"
54
54
  @State private var title = "Title"
55
55
  @State private var description = "Check lại một nhịp auto chuyển sang dạng CTA."
56
56
  @State private var error = "9004"
@@ -37,6 +37,7 @@ private struct PopupPromotionPreview: View {
37
37
  private func show(_ url: String) {
38
38
  navigator.showModal {
39
39
  PopupPromotion(imageUrl: url, onIconClose: { navigator.hideOverplay() }, onAction: { navigator.hideOverplay() })
40
+ .padding(.horizontal, Spacing.M)
40
41
  }
41
42
  }
42
43
  }
@@ -62,6 +63,7 @@ private struct PopupPromotionPlayground: View {
62
63
  private func show() {
63
64
  navigator.showModal {
64
65
  PopupPromotion(imageUrl: imageUrl, onIconClose: { navigator.hideOverplay() }, onAction: { navigator.hideOverplay() })
66
+ .padding(.horizontal, Spacing.M)
65
67
  }
66
68
  }
67
69
  }
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
- #Tue Apr 08 11:13:31 ICT 2025
8
- sdk.dir=/Users/sonnguyen/Library/Android/sdk
7
+ #Tue Oct 06 18:08:41 GMT+07:00 2026
8
+ sdk.dir=/Users/vu.nguyen15/Library/Android/sdk
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "name": "@momo-kits/native-kits",
3
- "version": "0.165.2-beta.2-debug",
4
- "private": false,
5
- "dependeNavigationncies": {},
6
- "devDependencies": {},
7
- "license": "MoMo"
2
+ "name": "@momo-kits/native-kits",
3
+ "version": "0.167.1-beta-search.1-debug",
4
+ "private": false,
5
+ "dependeNavigationncies": {},
6
+ "devDependencies": {},
7
+ "license": "MoMo"
8
8
  }
@@ -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>
@@ -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,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Bucket
3
- uuid = "6B3C387A-E951-41D1-A42C-FB6E447A46BA"
4
- type = "0"
5
- version = "2.0">
6
- </Bucket>
@@ -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,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>