@momo-kits/native-kits 0.167.1-duo.3 → 0.167.1-duo.4-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 +17 -8
- package/build.gradle.kts +11 -0
- package/compose/build.gradle.kts +190 -0
- package/compose/build.gradle.kts.backup +190 -0
- package/compose/compose.podspec +47 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +19 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +12 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +7 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +151 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +52 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +124 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +183 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +207 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +39 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +293 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +831 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +269 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +110 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +378 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +56 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +82 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +338 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +175 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +356 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +113 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +89 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +128 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +209 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +542 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +49 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +125 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +231 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +189 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +475 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +114 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +266 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +240 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +223 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +264 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +185 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +343 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +84 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +334 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +98 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +310 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +59 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +21 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +90 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +323 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +220 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +473 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +122 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +199 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +91 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +552 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +88 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +125 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +207 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +498 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +176 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +182 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +193 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +234 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +188 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +325 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +16 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +18 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +22 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +297 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +54 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +50 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +157 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +41 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +52 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +66 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +104 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +48 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +299 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +58 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +129 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +106 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +205 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +393 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +622 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +148 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +35 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +175 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +232 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +169 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +381 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +83 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +105 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +74 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +347 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +37 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +363 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +169 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +132 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +127 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +12 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +91 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +9 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +71 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +55 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +118 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +40 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +45 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +32 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +38 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +66 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +213 -0
- package/gradle/libs.versions.toml +69 -0
- package/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/gradle/wrapper/gradle-wrapper.properties +8 -0
- package/gradle.properties +26 -0
- package/gradlew +252 -0
- package/gradlew.bat +94 -0
- package/ios/Application/ApplicationEnvironment.swift +6 -0
- package/ios/Application/Components.swift +1 -3
- package/ios/Application/HeaderRight.swift +19 -27
- package/ios/Application/Navigation/BottomTab/BottomTab.swift +9 -30
- package/ios/Application/Navigation/BottomTab/BottomTabBar.swift +2 -5
- package/ios/Application/Navigation/HeaderUser.swift +1 -7
- package/ios/Application/Navigation/NavigationContainer.swift +45 -45
- package/ios/Application/Navigation/Navigator.swift +122 -29
- package/ios/Application/Navigation/NavigatorManager.swift +13 -6
- package/ios/Application/Navigation/Overplay/BottomSheet.swift +4 -41
- package/ios/Application/Navigation/Overplay/ModalScreen.swift +1 -5
- package/ios/Application/Navigation/component/Header.swift +4 -12
- package/ios/Application/Navigation/component/HeaderBackground.swift +2 -3
- package/ios/Application/Navigation/component/NavigationFooter.swift +1 -1
- package/ios/Application/Navigation/component/NavigationHeaderRight.swift +9 -61
- package/ios/Application/StackScreen.swift +18 -135
- package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +59 -5
- package/ios/Colors+Radius+Spacing/Colors.swift +1 -1
- package/ios/Extensions/Color++.swift +20 -9
- package/ios/Extensions/OptionalEnvironmentObject.swift +12 -0
- package/ios/Icon/Icon.swift +14 -22
- package/ios/Icon/Icons.swift +1329 -0
- package/ios/Image/Image.swift +16 -5
- package/ios/Lottie/LottieView.swift +4 -2
- package/ios/Popup/PopupDisplay.swift +68 -84
- package/ios/Popup/PopupNotify.swift +32 -43
- package/ios/Popup/PopupPromotion.swift +6 -18
- package/ios/Resources/dot_loading.json +558 -0
- package/ios/Resources/lottie_circle_loader.json +1 -0
- package/ios/Template/TrustBanner/TrustBanner.swift +69 -31
- package/ios/native-kits.podspec +1 -1
- package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
- package/ios-demo/README.md +120 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +0 -1
- package/package.json +1 -1
- package/scripts/gen-ios-icons.mjs +36 -0
- package/settings.gradle.kts +64 -0
- package/.claude/scheduled_tasks.lock +0 -1
- package/.claude/settings.local.json +0 -185
- package/ios/Application/Layout/ScreenLayout.swift +0 -196
- package/ios/Application/Navigation/BottomTab/DuoTabBar.swift +0 -275
- package/ios/Application/Navigation/component/DuoScrollGradient.swift +0 -55
- package/ios/Application/Navigation/component/SideBar.swift +0 -155
- package/ios/Popup/PopupLayout.swift +0 -45
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DuoTabDemo.swift +0 -76
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IPhoneDuoDemo.swift +0 -170
package/CLAUDE.md
CHANGED
|
@@ -35,6 +35,13 @@ No unit-test suite is configured. Validate changes by compiling the relevant tar
|
|
|
35
35
|
./gradlew :sample:androidApp:installDebug # run demo on device/emulator
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
+
The SwiftUI kit (`ios/`, pod `MoMoUIKits`) compiles on its own through the sample's Pods project (`pod install` in `sample/iosApp` first when files are added):
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
xcodebuild -project sample/iosApp/Pods/Pods.xcodeproj -scheme MoMoUIKits -sdk iphonesimulator \
|
|
42
|
+
-destination 'generic/platform=iOS Simulator' build
|
|
43
|
+
```
|
|
44
|
+
|
|
38
45
|
Publishing is automated (`publish.sh` + GitLab CI on `[ci build]` / `main`). Do not publish manually unless asked: `sh publish.sh beta` / `sh publish.sh release` (Maven→GitLab + NPM).
|
|
39
46
|
|
|
40
47
|
## Architecture essentials
|
|
@@ -47,16 +54,18 @@ Publishing is automated (`publish.sh` + GitLab CI on `[ci build]` / `main`). Do
|
|
|
47
54
|
- Navigation uses a runtime `DynamicScreenRegistry`; overlays (modal/bottom-sheet/snackbar) go through `Navigator` + `OverplayComponentRegistry`.
|
|
48
55
|
- **iOS swipe-back:** the host owns the only edge-pan recogniser and replays it through `HostBackGestureBridge` (`navigation/HostBackGestureBridge.kt`; the kit framework is never exported, so the host reaches it through its own Koin-provided facade): `checkCanPop` / `canPopInner` / `pop` route the back into the kit stack, `started` / `progressed` / `completed` / `cancelled` seek the NavHost transition, `shouldUseFloatingArrowBack` is set by bottom tabs. `NavigationContainer` attaches itself automatically (`AttachHostBackGesture`, iOS only, detached by identity on dispose) — hosts need no wrapper and no `setNavigator`. `maxApi` is a required parameter of `NavigationContainer` — every container, nested or root, is handed its host bridge explicitly.
|
|
49
56
|
|
|
50
|
-
##
|
|
57
|
+
## SwiftUI kit (`ios/`)
|
|
58
|
+
|
|
59
|
+
- The pod's minimum is **iOS 15**, but the navigation shell (`NavigationContainer`, `Navigator`, `NavigatorManager`, `BottomTab`, overplay views) is **iOS 16+** (`@available(iOS 16.0, *)`) because it is built on `NavigationStack`. Keep components outside that shell iOS 15-compatible.
|
|
60
|
+
- `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`).
|
|
61
|
+
- 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.
|
|
62
|
+
- Bundled assets (colors, Lottie JSON) live in `ios/Resources` and ship in the `MoMoUIKitsResources` bundle; load them through `MoMoUIKitsResources.bundle`, never `Bundle.main`.
|
|
63
|
+
|
|
64
|
+
## Screen layout / iPhone Duo (port of RN `useScreenLayout`)
|
|
51
65
|
|
|
52
|
-
- `layout/ScreenLayout.kt`: `getScreenLayout()` returns window size,
|
|
53
|
-
- iPhone-only: everything gates on `isPhoneIdiom()` (`platform/`), never on "iOS", so iPad windows keep the regular layout. Two detectors, as in RN: `isIPhoneDuo` (window aspect < 1.6 or asymmetric side insets) drives layout; `isIPhoneDuoDevice` (short side of screen or window > 440, RN `device.ts`) drives popups, modal and bottom sheet.
|
|
66
|
+
- `layout/ScreenLayout.kt`: `getScreenLayout()` returns window size, side safe-area insets, `contentWidth`, header geometry and the iPhone Duo `sideBar`. `NavigationContainer` computes it once and provides `LocalScreenLayout`; reactive to fold/unfold and rotation (window size + `WindowInsets`). Metrics (`DuoMetrics`, 72pt iPhone header floor, 20pt status-bar threshold) mirror RN `Layout/utils.ts` — change both together.
|
|
54
67
|
- Header height is `headerHeight` (not `AppStatusBar + HEADER_HEIGHT`); the bar row is `headerBarHeight`. When the status bar is off the top edge (iPhone landscape, iPhone Duo) `headerStatusBarHeight` is 0 so the title stays centered.
|
|
55
|
-
- iPhone Duo with a side strip ≥ 60pt: back + toolkit leave the bar for `HeaderSideBar` (`navigation/component/SideBar.kt`, 48pt glass controls); custom header-right stays in the bar. The column starts
|
|
56
|
-
- Tab bar on Duo is `bottomtab/DuoTabBar.kt`: a rail in the side strip (anchored 24pt from the bottom, QR below it) or, without a side bar, a floating bar spanning 6/8 grid columns. Both overlay the content; `duoFloatingTabBarInset` pads tab content, footer and FAB.
|
|
57
|
-
- Glass header: on Duo with a side bar, Default/Extended headers without search and with a `ScrollState` let content scroll under the bar (`usesDuoGlassHeader`); the bar fades in a translucent surface + hairline over 16pt (Compose has no backdrop blur — RN's fallback look), the gradient scrolls away / collapses.
|
|
58
|
-
- Overlays on Duo: popups cap at 440pt wide and the room between `duoTopInset` and the bottom inset (body scrolls, actions stay); modal centers inside that room; bottom sheet uses the window height, centers at width ≥ 600 and pads by side insets in landscape.
|
|
59
|
-
- Font scale deliberately uses the short side (`min(w, h)`), unlike RN which reads the window width — landscape must not inflate every font.
|
|
68
|
+
- iPhone Duo with a side strip ≥ 60pt: back + toolkit leave the bar for `HeaderSideBar` (`navigation/component/SideBar.kt`, 48pt glass controls); custom header-right stays in the bar. The column starts below the camera / status-bar cluster: 170pt portrait, 120pt in any landscape (folded too — RN still uses 170 there), below the header when the status bar is on top; UIKit's `statusBarFrame` is useless on Duo. Unlike RN it is clamped 24pt above footer / tab bar, so a long toolkit (shortcut + group) never covers the footer.
|
|
60
69
|
- `StackScreen` pads content/footer/search/FAB by the side insets and provides an inset-consumed layout to its content; a bottom-tab root stays full width (tab bar + each tab's StackScreen handle insets). Grid columns use `contentWidth`.
|
|
61
70
|
|
|
62
71
|
## i18n / Localize (port of RN `Localize`)
|
package/build.gradle.kts
ADDED
|
@@ -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,190 @@
|
|
|
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.4-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
|
+
// }
|
|
@@ -0,0 +1,190 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
Pod::Spec.new do |spec|
|
|
2
|
+
spec.name = 'compose'
|
|
3
|
+
spec.version = '0.167.1-beta.4-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,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
|