@momo-kits/native-kits 0.300.3-debug → 0.300.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.
Files changed (218) hide show
  1. package/CLAUDE.md +51 -7
  2. package/README.md +2 -2
  3. package/compose/build.gradle.kts +10 -2
  4. package/compose/build.gradle.kts.backup +8 -0
  5. package/compose/compose.podspec +1 -3
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +4 -3
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +2 -0
  8. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/ReservedRegions.android.kt +6 -0
  9. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -14
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/application/DesignSystemKits.kt +62 -0
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +351 -111
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +20 -21
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +2 -1
  14. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +4 -2
  15. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +1 -1
  16. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +1 -1
  17. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +1 -1
  18. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +9 -6
  19. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +11 -12
  20. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +4 -9
  21. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +2 -2
  22. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +10 -9
  23. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +6 -6
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +55 -22
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +12 -1
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +7 -9
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +1 -1
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +13 -6
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +13 -5
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +3 -2
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +14 -6
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +19 -21
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +2 -2
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +5 -2
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +3 -1
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +7 -15
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +2 -1
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +20 -15
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +1 -2
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +306 -0
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +43 -4
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +8 -0
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +10 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +6 -2
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +6 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +197 -60
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +132 -83
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +54 -62
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoBarCompression.kt +97 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoTabBar.kt +377 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +122 -24
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +34 -14
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +3 -3
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +1 -2
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +113 -26
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +2 -2
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +1 -2
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HelpCenterRequest.kt +37 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +192 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +2 -1
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/ToolkitRequests.kt +8 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +3 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ReservedRegions.kt +20 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +13 -0
  65. package/compose/src/commonTest/kotlin/vn/momo/kits/navigation/component/HelpCenterRequestTest.kt +44 -0
  66. package/compose/src/commonTest/kotlin/vn/momo/kits/navigation/component/ToolkitRequestsTest.kt +15 -0
  67. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +3 -1
  68. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +4 -0
  69. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/ReservedRegions.ios.kt +138 -0
  70. package/gradle/libs.versions.toml +3 -14
  71. package/gradle/wrapper/gradle-wrapper.properties +0 -2
  72. package/gradle.properties +3 -5
  73. package/ios/Application/ApplicationEnvironment.swift +24 -6
  74. package/ios/Application/DesignSystemKits.swift +100 -0
  75. package/ios/Application/DesignSystemKitsPayload.swift +68 -0
  76. package/ios/Application/MaxApi.swift +30 -3
  77. package/ios/Avatar/Avatar.swift +4 -3
  78. package/ios/Badge/Badge.swift +6 -4
  79. package/ios/Badge/BadgeDot.swift +1 -1
  80. package/ios/Badge/BadgeRibbon.swift +8 -2
  81. package/ios/Button/Button.swift +15 -12
  82. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +64 -18
  83. package/ios/Carousel/Carousel.swift +29 -12
  84. package/ios/Checkbox/Checkbox.swift +7 -3
  85. package/ios/Chip/Chip.swift +5 -4
  86. package/ios/Collapse/Collapse.swift +70 -19
  87. package/ios/Colors+Radius+Spacing/Colors.swift +10 -1
  88. package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
  89. package/ios/DateTimePicker/DateTimePicker.swift +54 -20
  90. package/ios/DateTimePicker/WheelPicker.swift +103 -105
  91. package/ios/Divider/Divider.swift +37 -4
  92. package/ios/Extensions/Color++.swift +38 -9
  93. package/ios/Extensions/OptionalEnvironmentObject.swift +12 -0
  94. package/ios/Extensions/SkeletonUICompat.swift +11 -0
  95. package/ios/Icon/Icon.swift +21 -23
  96. package/ios/Icon/Icons.swift +1329 -0
  97. package/ios/IconButton/IconButton.swift +15 -7
  98. package/ios/Image/Image.swift +7 -23
  99. package/ios/Information/Information.swift +27 -9
  100. package/ios/Input/ErrorView.swift +2 -2
  101. package/ios/Input/Input.swift +171 -148
  102. package/ios/Input/InputPhoneNumber.swift +10 -9
  103. package/ios/Input/InputSearch.swift +107 -78
  104. package/ios/Input/InputTextArea.swift +133 -148
  105. package/ios/InputDropDown/InputDropDown.swift +10 -7
  106. package/ios/InputMoney/InputMoney.swift +32 -11
  107. package/ios/InputOTP/InputOTP.swift +22 -12
  108. package/ios/Layout/Card.swift +50 -0
  109. package/ios/Layout/GridContext.swift +187 -3
  110. package/ios/Layout/Item.swift +5 -4
  111. package/ios/Layout/ScreenLayout.swift +415 -0
  112. package/ios/Layout/Section.swift +4 -100
  113. package/ios/Loader/Loader.swift +5 -9
  114. package/ios/Lottie/LottieView.swift +14 -2
  115. package/ios/{Application/Navigation/Overplay → Navigation}/BottomSheet.swift +169 -29
  116. package/ios/Navigation/BottomTab/BottomTab.swift +332 -0
  117. package/ios/{Application/Navigation → Navigation}/BottomTab/BottomTabBar.swift +18 -7
  118. package/ios/Navigation/BottomTab/DuoBarCompression.swift +104 -0
  119. package/ios/Navigation/BottomTab/DuoTabBar.swift +329 -0
  120. package/ios/{Application → Navigation/Component}/FloatingButton.swift +43 -54
  121. package/ios/Navigation/Component/Header.swift +545 -0
  122. package/ios/Navigation/Component/HeaderBackground.swift +154 -0
  123. package/ios/Navigation/Component/HeaderJourney.swift +73 -0
  124. package/ios/Navigation/Component/HeaderLocation.swift +48 -0
  125. package/ios/Navigation/Component/HeaderRight.swift +425 -0
  126. package/ios/Navigation/Component/HeaderTitle.swift +36 -0
  127. package/ios/{Application/Navigation → Navigation/Component}/HeaderUser.swift +21 -24
  128. package/ios/Navigation/Component/SideBar.swift +183 -0
  129. package/ios/{Application/Navigation/Overplay → Navigation/Component}/SnackBar.swift +8 -8
  130. package/ios/Navigation/HostBackGestureBridge.swift +78 -0
  131. package/ios/{Application/Navigation/Overplay → Navigation}/ModalScreen.swift +9 -2
  132. package/ios/Navigation/Navigation.swift +204 -0
  133. package/ios/Navigation/NavigationContainer.swift +195 -0
  134. package/ios/{Application/Navigation → Navigation}/Navigator.swift +207 -107
  135. package/ios/Navigation/StackScreen.swift +930 -0
  136. package/ios/Navigation/StackTransition.swift +400 -0
  137. package/ios/Navigation/SwipeBackHaptic.swift +33 -0
  138. package/ios/{Application/Navigation → Navigation}/Tracking/ScreenTracker.swift +12 -5
  139. package/ios/OTPKeyboard/OTPKeyboard.swift +8 -11
  140. package/ios/Pagination/PaginationScroll.swift +2 -2
  141. package/ios/Popup/PopupDisplay.swift +72 -135
  142. package/ios/Popup/PopupInput.swift +10 -13
  143. package/ios/Popup/PopupLayout.swift +138 -0
  144. package/ios/Popup/PopupNotify.swift +59 -69
  145. package/ios/Popup/PopupPromotion.swift +31 -47
  146. package/ios/PopupView/FullscreenPopup.swift +13 -19
  147. package/ios/PopupView/PopupView.swift +1 -1
  148. package/ios/PopupView/Utils++.swift +0 -8
  149. package/ios/ProgressInfo/ProgressInfo.swift +4 -2
  150. package/ios/Radio/Radio.swift +2 -1
  151. package/ios/Rating/Rating.swift +9 -1
  152. package/ios/Resources/dot_loading.json +558 -0
  153. package/ios/Resources/lottie_circle_loader.json +1 -0
  154. package/ios/ScrollIndicator/ScrollIndicator.swift +11 -10
  155. package/ios/Skeleton/Skeleton.swift +22 -27
  156. package/ios/Slider/Slider.swift +16 -18
  157. package/ios/Stepper/Stepper.swift +7 -3
  158. package/ios/Steps/Steps.swift +8 -6
  159. package/ios/SuggestAction/SuggestAction.swift +5 -0
  160. package/ios/Swipeable/SwipeCell.swift +10 -6
  161. package/ios/Switch/Switch.swift +22 -20
  162. package/ios/TabView/TabView.swift +102 -21
  163. package/ios/Tag/Tag.swift +15 -4
  164. package/ios/Template/Logo/Logo.swift +2 -1
  165. package/ios/Template/TrustBanner/TrustBanner.swift +109 -55
  166. package/ios/Title/Title.swift +6 -17
  167. package/ios/Tooltip/Tooltip.swift +29 -14
  168. package/ios/Typography/FontScale.swift +17 -14
  169. package/ios/Typography/Text.swift +156 -20
  170. package/ios/Typography/Typography.swift +2 -2
  171. package/ios/Uploader/Uploader.swift +3 -1
  172. package/ios/native-kits.podspec +2 -3
  173. package/ios-demo/MoMoUIKitsDemo.podspec +1 -3
  174. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +1 -1
  175. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DuoTabDemo.swift +80 -0
  176. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +2 -0
  177. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IPhoneDuoDemo.swift +173 -0
  178. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +77 -1
  179. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +1 -0
  180. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +2 -2
  181. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +2 -0
  182. package/package.json +1 -1
  183. package/publish.sh +19 -2
  184. package/scripts/gen-ios-icons.mjs +36 -0
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  199. package/ios/Application/Components.swift +0 -270
  200. package/ios/Application/ComposeApi.swift +0 -22
  201. package/ios/Application/HeaderRight.swift +0 -306
  202. package/ios/Application/Navigation/BottomTab/BottomTab.swift +0 -104
  203. package/ios/Application/Navigation/HeaderBackProps.swift +0 -66
  204. package/ios/Application/Navigation/HeaderTitle.swift +0 -57
  205. package/ios/Application/Navigation/NavigationContainer.swift +0 -213
  206. package/ios/Application/Navigation/NavigationOptions.swift +0 -109
  207. package/ios/Application/Navigation/NavigatorManager.swift +0 -22
  208. package/ios/Application/Navigation/component/Header.swift +0 -178
  209. package/ios/Application/Navigation/component/HeaderBackground.swift +0 -83
  210. package/ios/Application/Navigation/component/HeaderColor.swift +0 -65
  211. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +0 -11
  212. package/ios/Application/Navigation/component/NavigationFooter.swift +0 -90
  213. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +0 -196
  214. package/ios/Application/Screen.swift +0 -250
  215. package/ios/Application/StackScreen.swift +0 -492
  216. package/ios/Typography/FontScaleStore.swift +0 -58
  217. package/ios/Typography/KitDesignSystem.swift +0 -17
  218. /package/ios/{Application/Navigation → Navigation}/BottomTab/CurvedContainer.swift +0 -0
@@ -10,12 +10,12 @@ public extension View {
10
10
  }
11
11
 
12
12
  public extension Font {
13
- /// Non-reactive: resolves against the current `FontScaleStore` snapshot at each access. The
13
+ /// Non-reactive: resolves against the current `DesignSystemKits` font scale at each access. The
14
14
  /// styles below are computed properties for that reason — as stored `static let`s they would
15
15
  /// freeze the scale at first access and never pick up a Dynamic Type change.
16
16
  /// Inside a view, `@Environment(\.momoFontScale)` + `fontScale.font(size:weight:)` also re-renders.
17
17
  static func appFont(size: CGFloat) -> Font {
18
- FontScaleStore.shared.snapshot.font(size: size)
18
+ DesignSystemKits.shared.fontScale.font(size: size)
19
19
  }
20
20
 
21
21
  // New supported typography styles
@@ -80,7 +80,9 @@ public struct Uploader: View {
80
80
 
81
81
  ScrollView(.horizontal, showsIndicators: false) {
82
82
  HStack(alignment: .top, spacing: Spacing.S) {
83
- ForEach(Array(images.enumerated()), id: \.element.id) { index, image in
83
+ // Positional like Compose: `UploadImage.id` is a fresh UUID per init, so hosts that
84
+ // rebuild the array each render would otherwise re-create (and reload) every thumbnail.
85
+ ForEach(Array(images.enumerated()), id: \.offset) { index, image in
84
86
  UploaderImageItem(
85
87
  image: image,
86
88
  width: width,
@@ -1,8 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'MoMoUIKits'
3
- # AI-GENERATED START: match the SDK 36 compatible Kits release
4
- s.version = '0.300.3'
5
- # AI-GENERATED END: match the SDK 36 compatible Kits release
3
+ s.version = '0.300.4'
6
4
  s.summary = 'MoMoUIKits for iOS'
7
5
  s.homepage = 'https://momo.vn'
8
6
  s.license = { :type => 'MIT' }
@@ -39,6 +37,7 @@ Pod::Spec.new do |s|
39
37
  "Layout/**/*.{swift,m,h}",
40
38
  "Loader/**/*.{swift,m,h}",
41
39
  "Lottie/**/*.{swift,m,h}",
40
+ "Navigation/**/*.{swift,m,h}",
42
41
  "OTPKeyboard/**/*.{swift,m,h}",
43
42
  "Pagination/**/*.{swift,m,h}",
44
43
  "Popup/**/*.{swift,m,h}",
@@ -1,8 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'MoMoUIKitsDemo'
3
- # AI-GENERATED START: match the SDK 36 compatible Kits release
4
- s.version = '0.300.3'
5
- # AI-GENERATED END: match the SDK 36 compatible Kits release
3
+ s.version = '0.300.4'
6
4
  s.summary = 'Demo browser for MoMoUIKits SwiftUI components'
7
5
  s.homepage = 'https://momo.vn'
8
6
  s.license = { :type => 'MIT' }
@@ -25,7 +25,7 @@ struct ContentView: View {
25
25
 
26
26
  struct ScreenDemo: View {
27
27
  var body: some View {
28
- Screen (
28
+ StackScreen(
29
29
  // backgroundColor: Colors.blue01,
30
30
  headerTransparent: true,
31
31
  isBack: true,
@@ -0,0 +1,80 @@
1
+ //
2
+ // DuoTabDemo.swift
3
+ // Example
4
+ //
5
+ // Mirrors RN `app/screens/IPhoneDuo/DuoTabUsage`: glass rail in the Duo side bar, floating
6
+ // glass bar when unfolded portrait. `useShortcut` gives the tallest side bar header, for the
7
+ // overlap review; `compressTabBar` folds the tab bar instead of the toolbar when the side bar
8
+ // is short (HIG "Tab bar compressed").
9
+ //
10
+
11
+ import MoMoUIKits
12
+ import SwiftUI
13
+
14
+ private let swatches = [Colors.pink03, Colors.orange03, Colors.green03]
15
+ private let history = (1...18).map { "Giao dịch #\($0)" }
16
+
17
+ struct DuoTabDemo: View {
18
+ let useShortcut: Bool
19
+ var compressTabBar = false
20
+
21
+ var body: some View {
22
+ if #available(iOS 16.0, *) {
23
+ DuoTabDemoContent(useShortcut: useShortcut, compressTabBar: compressTabBar)
24
+ } else {
25
+ Text("Requires iOS 16+").padding()
26
+ }
27
+ }
28
+ }
29
+
30
+ @available(iOS 16.0, *)
31
+ private struct DuoTabDemoContent: View {
32
+ let useShortcut: Bool
33
+ let compressTabBar: Bool
34
+
35
+ var body: some View {
36
+ BottomTab(
37
+ items: [
38
+ tab("DuoMoMo", label: "MoMo", icon: "basic_home", title: "MoMo"),
39
+ tab("DuoPromotion", label: "Ưu đãi", icon: "shopping_coupon", title: "Ưu đãi", badge: ""),
40
+ tab("DuoHistory", label: "Lịch sử GD", icon: "time_clock_reset", title: "Lịch sử giao dịch", badge: "3"),
41
+ tab("DuoMe", label: "Tôi", icon: "basic_person", title: "Tôi"),
42
+ ],
43
+ floatingButton: BottomTabFloatingButton(icon: "navigation_full_screen", label: "Quét mọi QR", onPress: {}),
44
+ compressionBehavior: compressTabBar ? .tabBar : .toolbar
45
+ )
46
+ }
47
+
48
+ private func tab(_ name: String, label: String, icon: String, title: String, badge: String? = nil) -> BottomTabItem {
49
+ BottomTabItem(
50
+ name: name,
51
+ label: label,
52
+ icon: icon,
53
+ badgeLabel: badge,
54
+ options: NavigationOptions(title: title, headerRightData: HeaderRightData(useShortcut: useShortcut)),
55
+ screen: { DuoTabList() }
56
+ )
57
+ }
58
+ }
59
+
60
+ private struct DuoTabList: View {
61
+ var body: some View {
62
+ VStack(spacing: 0) {
63
+ ForEach(history.indices, id: \.self) { index in
64
+ if index > 0 { MomoDivider() }
65
+ HStack(spacing: Spacing.M) {
66
+ RoundedRectangle(cornerRadius: Radius.S)
67
+ .fill(swatches[index % swatches.count])
68
+ .frame(width: Spacing.XL, height: Spacing.XL)
69
+ MomoText(history[index], typography: .bodyDefaultRegular)
70
+ Spacer()
71
+ }
72
+ .padding(.vertical, Spacing.M)
73
+ }
74
+ }
75
+ .padding(.horizontal, Spacing.M)
76
+ .background(Colors.black01)
77
+ .clipShape(RoundedRectangle(cornerRadius: Radius.M))
78
+ .padding(Spacing.M)
79
+ }
80
+ }
@@ -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),
@@ -84,6 +85,7 @@ public let ScreenUsages: [ScreenUsage] = [
84
85
  ScreenUsage(title: "DateTimePicker", destination: AnyView(DateTimePickerDemo()), icon: getIcon(icon: "Layout"), hostsOwnChrome: true),
85
86
  ScreenUsage(title: "Navigation", destination: AnyView(NavigationDemo()), icon: getIcon(icon: "Layout")),
86
87
  ScreenUsage(title: "Bottom Tab", destination: AnyView(BottomTabDemo()), icon: getIcon(icon: "Layout"), hostsOwnChrome: true),
88
+ ScreenUsage(title: "iPhone Duo", destination: AnyView(IPhoneDuoDemo()), icon: getIcon(icon: "Layout")),
87
89
  ScreenUsage(title: "Animated Header", destination: AnyView(AnimatedHeaderDemo()), icon: getIcon(icon: "Layout")),
88
90
  ScreenUsage(title: "Theme", destination: AnyView(ThemeDemo()), icon: getIcon(icon: "Typography")),
89
91
  ScreenUsage(title: "Localize", destination: AnyView(LocalizeDemo()), icon: getIcon(icon: "Typography")),
@@ -0,0 +1,173 @@
1
+ //
2
+ // IPhoneDuoDemo.swift
3
+ // Example
4
+ //
5
+ // Mirrors RN `app/screens/IPhoneDuo`: the live screen layout, an extended header + search
6
+ // + footer screen, the Duo tab bars, the popup / bottom sheet behaviour and a grid to scroll.
7
+ //
8
+
9
+ import MoMoUIKits
10
+ import SwiftUI
11
+
12
+ private let gridRows: [[Int]] = [[12], [6, 6], [4, 4, 4], [3, 3, 3, 3]]
13
+
14
+ // enough rows to scroll, so the header glass and side bar can be checked
15
+ private let scrollRows: [[Int]] = Array(repeating: gridRows, count: 4).flatMap { $0 }
16
+
17
+ struct IPhoneDuoDemo: View {
18
+ var body: some View {
19
+ if #available(iOS 16.0, *) {
20
+ IPhoneDuoDemoContent()
21
+ } else {
22
+ Text("Requires iOS 16+").padding()
23
+ }
24
+ }
25
+ }
26
+
27
+ @available(iOS 16.0, *)
28
+ private struct IPhoneDuoDemoContent: View {
29
+ @EnvironmentObject private var navigator: Navigator
30
+ @Environment(\.screenLayout) private var layout
31
+
32
+ var body: some View {
33
+ VStack(alignment: .leading, spacing: Spacing.M) {
34
+ VStack(spacing: 0) {
35
+ ForEach(info, id: \.0) { label, value in
36
+ HStack {
37
+ MomoText(label, typography: .bodyDefaultRegular)
38
+ Spacer()
39
+ MomoText(value, typography: .headerSSemibold)
40
+ }
41
+ .padding(.vertical, Spacing.XS)
42
+ }
43
+ }
44
+ .padding(.horizontal, Spacing.M)
45
+
46
+ VStack(spacing: Spacing.S) {
47
+ demoButton("Extended header + footer") {
48
+ navigator.push({ DuoGridScreen() }, options: extendedOptions)
49
+ }
50
+ demoButton("Glass tab bar") {
51
+ navigator.push({ DuoTabDemo(useShortcut: false) }, options: tabOptions)
52
+ }
53
+ demoButton("Glass tab bar + useShortcut") {
54
+ navigator.push({ DuoTabDemo(useShortcut: true) }, options: tabOptions)
55
+ }
56
+ demoButton("Glass tab bar + compress tab bar") {
57
+ navigator.push({ DuoTabDemo(useShortcut: true, compressTabBar: true) }, options: tabOptions)
58
+ }
59
+ demoButton("Bottom sheet: iPhone Duo safe area") {
60
+ navigator.showBottomSheet({ BottomSheetSafeArea() }, isSurface: true, header: .title("Safe area"))
61
+ }
62
+ demoButton("PopupNotify") {
63
+ navigator.showModal {
64
+ PopupNotify(props: PopupNotifyProps(
65
+ image: "https://static.momocdn.net/app/img/popup_permission/img_permission_popup_camera.png",
66
+ title: "Title",
67
+ description: String(repeating: "Check lại một nhịp auto chuyển sang dạng CTA. ", count: 8),
68
+ primary: PopupAction(title: "Đồng ý", onPress: { navigator.hideOverplay() }),
69
+ secondary: PopupAction(title: "Đóng", onPress: { navigator.hideOverplay() }),
70
+ onIconClose: { navigator.hideOverplay() }
71
+ ))
72
+ }
73
+ }
74
+ }
75
+ .padding(.horizontal, Spacing.M)
76
+
77
+ DuoGrid()
78
+ }
79
+ .padding(.vertical, Spacing.M)
80
+ }
81
+
82
+ private var info: [(String, String)] {
83
+ let insets = layout.insets
84
+ return [
85
+ ("iPhone Duo", layout.isIPhoneDuo ? "yes" : "no"),
86
+ ("Window", "\(Int(layout.width)) x \(Int(layout.height))"),
87
+ ("Safe area (T R B L)", "\(Int(insets.top)) \(Int(insets.trailing)) \(Int(insets.bottom)) \(Int(insets.leading))"),
88
+ ("Content inset (L R)", "\(Int(layout.insetLeft)) \(Int(layout.insetRight))"),
89
+ ("Content width", "\(Int(layout.contentWidth))"),
90
+ ("Header height", "\(Int(layout.headerHeight))"),
91
+ ("Side bar", layout.sideBar.map { "\($0.edge == .left ? "left" : "right"), \(Int($0.width))pt, top \(Int($0.top))" } ?? "none"),
92
+ ]
93
+ }
94
+
95
+ private var extendedOptions: NavigationOptions {
96
+ NavigationOptions(
97
+ title: "Extended",
98
+ headerType: .extended,
99
+ headerRightData: HeaderRightData(useShortcut: true),
100
+ footer: { AnyView(MoMoUIKits.Button(title: "Footer action", action: {}, size: .large)) }
101
+ )
102
+ }
103
+
104
+ private var tabOptions: NavigationOptions {
105
+ NavigationOptions(title: "Duo tabs", headerType: .none, scrollable: false)
106
+ }
107
+
108
+ private func demoButton(_ title: String, action: @escaping () -> Void) -> some View {
109
+ MoMoUIKits.Button(title: title, action: action, type: .secondary, size: .small)
110
+ }
111
+ }
112
+
113
+ private struct DuoGridScreen: View {
114
+ var body: some View {
115
+ DuoGrid().padding(.vertical, Spacing.M)
116
+ }
117
+ }
118
+
119
+ private struct DuoGrid: View {
120
+ var body: some View {
121
+ VStack(spacing: Spacing.M) {
122
+ ForEach(scrollRows.indices, id: \.self) { row in
123
+ SectionView {
124
+ ForEach(scrollRows[row].indices, id: \.self) { index in
125
+ let span = scrollRows[row][index]
126
+ ItemView(widthSpan: span) {
127
+ MomoText("span \(span)", typography: .descriptionDefaultRegular)
128
+ .frame(maxWidth: .infinity)
129
+ .frame(height: 48)
130
+ .background(Colors.black04)
131
+ .clipShape(RoundedRectangle(cornerRadius: Radius.S))
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+
140
+ /// Markers on the content edges show the side safe area inside the sheet.
141
+ private struct BottomSheetSafeArea: View {
142
+ @Environment(\.screenLayout) private var layout
143
+
144
+ var body: some View {
145
+ VStack(alignment: .leading, spacing: Spacing.XS) {
146
+ HStack {
147
+ marker("← content edge")
148
+ Spacer()
149
+ marker("content edge →")
150
+ }
151
+ .padding(.bottom, Spacing.S)
152
+ MomoText("Window: \(Int(layout.width)) × \(Int(layout.height))", typography: .bodyDefaultRegular)
153
+ MomoText(
154
+ "Insets: top \(Int(layout.insets.top)) · right \(Int(layout.insets.trailing)) · bottom \(Int(layout.insets.bottom)) · left \(Int(layout.insets.leading))",
155
+ typography: .bodyDefaultRegular
156
+ )
157
+ MomoText(
158
+ "On iPhone Duo: the outer display keeps a full-width sheet with content inside the side safe area; the inner display centers the sheet, still attached to the bottom edge. Other devices are unchanged.",
159
+ typography: .descriptionDefaultRegular,
160
+ color: Colors.black12
161
+ )
162
+ }
163
+ .padding(.vertical, Spacing.M)
164
+ }
165
+
166
+ private func marker(_ text: String) -> some View {
167
+ MomoText(text, typography: .labelSMedium, color: Colors.pink03)
168
+ .padding(.vertical, Spacing.XS)
169
+ .padding(.horizontal, Spacing.S)
170
+ .background(Colors.black04)
171
+ .clipShape(RoundedRectangle(cornerRadius: Radius.XS))
172
+ }
173
+ }
@@ -4,7 +4,7 @@
4
4
  //
5
5
  // Usage demo for the navigation flow. Mirrors Compose's `NavigationUsage`:
6
6
  // exercises push / present / replace / reset, the modal & bottom-sheet
7
- // overplays, the snack bar, the user header title and the bottom-tab layout.
7
+ // overplays, the snack bar, the header titles, runtime options and the bottom-tab layout.
8
8
  //
9
9
 
10
10
  import MoMoUIKits
@@ -149,6 +149,52 @@ private struct NavigationDemoContent: View {
149
149
  )
150
150
  }
151
151
 
152
+ row("Header Location Title") {
153
+ navigator.push(
154
+ { DemoLeafScreen(title: "Location title", color: Colors.blue09) },
155
+ options: NavigationOptions(
156
+ headerTitle: .location(
157
+ HeaderLocationData(description: "Deliver to", location: "123 Nguyen Hue, District 1", onPress: { print("location") })
158
+ )
159
+ )
160
+ )
161
+ }
162
+
163
+ row("Header Journey Title") {
164
+ navigator.push(
165
+ { DemoLeafScreen(title: "Journey title", color: Colors.pink09) },
166
+ options: NavigationOptions(
167
+ headerTitle: .journey(
168
+ HeaderJourneyData(start: "Ho Chi Minh", end: "Ha Noi", description: "Mon, 12/10 · 1 adult", icon: "16_arrow_chevron_right", onPress: { print("journey") })
169
+ )
170
+ )
171
+ )
172
+ }
173
+
174
+ row("Update Options At Runtime") {
175
+ navigator.push(
176
+ { UpdateOptionsScreen() },
177
+ options: NavigationOptions(title: "Before update")
178
+ )
179
+ }
180
+
181
+ row("Bottom Sheet With Footer") {
182
+ navigator.showBottomSheet({
183
+ VStack(spacing: 12) {
184
+ ForEach(0..<6, id: \.self) { i in
185
+ MomoText("Bottom sheet row \(i + 1)")
186
+ .frame(maxWidth: .infinity, alignment: .leading)
187
+ }
188
+ }
189
+ .padding(Spacing.L)
190
+ }, header: .title("Footer"), draggable: false, footer: {
191
+ AnyView(
192
+ MoMoUIKits.Button(title: "Confirm", action: { navigator.hideOverplay() }, type: .primary, size: .large)
193
+ .padding(.horizontal, Spacing.M)
194
+ )
195
+ })
196
+ }
197
+
152
198
  row("Header Animated") {
153
199
  navigator.push(
154
200
  { AnimatedHeaderDemoContent() },
@@ -177,6 +223,36 @@ private struct NavigationDemoContent: View {
177
223
 
178
224
  // MARK: - Leaf / presented screens
179
225
 
226
+ /// A screen changing its own header and footer after it is shown (Compose `LocalNavigation`).
227
+ @available(iOS 16.0, *)
228
+ private struct UpdateOptionsScreen: View {
229
+ @EnvironmentObject private var navigation: Navigation
230
+ @EnvironmentObject private var navigator: Navigator
231
+
232
+ var body: some View {
233
+ VStack(spacing: 16) {
234
+ MoMoUIKits.Button(title: "Change title", action: {
235
+ navigation.setOptions { $0.title = "Updated at \(Date().formatted(date: .omitted, time: .standard))" }
236
+ }, type: .primary, size: .large)
237
+ MoMoUIKits.Button(title: "Add footer", action: {
238
+ navigation.setOptions {
239
+ $0.footer = { AnyView(MoMoUIKits.Button(title: "Footer action", action: {}, type: .primary, size: .large)) }
240
+ }
241
+ }, type: .secondary, size: .large)
242
+ MoMoUIKits.Button(title: "Show snack bar above the footer", action: {
243
+ navigator.showSnackBar(.custom(duration: 2.0) {
244
+ MomoText("Snack bar", color: Colors.black01)
245
+ .frame(maxWidth: .infinity, minHeight: 48)
246
+ .background(Colors.black17)
247
+ .clipShape(RoundedRectangle(cornerRadius: Radius.M))
248
+ .padding(.horizontal, Spacing.M)
249
+ })
250
+ }, type: .secondary, size: .large)
251
+ }
252
+ .padding(16)
253
+ }
254
+ }
255
+
180
256
  @available(iOS 16.0, *)
181
257
  private struct DemoLeafScreen: View {
182
258
  @EnvironmentObject private var navigator: Navigator
@@ -160,6 +160,7 @@ private struct PopupDisplayDemoContent: View {
160
160
  errorCode: errorCode,
161
161
  isShowCloseIcon: showCloseIcon
162
162
  )
163
+ .padding(.horizontal, Spacing.M)
163
164
  }
164
165
  }
165
166
  }
@@ -26,7 +26,7 @@ private struct PopupNotifyPreview: View {
26
26
  private func show() {
27
27
  navigator.showModal {
28
28
  PopupNotify(props: PopupNotifyProps(
29
- image: "https://i.imgur.com/s70S9s9.png",
29
+ image: "https://static.momocdn.net/app/img/popup_permission/img_permission_popup_camera.png",
30
30
  title: "Title",
31
31
  description: "Check lại một nhịp auto chuyển sang dạng CTA.",
32
32
  error: "9004",
@@ -50,7 +50,7 @@ private let popupDirectionList: [PlaygroundOption] = [
50
50
  @available(iOS 16.0, *)
51
51
  private struct PopupNotifyPlayground: View {
52
52
  @EnvironmentObject private var navigator: Navigator
53
- @State private var image = "https://i.imgur.com/s70S9s9.png"
53
+ @State private var image = "https://static.momocdn.net/app/img/popup_permission/img_permission_popup_camera.png"
54
54
  @State private var title = "Title"
55
55
  @State private var description = "Check lại một nhịp auto chuyển sang dạng CTA."
56
56
  @State private var error = "9004"
@@ -37,6 +37,7 @@ private struct PopupPromotionPreview: View {
37
37
  private func show(_ url: String) {
38
38
  navigator.showModal {
39
39
  PopupPromotion(imageUrl: url, onIconClose: { navigator.hideOverplay() }, onAction: { navigator.hideOverplay() })
40
+ .padding(.horizontal, Spacing.M)
40
41
  }
41
42
  }
42
43
  }
@@ -62,6 +63,7 @@ private struct PopupPromotionPlayground: View {
62
63
  private func show() {
63
64
  navigator.showModal {
64
65
  PopupPromotion(imageUrl: imageUrl, onIconClose: { navigator.hideOverplay() }, onAction: { navigator.hideOverplay() })
66
+ .padding(.horizontal, Spacing.M)
65
67
  }
66
68
  }
67
69
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momo-kits/native-kits",
3
- "version": "0.300.3-debug",
3
+ "version": "0.300.4-debug",
4
4
  "private": false,
5
5
  "dependeNavigationncies": {},
6
6
  "devDependencies": {},
package/publish.sh CHANGED
@@ -379,6 +379,10 @@ phase_publish_npm() {
379
379
  exit 1
380
380
  fi
381
381
 
382
+ if [ -e gradle.properties.npm-backup ]; then
383
+ echo "❌ Error: gradle.properties.npm-backup already exists; recover it before publishing."
384
+ exit 1
385
+ fi
382
386
  echo "🔧 Preparing debug version with compose kits..."
383
387
 
384
388
  # Create debug version
@@ -389,6 +393,7 @@ phase_publish_npm() {
389
393
  restore_npm_workspace() {
390
394
  [ -f .npmignore.backup ] && mv .npmignore.backup .npmignore
391
395
  [ -f compose/build.gradle.kts.backup ] && mv compose/build.gradle.kts.backup compose/build.gradle.kts
396
+ [ -f gradle.properties.npm-backup ] && mv gradle.properties.npm-backup gradle.properties
392
397
  local pkg_version
393
398
  pkg_version=$(node -p "require('./package.json').version")
394
399
  if [ "$pkg_version" != "$VERSION" ]; then
@@ -400,6 +405,14 @@ phase_publish_npm() {
400
405
  fi
401
406
  }
402
407
  trap restore_npm_workspace EXIT
408
+ cp gradle.properties gradle.properties.npm-backup
409
+ node <<'NODE'
410
+ const fs = require('fs');
411
+ const path = 'gradle.properties';
412
+ const sanitized = fs.readFileSync(path, 'utf8')
413
+ .replace(/^(gitlab\.(?:user|password)\s*=).*$/gm, '$1');
414
+ fs.writeFileSync(path, sanitized);
415
+ NODE
403
416
  echo "📦 Debug version: $DEBUG_VERSION"
404
417
 
405
418
  # Get current version from package.json (in case it's different from $VERSION)
@@ -436,12 +449,14 @@ phase_publish_npm() {
436
449
  echo "🔧 Modifying android configuration for debug version..."
437
450
  if [[ "$OSTYPE" == "darwin"* ]]; then
438
451
  sed -i '' 's/namespace = "\$gitlabGroup\.\$gitlabArtifactId"/namespace = "vn.momo.kits.kits"/' compose/build.gradle.kts
439
- sed -i '' 's/compileSdk = libs\.versions\.android\.compileSdk\.get()\.toInt()/compileSdk = 35/' compose/build.gradle.kts
452
+ sed -i '' \
453
+ 's/compileSdk = libs\.versions\.android\.compileSdk\.get()\.toInt()/compileSdk = 36/' compose/build.gradle.kts
440
454
  sed -i '' 's/minSdk = libs\.versions\.android\.minSdk\.get()\.toInt()/minSdk = 24/' compose/build.gradle.kts
441
455
  sed -i '' "s/version = gitlabVersion/version = \"$DEBUG_VERSION\"/" compose/build.gradle.kts
442
456
  else
443
457
  sed -i 's/namespace = "\$gitlabGroup\.\$gitlabArtifactId"/namespace = "vn.momo.kits.kits"/' compose/build.gradle.kts
444
- sed -i 's/compileSdk = libs\.versions\.android\.compileSdk\.get()\.toInt()/compileSdk = 35/' compose/build.gradle.kts
458
+ sed -i \
459
+ 's/compileSdk = libs\.versions\.android\.compileSdk\.get()\.toInt()/compileSdk = 36/' compose/build.gradle.kts
445
460
  sed -i 's/minSdk = libs\.versions\.android\.minSdk\.get()\.toInt()/minSdk = 24/' compose/build.gradle.kts
446
461
  sed -i "s/version = gitlabVersion/version = \"$DEBUG_VERSION\"/" compose/build.gradle.kts
447
462
  fi
@@ -463,6 +478,7 @@ build/
463
478
  .gitattributes
464
479
  .gitlab-ci.yml
465
480
  .npmignore.backup
481
+ gradle.properties.npm-backup
466
482
  EOF
467
483
 
468
484
  echo "📤 Publishing debug version (with compose)..."
@@ -477,6 +493,7 @@ EOF
477
493
  # Restore compose/build.gradle.kts
478
494
  mv compose/build.gradle.kts.backup compose/build.gradle.kts
479
495
  echo "✅ compose/build.gradle.kts restored"
496
+ mv gradle.properties.npm-backup gradle.properties
480
497
 
481
498
  # Restore package.json version to original
482
499
  # Verify current version is debug version before restoring
@@ -0,0 +1,36 @@
1
+ // Generates ios/Icon/Icons.swift from the Compose icon map so both kits ship the same
2
+ // compiled-in icons. Run from anywhere: `node scripts/gen-ios-icons.mjs`.
3
+ import { readFileSync, writeFileSync } from "fs";
4
+ import { dirname, join } from "path";
5
+ import { fileURLToPath } from "url";
6
+
7
+ const root = join(dirname(fileURLToPath(import.meta.url)), "..");
8
+ const source = join(root, "compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt");
9
+ const target = join(root, "ios/Icon/Icons.swift");
10
+
11
+ const kotlin = readFileSync(source, "utf8");
12
+ const kotlinString = String.raw`"((?:[^"\\]|\\.)*)"`;
13
+ const unescapeKotlin = (s) => s.replace(/\\(["\\$])/g, "$1");
14
+ const swiftString = (s) => `"${s.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
15
+
16
+ const icons = [...kotlin.matchAll(new RegExp(`^\\s*${kotlinString} to ${kotlinString}`, "gm"))]
17
+ .map(([, key, url]) => [unescapeKotlin(key), unescapeKotlin(url)]);
18
+ const noThemeBlock = kotlin.match(/val noThemeIcons = listOf\(([^)]*)\)/);
19
+ const noTheme = noThemeBlock
20
+ ? [...noThemeBlock[1].matchAll(new RegExp(kotlinString, "g"))].map(([, s]) => unescapeKotlin(s))
21
+ : [];
22
+
23
+ if (icons.length === 0) throw new Error(`No icons parsed from ${source}`);
24
+ if (new Set(icons.map(([key]) => key)).size !== icons.length) throw new Error("Duplicate icon keys");
25
+
26
+ const swift = `// Generated by scripts/gen-ios-icons.mjs from compose/.../utils/Icons.kt. Do not edit by hand.
27
+
28
+ let kitIcons: [String: String] = [
29
+ ${icons.map(([key, url]) => ` ${swiftString(key)}: ${swiftString(url)},`).join("\n")}
30
+ ]
31
+
32
+ let noThemeIcons: [String] = [${noTheme.map(swiftString).join(", ")}]
33
+ `;
34
+
35
+ writeFileSync(target, swift);
36
+ console.log(`Wrote ${icons.length} icons (${noTheme.length} untinted) to ${target}`);
@@ -1,52 +0,0 @@
1
- package vn.momo.kits.application
2
-
3
- import androidx.compose.foundation.background
4
- import androidx.compose.foundation.layout.*
5
- import androidx.compose.foundation.shape.RoundedCornerShape
6
- import androidx.compose.runtime.Composable
7
- import androidx.compose.ui.Modifier
8
- import androidx.compose.ui.graphics.Color
9
- import androidx.compose.ui.unit.dp
10
- import androidx.compose.ui.zIndex
11
- import vn.momo.kits.components.InputSearch
12
- import vn.momo.kits.components.InputSearchProps
13
- import vn.momo.kits.const.Radius
14
- import vn.momo.kits.const.Spacing
15
-
16
- @Composable
17
- internal fun AnimationSearchInput(
18
- animations: HeaderAnimations,
19
- inputSearchProps: InputSearchProps
20
- ) {
21
- Box(
22
- modifier = Modifier
23
- .fillMaxWidth()
24
- .offset(
25
- x = animations.translateX.dp,
26
- y = animations.translateY.dp
27
- )
28
- ) {
29
- Box(
30
- modifier = Modifier
31
- .height(HEADER_HEIGHT.dp)
32
- .padding(vertical = Spacing.S)
33
- .zIndex(1f)
34
- ) {
35
- Box(
36
- modifier = Modifier
37
- .width(animations.width.dp)
38
- .background(
39
- color = animations.backgroundSearch,
40
- shape = RoundedCornerShape(Radius.XL)
41
- )
42
- ) {
43
- InputSearch(
44
- inputSearchProps = inputSearchProps.copy(
45
- showButtonText = false,
46
- backgroundColor = Color.Transparent
47
- )
48
- )
49
- }
50
- }
51
- }
52
- }