@momo-kits/native-kits 0.167.1-duo.18 → 0.167.1-duo.19-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 (163) hide show
  1. package/CLAUDE.md +5 -3
  2. package/build.gradle.kts +11 -0
  3. package/compose/build.gradle.kts +204 -0
  4. package/compose/build.gradle.kts.backup +204 -0
  5. package/compose/compose.podspec +47 -0
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +19 -0
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
  8. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +12 -0
  9. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +7 -0
  10. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +153 -0
  11. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/ReservedRegions.android.kt +6 -0
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +52 -0
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +124 -0
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +183 -0
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +207 -0
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +39 -0
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +293 -0
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +916 -0
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +110 -0
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +378 -0
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +56 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +81 -0
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +338 -0
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +175 -0
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +357 -0
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +115 -0
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +89 -0
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +128 -0
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +209 -0
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +542 -0
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +49 -0
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +86 -0
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +125 -0
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +231 -0
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +189 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +478 -0
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +114 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +265 -0
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +235 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +223 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +265 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +185 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +343 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +84 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +361 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +108 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +308 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +59 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +21 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +90 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +330 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +220 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +473 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +122 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +207 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +92 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +560 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +86 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +125 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +207 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +501 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +176 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +182 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +193 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +236 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +180 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +325 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +20 -0
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +18 -0
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +22 -0
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +194 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +283 -0
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +54 -0
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +50 -0
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +309 -0
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +41 -0
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +52 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +66 -0
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +104 -0
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +48 -0
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +338 -0
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +58 -0
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +137 -0
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +116 -0
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +205 -0
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +393 -0
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +727 -0
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +148 -0
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +35 -0
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +218 -0
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +231 -0
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoBarCompression.kt +98 -0
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoTabBar.kt +312 -0
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +169 -0
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +447 -0
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +103 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +106 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +74 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +379 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +39 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +363 -0
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +192 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +133 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +127 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +12 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +91 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +9 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +74 -0
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ReservedRegions.kt +13 -0
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +55 -0
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +118 -0
  134. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +78 -0
  135. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +45 -0
  136. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +32 -0
  137. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +38 -0
  138. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +66 -0
  139. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +217 -0
  140. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/ReservedRegions.ios.kt +94 -0
  141. package/gradle/libs.versions.toml +69 -0
  142. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  143. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  144. package/gradle.properties +26 -0
  145. package/gradlew +252 -0
  146. package/gradlew.bat +94 -0
  147. package/ios/Application/MaxApi.swift +12 -3
  148. package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
  149. package/ios/Layout/GridContext.swift +67 -3
  150. package/ios/Navigation/BottomSheet.swift +30 -4
  151. package/ios/Navigation/BottomTab/BottomTab.swift +0 -2
  152. package/ios/Navigation/Component/SnackBar.swift +0 -1
  153. package/ios/Navigation/HostBackGestureBridge.swift +27 -6
  154. package/ios/Navigation/ModalScreen.swift +0 -1
  155. package/ios/Navigation/Navigation.swift +14 -0
  156. package/ios/Navigation/NavigationContainer.swift +26 -56
  157. package/ios/Navigation/Navigator.swift +102 -165
  158. package/ios/Navigation/StackScreen.swift +19 -2
  159. package/ios/Navigation/StackTransition.swift +400 -0
  160. package/ios/Navigation/SwipeBackHaptic.swift +33 -0
  161. package/ios-demo/README.md +120 -0
  162. package/package.json +1 -1
  163. package/settings.gradle.kts +64 -0
package/CLAUDE.md CHANGED
@@ -56,11 +56,13 @@ Publishing is automated (`publish.sh` + GitLab CI on `[ci build]` / `main`). Do
56
56
 
57
57
  ## SwiftUI kit (`ios/`)
58
58
 
59
- - **Layout mirrors Compose:** `ios/Navigation/` follows `navigation/` file for file (`NavigationContainer`, `Navigator`, `Navigation` (options + per-screen `Navigation`), `StackScreen` (incl. `NavigationFooter`), `BottomSheet`, `ModalScreen`, `HostBackGestureBridge`, `BottomTab/`, `Component/`, `Tracking/`); `ios/Layout/ScreenLayout.swift` mirrors `layout/`. `ios/Application/` keeps only context (`ApplicationEnvironment`), `Localize*`, `MaxApi` and the deprecated `Screen` / `LegacyHeader` (Compose `application/`). Change a navigation piece on both sides together.
59
+ - **Layout mirrors Compose:** `ios/Navigation/` follows `navigation/` file for file (`NavigationContainer`, `Navigator`, `Navigation` (options + per-screen `Navigation`), `StackScreen` (incl. `NavigationFooter`), `StackTransition`, `SwipeBackHaptic`, `BottomSheet`, `ModalScreen`, `HostBackGestureBridge`, `BottomTab/`, `Component/`, `Tracking/`); `ios/Layout/ScreenLayout.swift` mirrors `layout/`. `ios/Application/` keeps only context (`ApplicationEnvironment`), `Localize*`, `MaxApi` and the deprecated `Screen` / `LegacyHeader` (Compose `application/`). Change a navigation piece on both sides together.
60
60
  - **File basenames must be unique across the pod** — Swift fails with "filename used twice" even in different folders (hence `LegacyHeader.swift` next to `Navigation/Component/Header.swift`). New folders under `ios/` must be added to `source_files` in `ios/native-kits.podspec`.
61
61
  - Screens update their own chrome at runtime through `@EnvironmentObject var navigation: Navigation` → `setOptions { $0.title = … }` (Compose `LocalNavigation`); bottom tabs keep one `Navigation` per tab. The host back bridge is `HostBackGestureBridge.shared` (`NavigatorManager` is a deprecated alias); a bottom tab off its first tab routes back to the first tab (`Navigator.tabBackHandler`, keyed by the hosting screen).
62
- - The pod's minimum is **iOS 15**, but the navigation shell (`NavigationContainer`, `Navigator`, `HostBackGestureBridge`, `BottomTab`, overplay views) is **iOS 16+** (`@available(iOS 16.0, *)`) because it is built on `NavigationStack`. Keep components outside that shell iOS 15-compatible.
63
- - `present` opens one `fullScreenCover` that hosts its own `NavigationStack` (`Navigator.presentedPath`): pushes and pops act on the presented flow while it is up, and each overplay (modal / bottom sheet / snackbar) renders in the context it was shown over (`OverplayItem.presentedId`).
62
+ - Everything, navigation shell included, supports the pod's minimum **iOS 15** — no `@available` gates on public types. iOS 16+ APIs only behind `#available` with an iOS 15 path (`Layout`: `BottomSheet` `CapHeight`, `GridFlow` → `_VariadicView` flow row).
63
+ - **Usage is `NavigationContainer` + `Navigator` + `Navigation` only**; the kit owns the stack, transitions, overplays and back gesture. There is no `NavigationStack`: `StackTransition.swift` holds `StackHost` (representable) + `StackController`, the NavHost counterpart. Each entry gets its own `UIHostingController`, kept while on the stack and removed from the window while covered (state kept, onDisappear / onAppear like UINavigationController). Motion is a SwiftUI `offset` per card driven by one `coverage` value on a display link (a UIKit transform would move the safe area); it is Compose `StackTransition` 1:1 (RN `forStackTransitionWithOverlay`: linear 300ms slide, 0.3 parallax, `pink09` scrim to 0.6, 8pt edge shadow to 0.3). Card roots get the container environment via `.environment(\.self, …)` with the kit environment re-applied on top, so host environment objects reach screens.
64
+ - One back stack, root first (`Navigator.entries`, Compose's back stack): `present` appends a dialog entry that rises (FastOutSlowIn 300ms) and later pushes stack on top of it; `dismiss` drops the topmost dialog and everything above it (slides down whole); `popToRoot` returns to the active flow's root. Overplays (modal / bottom sheet / snackbar) render inside the screen they were shown over (`OverplayItem.screenId`, Compose `currentRootId`), so a later push slides over them.
65
+ - Host back gesture: `HostBackGestureBridge.started` / `progressed` / `completed` / `cancelled` scrub the pop (`Navigator.backStarted` …) only for a plain pop; tab back, `onBackHandler`, `preventBack`, an open overplay or a presented top wait for the release and go through `onBackSafe`. `SwipeBackHaptic` ticks at 50pt (`MaxApi.triggerEventVibration`, default = system light impact).
64
66
  - Icons are compiled in: `ios/Icon/Icons.swift` is generated from Compose `utils/Icons.kt` by `node scripts/gen-ios-icons.mjs` — don't hand-edit it. A host `icon.json` in the main bundle only adds keys the kit lacks.
65
67
  - Bundled assets (colors, Lottie JSON) live in `ios/Resources` and ship in the `MoMoUIKitsResources` bundle; load them through `MoMoUIKitsResources.bundle`, never `Bundle.main`.
66
68
 
@@ -0,0 +1,11 @@
1
+ plugins {
2
+ // this is necessary to avoid the plugins to be loaded multiple times
3
+ // in each subproject's classloader
4
+ alias(libs.plugins.android.application) apply false
5
+ alias(libs.plugins.android.library) apply false
6
+ alias(libs.plugins.compose) apply false
7
+ alias(libs.plugins.kotlin.compose.compiler) apply false
8
+ alias(libs.plugins.jetbrains.kotlin.multiplatform) apply false
9
+ alias(libs.plugins.jetbrains.kotlin.serialization) apply false
10
+ alias(libs.plugins.vanniktech.mavenPublish) apply false
11
+ }
@@ -0,0 +1,204 @@
1
+ // import com.vanniktech.maven.publish.JavadocJar
2
+ // import com.vanniktech.maven.publish.KotlinMultiplatform
3
+ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
4
+
5
+ plugins {
6
+ alias(libs.plugins.jetbrains.kotlin.multiplatform)
7
+ alias(libs.plugins.android.library)
8
+ alias(libs.plugins.compose)
9
+ alias(libs.plugins.kotlin.compose.compiler)
10
+ // alias(libs.plugins.vanniktech.mavenPublish)
11
+ id(libs.plugins.jetbrains.kotlin.cocoapods.get().pluginId)
12
+ kotlin("plugin.serialization")
13
+ }
14
+
15
+ val gitlabName: String = findProperty("name") as String? ?: ""
16
+ val gitlabRepo: String = findProperty("repo") as String? ?: ""
17
+ val gitlabUrl: String = findProperty("url") as String? ?: ""
18
+ val gitlabGroup: String = findProperty("group") as String? ?: ""
19
+ val gitlabArtifactId: String = findProperty("artifact.id") as String? ?: ""
20
+ val gitlabVersion: String = findProperty("version") as String? ?: ""
21
+ val gitlabUser: String = findProperty("gitlab.user") as String? ?: ""
22
+ val gitlabKey: String = findProperty("gitlab.password") as String? ?: ""
23
+
24
+ kotlin {
25
+ androidTarget {
26
+ compilerOptions {
27
+ jvmTarget.set(JvmTarget.JVM_17)
28
+ }
29
+ publishLibraryVariants("release")
30
+ }
31
+
32
+ val fwName = gitlabArtifactId
33
+ val iosTargets = listOf(iosArm64(), iosSimulatorArm64())
34
+ iosTargets.forEach {
35
+ it.binaries.framework {
36
+ baseName = fwName
37
+ binaryOption("bundleId", "$gitlabGroup.$fwName")
38
+ isStatic = true
39
+ }
40
+ }
41
+
42
+ cocoapods {
43
+ version = "0.167.1-duo.19-debug"
44
+ summary = "IOS Shared module"
45
+ homepage = "https://momo.vn"
46
+ ios.deploymentTarget = "15.0"
47
+
48
+ framework {
49
+ baseName = fwName
50
+ isStatic = true
51
+ }
52
+
53
+ pod("lottie-ios") {
54
+ moduleName = "Lottie"
55
+ version = "4.4.3"
56
+ extraOpts += listOf("-compiler-option", "-fmodules")
57
+ }
58
+ }
59
+
60
+ sourceSets {
61
+ all {
62
+ languageSettings.optIn("vn.momo.kits.modifier.InternalApi")
63
+ }
64
+ commonMain.dependencies {
65
+ implementation(compose.runtime)
66
+ implementation(compose.material)
67
+ implementation(compose.material3)
68
+ implementation(compose.components.resources)
69
+ implementation(libs.compose.ui.backhandler)
70
+ implementation(libs.ktor.client.core)
71
+ implementation(libs.jetbrains.coroutines.core)
72
+ implementation(libs.navigation.multiplatform)
73
+ implementation(libs.coil.multiplatform.compose)
74
+ implementation(libs.coil.multiplatform.core)
75
+ implementation(libs.coil.multiplatform.network.ktor)
76
+ implementation(libs.jetbrains.serialization.json)
77
+ implementation(libs.kotlinx.datetime)
78
+ api(libs.native.max.api)
79
+ implementation(libs.compottie)
80
+ implementation(libs.gif.image)
81
+ }
82
+ androidMain.dependencies {
83
+ implementation(libs.ktor.client.okhttp)
84
+ implementation(libs.airbnb.lottie)
85
+ }
86
+ iosMain.dependencies {
87
+ implementation(libs.ktor.client.darwin)
88
+ }
89
+ }
90
+ }
91
+
92
+ android {
93
+ namespace = "vn.momo.kits.kits"
94
+ compileSdk = 35
95
+ compileOptions {
96
+ sourceCompatibility = JavaVersion.VERSION_17
97
+ targetCompatibility = JavaVersion.VERSION_17
98
+ }
99
+ defaultConfig {
100
+ minSdk = 24
101
+ }
102
+ }
103
+
104
+ dependencies {
105
+ }
106
+
107
+ repositories {
108
+ google {
109
+ mavenContent {
110
+ includeGroupAndSubgroups("androidx")
111
+ includeGroupAndSubgroups("com.android")
112
+ includeGroupAndSubgroups("com.google")
113
+ }
114
+ }
115
+ mavenCentral()
116
+ maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
117
+ maven {
118
+ url = uri("https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven")
119
+ credentials {username = "download_packages"; password = "gldt-bjDqLpU_sPcHDuXau2ws" }
120
+ }
121
+ maven {
122
+ url = uri("https://artifacts.mservice.com.vn/repository/maven-momo-app/")
123
+ credentials {
124
+ username = "viewer"
125
+ password = "viewer"
126
+ }
127
+ isAllowInsecureProtocol = true
128
+ }
129
+ }
130
+
131
+ compose {
132
+ resources {
133
+ publicResClass = true
134
+ packageOfResClass = "vn.momo.uikits.resources"
135
+ generateResClass = always
136
+ }
137
+ }
138
+
139
+ // publishing {
140
+ // repositories {
141
+ // maven {
142
+ // name = "${gitlabRepo}Packages"
143
+ // credentials {
144
+ // username = gitlabUser
145
+ // password = gitlabKey
146
+ // }
147
+ // url = uri("$gitlabUrl")
148
+ // }
149
+ // }
150
+ // }
151
+
152
+ // mavenPublishing {
153
+ // configure(
154
+ // KotlinMultiplatform(
155
+ // javadocJar = JavadocJar.Empty(),
156
+ // sourcesJar = true,
157
+ // androidVariantsToPublish = listOf("release")
158
+ // )
159
+ // )
160
+ //
161
+ // repositories {
162
+ // maven {
163
+ // name = "${gitlabRepo}Packages"
164
+ // credentials { username = gitlabUser; password = gitlabKey }
165
+ // url = uri("$gitlabUrl")
166
+ // }
167
+ // }
168
+ //
169
+ // coordinates(gitlabGroup.toString(), gitlabArtifactId, gitlabVersion.toString())
170
+ //
171
+ // pom {
172
+ // name = "$gitlabName Klib"
173
+ // description = "$gitlabName"
174
+ // url = "https://gitlab.mservice.com.vn"
175
+ // licenses {
176
+ // license {
177
+ // name = "The Apache License, Version 2.0"
178
+ // url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
179
+ // distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt"
180
+ // }
181
+ // }
182
+ // developers {
183
+ // developer {
184
+ // id = "kotlin-hands-on"
185
+ // name = "Kotlin Developer Advocate"
186
+ // url = "https://github.com/kotlin-hands-on/"
187
+ // }
188
+ // }
189
+ // }
190
+ // }
191
+
192
+ // Xcode 27 rejects pods below iOS 15 (lottie-ios 4.4.3 declares 13.0), and the synthetic Podfile has no post_install hook.
193
+ val syntheticPodsProject = layout.buildDirectory.file("cocoapods/synthetic/ios/Pods/Pods.xcodeproj/project.pbxproj")
194
+ tasks.matching { it.name.startsWith("podInstallSynthetic") }.configureEach {
195
+ doLast {
196
+ val pbxproj = syntheticPodsProject.get().asFile
197
+ if (!pbxproj.exists()) return@doLast
198
+ val target = Regex("IPHONEOS_DEPLOYMENT_TARGET = ([0-9.]+);")
199
+ pbxproj.writeText(pbxproj.readText().replace(target) { match ->
200
+ val major = match.groupValues[1].substringBefore('.').toIntOrNull() ?: 0
201
+ if (major < 15) "IPHONEOS_DEPLOYMENT_TARGET = 15.0;" else match.value
202
+ })
203
+ }
204
+ }
@@ -0,0 +1,204 @@
1
+ import com.vanniktech.maven.publish.JavadocJar
2
+ import com.vanniktech.maven.publish.KotlinMultiplatform
3
+ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
4
+
5
+ plugins {
6
+ alias(libs.plugins.jetbrains.kotlin.multiplatform)
7
+ alias(libs.plugins.android.library)
8
+ alias(libs.plugins.compose)
9
+ alias(libs.plugins.kotlin.compose.compiler)
10
+ alias(libs.plugins.vanniktech.mavenPublish)
11
+ id(libs.plugins.jetbrains.kotlin.cocoapods.get().pluginId)
12
+ kotlin("plugin.serialization")
13
+ }
14
+
15
+ val gitlabName: String = findProperty("name") as String? ?: ""
16
+ val gitlabRepo: String = findProperty("repo") as String? ?: ""
17
+ val gitlabUrl: String = findProperty("url") as String? ?: ""
18
+ val gitlabGroup: String = findProperty("group") as String? ?: ""
19
+ val gitlabArtifactId: String = findProperty("artifact.id") as String? ?: ""
20
+ val gitlabVersion: String = findProperty("version") as String? ?: ""
21
+ val gitlabUser: String = findProperty("gitlab.user") as String? ?: ""
22
+ val gitlabKey: String = findProperty("gitlab.password") as String? ?: ""
23
+
24
+ kotlin {
25
+ androidTarget {
26
+ compilerOptions {
27
+ jvmTarget.set(JvmTarget.JVM_17)
28
+ }
29
+ publishLibraryVariants("release")
30
+ }
31
+
32
+ val fwName = gitlabArtifactId
33
+ val iosTargets = listOf(iosArm64(), iosSimulatorArm64())
34
+ iosTargets.forEach {
35
+ it.binaries.framework {
36
+ baseName = fwName
37
+ binaryOption("bundleId", "$gitlabGroup.$fwName")
38
+ isStatic = true
39
+ }
40
+ }
41
+
42
+ cocoapods {
43
+ version = gitlabVersion
44
+ summary = "IOS Shared module"
45
+ homepage = "https://momo.vn"
46
+ ios.deploymentTarget = "15.0"
47
+
48
+ framework {
49
+ baseName = fwName
50
+ isStatic = true
51
+ }
52
+
53
+ pod("lottie-ios") {
54
+ moduleName = "Lottie"
55
+ version = "4.4.3"
56
+ extraOpts += listOf("-compiler-option", "-fmodules")
57
+ }
58
+ }
59
+
60
+ sourceSets {
61
+ all {
62
+ languageSettings.optIn("vn.momo.kits.modifier.InternalApi")
63
+ }
64
+ commonMain.dependencies {
65
+ implementation(compose.runtime)
66
+ implementation(compose.material)
67
+ implementation(compose.material3)
68
+ implementation(compose.components.resources)
69
+ implementation(libs.compose.ui.backhandler)
70
+ implementation(libs.ktor.client.core)
71
+ implementation(libs.jetbrains.coroutines.core)
72
+ implementation(libs.navigation.multiplatform)
73
+ implementation(libs.coil.multiplatform.compose)
74
+ implementation(libs.coil.multiplatform.core)
75
+ implementation(libs.coil.multiplatform.network.ktor)
76
+ implementation(libs.jetbrains.serialization.json)
77
+ implementation(libs.kotlinx.datetime)
78
+ api(libs.native.max.api)
79
+ implementation(libs.compottie)
80
+ implementation(libs.gif.image)
81
+ }
82
+ androidMain.dependencies {
83
+ implementation(libs.ktor.client.okhttp)
84
+ implementation(libs.airbnb.lottie)
85
+ }
86
+ iosMain.dependencies {
87
+ implementation(libs.ktor.client.darwin)
88
+ }
89
+ }
90
+ }
91
+
92
+ android {
93
+ namespace = "$gitlabGroup.$gitlabArtifactId"
94
+ compileSdk = libs.versions.android.compileSdk.get().toInt()
95
+ compileOptions {
96
+ sourceCompatibility = JavaVersion.VERSION_17
97
+ targetCompatibility = JavaVersion.VERSION_17
98
+ }
99
+ defaultConfig {
100
+ minSdk = libs.versions.android.minSdk.get().toInt()
101
+ }
102
+ }
103
+
104
+ dependencies {
105
+ }
106
+
107
+ repositories {
108
+ google {
109
+ mavenContent {
110
+ includeGroupAndSubgroups("androidx")
111
+ includeGroupAndSubgroups("com.android")
112
+ includeGroupAndSubgroups("com.google")
113
+ }
114
+ }
115
+ mavenCentral()
116
+ maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
117
+ maven {
118
+ url = uri("https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven")
119
+ credentials {username = "download_packages"; password = "gldt-bjDqLpU_sPcHDuXau2ws" }
120
+ }
121
+ maven {
122
+ url = uri("https://artifacts.mservice.com.vn/repository/maven-momo-app/")
123
+ credentials {
124
+ username = "viewer"
125
+ password = "viewer"
126
+ }
127
+ isAllowInsecureProtocol = true
128
+ }
129
+ }
130
+
131
+ compose {
132
+ resources {
133
+ publicResClass = true
134
+ packageOfResClass = "vn.momo.uikits.resources"
135
+ generateResClass = always
136
+ }
137
+ }
138
+
139
+ publishing {
140
+ repositories {
141
+ maven {
142
+ name = "${gitlabRepo}Packages"
143
+ credentials {
144
+ username = gitlabUser
145
+ password = gitlabKey
146
+ }
147
+ url = uri("$gitlabUrl")
148
+ }
149
+ }
150
+ }
151
+
152
+ mavenPublishing {
153
+ configure(
154
+ KotlinMultiplatform(
155
+ javadocJar = JavadocJar.Empty(),
156
+ sourcesJar = true,
157
+ androidVariantsToPublish = listOf("release")
158
+ )
159
+ )
160
+
161
+ repositories {
162
+ maven {
163
+ name = "${gitlabRepo}Packages"
164
+ credentials { username = gitlabUser; password = gitlabKey }
165
+ url = uri("$gitlabUrl")
166
+ }
167
+ }
168
+
169
+ coordinates(gitlabGroup.toString(), gitlabArtifactId, gitlabVersion.toString())
170
+
171
+ pom {
172
+ name = "$gitlabName Klib"
173
+ description = "$gitlabName"
174
+ url = "https://gitlab.mservice.com.vn"
175
+ licenses {
176
+ license {
177
+ name = "The Apache License, Version 2.0"
178
+ url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
179
+ distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt"
180
+ }
181
+ }
182
+ developers {
183
+ developer {
184
+ id = "kotlin-hands-on"
185
+ name = "Kotlin Developer Advocate"
186
+ url = "https://github.com/kotlin-hands-on/"
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ // Xcode 27 rejects pods below iOS 15 (lottie-ios 4.4.3 declares 13.0), and the synthetic Podfile has no post_install hook.
193
+ val syntheticPodsProject = layout.buildDirectory.file("cocoapods/synthetic/ios/Pods/Pods.xcodeproj/project.pbxproj")
194
+ tasks.matching { it.name.startsWith("podInstallSynthetic") }.configureEach {
195
+ doLast {
196
+ val pbxproj = syntheticPodsProject.get().asFile
197
+ if (!pbxproj.exists()) return@doLast
198
+ val target = Regex("IPHONEOS_DEPLOYMENT_TARGET = ([0-9.]+);")
199
+ pbxproj.writeText(pbxproj.readText().replace(target) { match ->
200
+ val major = match.groupValues[1].substringBefore('.').toIntOrNull() ?: 0
201
+ if (major < 15) "IPHONEOS_DEPLOYMENT_TARGET = 15.0;" else match.value
202
+ })
203
+ }
204
+ }
@@ -0,0 +1,47 @@
1
+ Pod::Spec.new do |spec|
2
+ spec.name = 'compose'
3
+ spec.version = '0.167.1-duo.15-debug'
4
+ spec.homepage = 'https://momo.vn'
5
+ spec.source = { :http=> ''}
6
+ spec.authors = ''
7
+ spec.license = ''
8
+ spec.summary = 'IOS Shared module'
9
+ spec.vendored_frameworks = 'build/cocoapods/framework/kits.framework'
10
+ spec.libraries = 'c++'
11
+ spec.ios.deployment_target = '15.0'
12
+ spec.dependency 'lottie-ios', '4.4.3'
13
+ if !Dir.exist?('build/cocoapods/framework/kits.framework') || Dir.empty?('build/cocoapods/framework/kits.framework')
14
+ raise "
15
+ Kotlin framework 'kits' doesn't exist yet, so a proper Xcode project can't be generated.
16
+ 'pod install' should be executed after running ':generateDummyFramework' Gradle task:
17
+ ./gradlew :compose:generateDummyFramework
18
+ Alternatively, proper pod installation is performed during Gradle sync in the IDE (if Podfile location is set)"
19
+ end
20
+ spec.xcconfig = {
21
+ 'ENABLE_USER_SCRIPT_SANDBOXING' => 'NO',
22
+ }
23
+ spec.pod_target_xcconfig = {
24
+ 'KOTLIN_PROJECT_PATH' => ':compose',
25
+ 'PRODUCT_MODULE_NAME' => 'kits',
26
+ }
27
+ spec.script_phases = [
28
+ {
29
+ :name => 'Build compose',
30
+ :execution_position => :before_compile,
31
+ :shell_path => '/bin/sh',
32
+ :script => <<-SCRIPT
33
+ if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then
34
+ echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\""
35
+ exit 0
36
+ fi
37
+ set -ev
38
+ REPO_ROOT="$PODS_TARGET_SRCROOT"
39
+ "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
40
+ -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \
41
+ -Pkotlin.native.cocoapods.archs="$ARCHS" \
42
+ -Pkotlin.native.cocoapods.configuration="$CONFIGURATION"
43
+ SCRIPT
44
+ }
45
+ ]
46
+ spec.resources = ['build/compose/cocoapods/compose-resources']
47
+ end
@@ -0,0 +1,19 @@
1
+ package vn.momo.kits.const
2
+
3
+ import androidx.compose.runtime.Composable
4
+ import androidx.compose.runtime.remember
5
+ import androidx.compose.ui.platform.LocalContext
6
+ import androidx.compose.ui.text.font.Font
7
+ import androidx.compose.ui.text.font.FontFamily
8
+
9
+ @Composable
10
+ internal actual fun hostFontFamily(fileName: String): FontFamily? {
11
+ val assets = LocalContext.current.applicationContext.assets
12
+ return remember(fileName) {
13
+ val path = "fonts/$fileName"
14
+ // AssetManager.open ném IOException nếu thiếu file; Font(path, assetManager) thì lỗi
15
+ // muộn lúc render nên phải kiểm tra tồn tại trước.
16
+ val exists = runCatching { assets.open(path).close() }.isSuccess
17
+ if (exists) FontFamily(Font(path = path, assetManager = assets)) else null
18
+ }
19
+ }
@@ -0,0 +1,6 @@
1
+ package vn.momo.kits.navigation
2
+
3
+ import androidx.compose.runtime.Composable
4
+
5
+ @Composable
6
+ internal actual fun RegisterScrollToTop(callback: (() -> Unit)?) = Unit
@@ -0,0 +1,12 @@
1
+ package vn.momo.kits.platform
2
+
3
+ import androidx.compose.runtime.Composable
4
+ import androidx.compose.runtime.State
5
+ import androidx.compose.runtime.mutableStateOf
6
+ import androidx.compose.runtime.remember
7
+
8
+ // No passive observer at androidx.activity 1.10.x; a second callback would steal the gesture.
9
+ @Composable
10
+ actual fun rememberBackGestureProgress(): State<Float?> = remember { mutableStateOf(null) }
11
+
12
+ actual fun reportFloatingArrowBack(shouldUse: Boolean) = Unit
@@ -0,0 +1,7 @@
1
+ package vn.momo.kits.platform
2
+
3
+ import androidx.compose.runtime.Composable
4
+
5
+ // Android's LocalDensity.fontScale already tracks Configuration.fontScale live.
6
+ @Composable
7
+ actual fun ProvideOsFontScale(content: @Composable () -> Unit) = content()