@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.
- package/CLAUDE.md +7 -0
- package/compose/build.gradle.kts +1 -1
- package/compose/compose.podspec +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +3 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +6 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +1 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +2 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +37 -50
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +30 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +3 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +10 -0
- package/gradle.properties +1 -1
- package/ios/Application/Navigation/Overplay/ModalScreen.swift +3 -0
- package/ios/Popup/PopupDisplay.swift +1 -0
- package/ios/Popup/PopupNotify.swift +8 -1
- package/ios/Popup/PopupPromotion.swift +3 -3
- package/ios/Typography/FontScale.swift +3 -3
- package/ios/native-kits.podspec +1 -1
- package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +1 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +1 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +2 -2
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +2 -0
- package/local.properties +2 -2
- package/package.json +6 -6
- 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/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").
|
package/compose/build.gradle.kts
CHANGED
package/compose/compose.podspec
CHANGED
|
@@ -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))
|
|
@@ -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
|
-
|
|
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()
|
|
160
|
+
(statusBar + HEADER_HEIGHT.dp).toPx()
|
|
158
161
|
}.toInt()
|
|
159
162
|
|
|
160
|
-
val
|
|
161
|
-
|
|
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,
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
}
|
|
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 =
|
|
492
|
-
startPadding =
|
|
493
|
-
endPadding =
|
|
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
|
-
.
|
|
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 =
|
|
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
|
@@ -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:
|
|
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:
|
|
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:
|
|
33
|
+
.frame(maxWidth: popupMaxWidth - Spacing.XL * 2)
|
|
34
34
|
.clipped()
|
|
35
35
|
}
|
|
36
36
|
.aspectRatio(0.72, contentMode: .fit)
|
|
37
|
-
.frame(maxWidth:
|
|
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
|
-
//
|
|
34
|
-
|
|
35
|
-
let deviceScale =
|
|
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
|
package/ios/native-kits.podspec
CHANGED
|
@@ -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),
|
|
@@ -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://
|
|
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://
|
|
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
|
|
8
|
-
sdk.dir=/Users/
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
}
|
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>
|