@momo-kits/native-kits 0.167.1-duo.2-debug → 0.167.1-duo.20

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 (266) hide show
  1. package/CLAUDE.md +36 -8
  2. package/README.md +2 -2
  3. package/ios/Application/ApplicationEnvironment.swift +17 -0
  4. package/ios/Application/MaxApi.swift +12 -3
  5. package/ios/Avatar/Avatar.swift +4 -3
  6. package/ios/Badge/Badge.swift +6 -4
  7. package/ios/Badge/BadgeDot.swift +1 -1
  8. package/ios/Badge/BadgeRibbon.swift +0 -1
  9. package/ios/Button/Button.swift +15 -12
  10. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +64 -18
  11. package/ios/Carousel/Carousel.swift +29 -12
  12. package/ios/Checkbox/Checkbox.swift +7 -3
  13. package/ios/Chip/Chip.swift +5 -4
  14. package/ios/Collapse/Collapse.swift +70 -19
  15. package/ios/Colors+Radius+Spacing/Colors.swift +10 -1
  16. package/ios/Colors+Radius+Spacing/Radius.swift +6 -0
  17. package/ios/DateTimePicker/DateTimePicker.swift +54 -20
  18. package/ios/DateTimePicker/WheelPicker.swift +103 -105
  19. package/ios/Divider/Divider.swift +37 -4
  20. package/ios/Extensions/Color++.swift +38 -9
  21. package/ios/Extensions/OptionalEnvironmentObject.swift +12 -0
  22. package/ios/Extensions/SkeletonUICompat.swift +11 -0
  23. package/ios/Icon/Icon.swift +21 -23
  24. package/ios/Icon/Icons.swift +1329 -0
  25. package/ios/IconButton/IconButton.swift +15 -7
  26. package/ios/Image/Image.swift +7 -23
  27. package/ios/Information/Information.swift +27 -9
  28. package/ios/Input/ErrorView.swift +2 -2
  29. package/ios/Input/Input.swift +160 -147
  30. package/ios/Input/InputPhoneNumber.swift +12 -9
  31. package/ios/Input/InputSearch.swift +102 -75
  32. package/ios/Input/InputTextArea.swift +128 -145
  33. package/ios/InputDropDown/InputDropDown.swift +10 -7
  34. package/ios/InputMoney/InputMoney.swift +33 -11
  35. package/ios/InputOTP/InputOTP.swift +22 -12
  36. package/ios/Layout/Card.swift +50 -0
  37. package/ios/Layout/GridContext.swift +187 -3
  38. package/ios/Layout/Item.swift +5 -4
  39. package/ios/Layout/ScreenLayout.swift +380 -0
  40. package/ios/Layout/Section.swift +4 -100
  41. package/ios/Loader/Loader.swift +5 -9
  42. package/ios/Lottie/LottieView.swift +14 -2
  43. package/ios/{Application/Navigation/Overplay → Navigation}/BottomSheet.swift +128 -9
  44. package/ios/Navigation/BottomTab/BottomTab.swift +185 -0
  45. package/ios/{Application/Navigation → Navigation}/BottomTab/BottomTabBar.swift +15 -7
  46. package/ios/Navigation/BottomTab/DuoBarCompression.swift +105 -0
  47. package/ios/Navigation/BottomTab/DuoTabBar.swift +304 -0
  48. package/ios/{Application → Navigation/Component}/FloatingButton.swift +14 -3
  49. package/ios/Navigation/Component/Header.swift +531 -0
  50. package/ios/Navigation/Component/HeaderBackground.swift +133 -0
  51. package/ios/Navigation/Component/HeaderJourney.swift +73 -0
  52. package/ios/Navigation/Component/HeaderLocation.swift +48 -0
  53. package/ios/Navigation/Component/HeaderRight.swift +377 -0
  54. package/ios/Navigation/Component/HeaderTitle.swift +36 -0
  55. package/ios/{Application/Navigation → Navigation/Component}/HeaderUser.swift +21 -24
  56. package/ios/Navigation/Component/SideBar.swift +183 -0
  57. package/ios/{Application/Navigation/Overplay → Navigation/Component}/SnackBar.swift +5 -6
  58. package/ios/Navigation/HostBackGestureBridge.swift +78 -0
  59. package/ios/{Application/Navigation/Overplay → Navigation}/ModalScreen.swift +5 -2
  60. package/ios/Navigation/Navigation.swift +204 -0
  61. package/ios/Navigation/NavigationContainer.swift +194 -0
  62. package/ios/{Application/Navigation → Navigation}/Navigator.swift +177 -91
  63. package/ios/Navigation/StackScreen.swift +820 -0
  64. package/ios/Navigation/StackTransition.swift +400 -0
  65. package/ios/Navigation/SwipeBackHaptic.swift +33 -0
  66. package/ios/{Application/Navigation → Navigation}/Tracking/ScreenTracker.swift +12 -5
  67. package/ios/OTPKeyboard/OTPKeyboard.swift +8 -11
  68. package/ios/Pagination/PaginationScroll.swift +2 -2
  69. package/ios/Popup/PopupDisplay.swift +72 -136
  70. package/ios/Popup/PopupInput.swift +10 -13
  71. package/ios/Popup/PopupLayout.swift +140 -0
  72. package/ios/Popup/PopupNotify.swift +56 -73
  73. package/ios/Popup/PopupPromotion.swift +31 -47
  74. package/ios/PopupView/FullscreenPopup.swift +13 -19
  75. package/ios/PopupView/PopupView.swift +1 -1
  76. package/ios/PopupView/Utils++.swift +0 -8
  77. package/ios/ProgressInfo/ProgressInfo.swift +4 -2
  78. package/ios/Radio/Radio.swift +2 -1
  79. package/ios/Rating/Rating.swift +9 -1
  80. package/ios/Resources/dot_loading.json +558 -0
  81. package/ios/Resources/lottie_circle_loader.json +1 -0
  82. package/ios/ScrollIndicator/ScrollIndicator.swift +11 -10
  83. package/ios/Skeleton/Skeleton.swift +22 -27
  84. package/ios/Slider/Slider.swift +16 -18
  85. package/ios/Stepper/Stepper.swift +6 -1
  86. package/ios/Steps/Steps.swift +8 -6
  87. package/ios/SuggestAction/SuggestAction.swift +5 -0
  88. package/ios/Swipeable/SwipeCell.swift +10 -6
  89. package/ios/Switch/Switch.swift +22 -20
  90. package/ios/TabView/TabView.swift +102 -21
  91. package/ios/Tag/Tag.swift +15 -4
  92. package/ios/Template/Logo/Logo.swift +2 -1
  93. package/ios/Template/TrustBanner/TrustBanner.swift +106 -54
  94. package/ios/Title/Title.swift +6 -17
  95. package/ios/Tooltip/Tooltip.swift +29 -14
  96. package/ios/Typography/Text.swift +61 -19
  97. package/ios/Uploader/Uploader.swift +3 -1
  98. package/ios/native-kits.podspec +2 -1
  99. package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
  100. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +1 -1
  101. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DuoTabDemo.swift +80 -0
  102. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +1 -0
  103. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IPhoneDuoDemo.swift +173 -0
  104. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +77 -1
  105. package/package.json +1 -1
  106. package/scripts/gen-ios-icons.mjs +36 -0
  107. package/build.gradle.kts +0 -11
  108. package/compose/build.gradle.kts +0 -190
  109. package/compose/build.gradle.kts.backup +0 -190
  110. package/compose/compose.podspec +0 -47
  111. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  112. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  113. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  114. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  115. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -151
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -831
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -189
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -475
  149. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  150. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -266
  151. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
  152. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  153. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -264
  154. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  155. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  156. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  157. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  158. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  159. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  160. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  161. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -334
  162. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -98
  163. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
  164. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -552
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
  176. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  177. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  178. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -16
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -297
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -54
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -50
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +0 -157
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -41
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  199. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  200. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  201. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  202. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  203. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -299
  204. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +0 -58
  205. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -129
  206. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  207. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -205
  208. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  209. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  210. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -622
  211. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  212. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  213. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -175
  214. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -232
  215. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  216. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  217. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -381
  218. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -83
  219. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -105
  220. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -74
  221. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -347
  222. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -37
  223. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -363
  224. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +0 -169
  225. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  226. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  227. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  228. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  229. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  230. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -71
  231. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  232. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  233. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  234. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -118
  235. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -40
  236. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -45
  237. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  238. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  239. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  240. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -213
  241. package/gradle/libs.versions.toml +0 -69
  242. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  243. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  244. package/gradle.properties +0 -26
  245. package/gradlew +0 -252
  246. package/gradlew.bat +0 -94
  247. package/ios/Application/Components.swift +0 -270
  248. package/ios/Application/ComposeApi.swift +0 -22
  249. package/ios/Application/HeaderRight.swift +0 -306
  250. package/ios/Application/Navigation/BottomTab/BottomTab.swift +0 -104
  251. package/ios/Application/Navigation/HeaderBackProps.swift +0 -66
  252. package/ios/Application/Navigation/HeaderTitle.swift +0 -57
  253. package/ios/Application/Navigation/NavigationContainer.swift +0 -213
  254. package/ios/Application/Navigation/NavigationOptions.swift +0 -109
  255. package/ios/Application/Navigation/NavigatorManager.swift +0 -22
  256. package/ios/Application/Navigation/component/Header.swift +0 -178
  257. package/ios/Application/Navigation/component/HeaderBackground.swift +0 -83
  258. package/ios/Application/Navigation/component/HeaderColor.swift +0 -65
  259. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +0 -11
  260. package/ios/Application/Navigation/component/NavigationFooter.swift +0 -90
  261. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +0 -196
  262. package/ios/Application/Screen.swift +0 -250
  263. package/ios/Application/StackScreen.swift +0 -492
  264. package/ios-demo/README.md +0 -120
  265. package/settings.gradle.kts +0 -64
  266. /package/ios/{Application/Navigation → Navigation}/BottomTab/CurvedContainer.swift +0 -0
@@ -1,83 +0,0 @@
1
- //
2
- // HeaderBackground.swift
3
- // MoMoUIKits
4
- //
5
- // SwiftUI mirror of Compose's `HeaderBackground` (navigation/component/HeaderBackground.kt).
6
- // Paints the header band behind the `Header`: a flat surface for `.default`,
7
- // the taller pink gradient for `.extended`, fading out as the screen scrolls.
8
- // Stays transparent when the header is transparent or the content is full-screen.
9
- //
10
- // Named `NavigationHeaderBackground` to coexist with the legacy
11
- // `HeaderBackground` in `Components.swift` (kept as-is, used as a package
12
- // elsewhere; to be marked deprecated later). Used by the new `StackScreen`.
13
- //
14
-
15
- import SwiftUI
16
-
17
- public struct NavigationHeaderBackground: View {
18
- var headerType: HeaderType = .default
19
- var scrollState: CGFloat
20
- var headerTransparent: Bool = false
21
- var fullScreenContent: Bool = false
22
-
23
- public init(
24
- headerType: HeaderType = .default,
25
- scrollState: CGFloat = 0,
26
- headerTransparent: Bool = false,
27
- fullScreenContent: Bool = false
28
- ) {
29
- self.headerType = headerType
30
- self.scrollState = scrollState
31
- self.headerTransparent = headerTransparent
32
- self.fullScreenContent = fullScreenContent
33
- }
34
-
35
- private func pinkGradient(topColor: Color, bottomColor: Color) -> LinearGradient {
36
- LinearGradient(
37
- gradient: Gradient(colors: [
38
- topColor,
39
- bottomColor
40
- ]),
41
- startPoint: .top,
42
- endPoint: .bottom
43
- )
44
- }
45
-
46
- public var body: some View {
47
- let statusBarHeight = safeAreaTopInset()
48
- let opacity = max(0, 1 - scrollState / CGFloat(HEADER_HEIGHT))
49
- let minHeight = fullScreenContent ? 0 : statusBarHeight + HEADER_HEIGHT
50
- let maxHeight: CGFloat = 154
51
- let backgroundColor = headerTransparent ? Color.clear : Colors.black01
52
- let topColor = opacity == 0 ? backgroundColor : Color(hex: 0xFDCADE)
53
-
54
- Group {
55
- switch headerType {
56
- case .default:
57
- ZStack(alignment: .bottom) {
58
- backgroundColor
59
- .frame(height: minHeight)
60
- if !headerTransparent {
61
- pinkGradient(topColor: topColor, bottomColor: backgroundColor)
62
- .frame(height: maxHeight)
63
- .frame(height: minHeight, alignment: .top)
64
- .clipped()
65
- }
66
- }
67
-
68
- case .extended:
69
- ZStack {
70
- if !headerTransparent {
71
- backgroundColor
72
- .frame(height: maxHeight)
73
- pinkGradient(topColor: topColor, bottomColor: backgroundColor)
74
- .frame(height: maxHeight)
75
- }
76
- }
77
-
78
- case .none:
79
- EmptyView()
80
- }
81
- }
82
- }
83
- }
@@ -1,65 +0,0 @@
1
- //
2
- // HeaderColor.swift
3
- // MoMoUIKits
4
- //
5
- // SwiftUI mirror of Compose's `HeaderColor` + `getHeaderColor`
6
- // (navigation/component/Header.kt). Resolves the back-button / control colors
7
- // for the header based on whether it sits over an animated (image) header and
8
- // how far the screen has scrolled.
9
- //
10
-
11
- import SwiftUI
12
-
13
- /// Header band height, mirrors Compose's `HEADER_HEIGHT`.
14
- public let HEADER_HEIGHT: CGFloat = 52
15
-
16
- /// Mirrors Compose's `enum InputSearchType`.
17
- enum NavInputSearchType {
18
- case none, header, animated
19
- }
20
-
21
- /// Mirrors Compose's `HeaderColor`.
22
- public struct HeaderColor {
23
- public let tintIconColor: Color
24
- public let backgroundButton: Color
25
- public let borderColor: Color
26
- }
27
-
28
- /// Mirrors Compose's `getHeaderColor`. On iOS the "animated" header is expressed
29
- /// via a non-nil `animatedHeader`, so we pass `isAnimated`/`isSurface` instead of
30
- /// the Compose `HeaderType.Animated` case.
31
- func getHeaderColor(
32
- isAnimated: Bool,
33
- isSurface: Bool,
34
- opacity: CGFloat,
35
- tintColor: Color?,
36
- defaultColor: Color = Colors.black17
37
- ) -> HeaderColor {
38
- if isAnimated {
39
- if opacity >= 1 || !isSurface {
40
- return HeaderColor(
41
- tintIconColor: Colors.black17,
42
- backgroundButton: Colors.black01.opacity(0.6),
43
- borderColor: Colors.black20.opacity(0.2)
44
- )
45
- }
46
- return HeaderColor(
47
- tintIconColor: Colors.black01,
48
- backgroundButton: Colors.black20.opacity(0.6),
49
- borderColor: .clear
50
- )
51
- }
52
-
53
- if tintColor == Colors.black01 {
54
- return HeaderColor(
55
- tintIconColor: Colors.black01,
56
- backgroundButton: Colors.black20.opacity(0.6),
57
- borderColor: Colors.black01.opacity(0.2)
58
- )
59
- }
60
- return HeaderColor(
61
- tintIconColor: tintColor ?? defaultColor,
62
- backgroundButton: Colors.black01.opacity(0.6),
63
- borderColor: Colors.black20.opacity(0.2)
64
- )
65
- }
@@ -1,11 +0,0 @@
1
- import SwiftUI
2
-
3
- /// Reports the measured width of the header-right area so the animated search
4
- /// header can compute its trailing inset (mirrors Compose's headerRightWidthPx).
5
- /// Written by the header views (`NavigationHeader`) and read by `StackScreen`.
6
- public struct HeaderRightWidthKey: PreferenceKey {
7
- public static var defaultValue: CGFloat = 0
8
- public static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
9
- value = max(value, nextValue())
10
- }
11
- }
@@ -1,90 +0,0 @@
1
- //
2
- // NavigationFooter.swift
3
- // MoMoUIKits
4
- //
5
- // SwiftUI mirror of Compose's `Footer` (navigation/StackScreen.kt): the band
6
- // pinned under the screen content — surface background, S/M padding, the
7
- // navigation-bar reserve, and the 6pt gradient shadow cast up onto the content.
8
- //
9
- // Named `NavigationFooter` to coexist with the legacy `Footer` in `Screen.swift`
10
- // (kept as-is for the old `Screen` path). Used by `StackScreen`.
11
- //
12
-
13
- import SwiftUI
14
-
15
- public struct NavigationFooter: View {
16
- /// Compose's `footerComponent`: nothing renders when nil.
17
- var footerComponent: (() -> AnyView)?
18
- /// Current keyboard height, measured from the bottom of the screen.
19
- var keyboardSize: CGFloat
20
-
21
- public init(
22
- footerComponent: (() -> AnyView)?,
23
- keyboardSize: CGFloat = 0
24
- ) {
25
- self.footerComponent = footerComponent
26
- self.keyboardSize = keyboardSize
27
- }
28
-
29
- @Environment(\.appTheme) private var theme
30
-
31
- /// Read from the window, not from an enclosing `GeometryProxy`: the proxy's bottom
32
- /// inset grows to the keyboard height while the keyboard is up.
33
- static var safeAreaBottom: CGFloat {
34
- UIApplication.shared.connectedScenes
35
- .compactMap { ($0 as? UIWindowScene)?.keyWindow?.safeAreaInsets.bottom }
36
- .first ?? 0
37
- }
38
-
39
- /// Compose's `AppNavigationBar.current` (`getNavigationBarHeight` clamps iOS to 21pt).
40
- static var navigationBarInset: CGFloat { min(safeAreaBottom, 21) }
41
-
42
- /// Compose's `bottomPadding + Spacing.S` with the keyboard down. The footer is laid
43
- /// out inside the safe area, which already covers part of that gap.
44
- static var bottomPadding: CGFloat {
45
- max(navigationBarInset + Spacing.S - safeAreaBottom, 0)
46
- }
47
-
48
- /// Deliberately an offset and not padding: growing the footer feeds back into SwiftUI's
49
- /// keyboard avoidance, so a padding-based lift never settles at the right place.
50
- /// Negative lifts the band over the keyboard; positive shaves the few points by which
51
- /// the safe area over-reserves compared to Compose. `FloatingContent` rides the same
52
- /// amount so the FAB keeps its distance above the band.
53
- ///
54
- /// Natural position is `safeAreaBottom + bottomPadding` above the bottom of the screen;
55
- /// Compose puts it at `(AppNavigationBar - keyboard).coerceAtLeast(0) + Spacing.S` on
56
- /// top of the `imePadding()` lift — i.e. `max(navigationBar, keyboard) + Spacing.S`.
57
- static func verticalOffset(keyboardSize: CGFloat) -> CGFloat {
58
- (safeAreaBottom + bottomPadding) - (max(navigationBarInset, keyboardSize) + Spacing.S)
59
- }
60
-
61
- public var body: some View {
62
- if let footerComponent = footerComponent {
63
- VStack(alignment: .leading, spacing: 0) {
64
- footerComponent()
65
- }
66
- .frame(maxWidth: .infinity, alignment: .leading)
67
- .padding(.top, Spacing.S)
68
- .padding(.horizontal, Spacing.M)
69
- .padding(.bottom, Self.bottomPadding)
70
- // Compose paints the surface all the way to the bottom of the screen; the
71
- // footer's own frame stops at the safe area, so only the fill bleeds down.
72
- .background(theme.colors.background.surface.ignoresSafeArea(.container, edges: .bottom))
73
- .overlay(alignment: .top) { shadow }
74
- .offset(y: Self.verticalOffset(keyboardSize: keyboardSize))
75
- }
76
- }
77
-
78
- /// Compose offsets the shadow box by -6dp, so it lands on the content above the
79
- /// footer rather than on the footer surface itself.
80
- private var shadow: some View {
81
- LinearGradient(
82
- colors: [Color.clear, Color.black.opacity(0.05)],
83
- startPoint: .top,
84
- endPoint: .bottom
85
- )
86
- .frame(height: 6)
87
- .offset(y: -6)
88
- .allowsHitTesting(false)
89
- }
90
- }
@@ -1,196 +0,0 @@
1
- import SwiftUI
2
- import Foundation
3
-
4
- /// Keyed (`@Environment(\.applicationEnvironment)`) variant of `HeaderRight`, for hosts
5
- /// wired through `NavigationContainer`/`KitContainer` (the injection style introduced by
6
- /// MR 227 / DS-637). Reuses the shared data types (`HeaderRightData`, `Tool`, `ToolGroup`)
7
- /// and `NavigationButton` from `HeaderRight.swift`. The legacy `HeaderRight` there stays on
8
- /// `@EnvironmentObject` for hosts that render `Screen` directly with
9
- /// `.environmentObject(ApplicationEnvironment(...))`. Opt in per screen with
10
- /// `headerRight: { NavigationHeaderRight() }`.
11
- public struct NavigationHeaderRight: View {
12
- public init(headerRight: HeaderRightData? = nil, tintColor: Color? = nil) {
13
- self.headerRight = headerRight
14
- self.tintColor = tintColor
15
- }
16
- var headerRight: HeaderRightData?
17
- var tintColor: Color? = nil
18
-
19
- public var body: some View {
20
- HStack(alignment: .center) {
21
- ToolkitNavigationHeaderRight(headerRight: headerRight, tintColor: tintColor)
22
- }
23
- }
24
- }
25
-
26
- struct ToolkitNavigationHeaderRight: View {
27
- var headerRight: HeaderRightData?
28
- var tintColor: Color?
29
- @State private var isFavorite: Bool = false
30
- @State private var isLoading: Bool = false
31
- @Environment(\.applicationEnvironment) private var environment
32
-
33
- private func apiValue(_ value: Any?) -> Any {
34
- value ?? NSNull()
35
- }
36
-
37
- private var contextMap: [String: Any] {
38
- let context = environment.applicationContext
39
- return [
40
- "appId": apiValue(context?.appId),
41
- "code": apiValue(context?.appCode),
42
- "name": apiValue(context?.appName),
43
- "icon": apiValue(context?.appIcon),
44
- "description": apiValue(context?.description),
45
- "support": apiValue(context?.support),
46
- "toolkitConfig": apiValue(context?.toolkitConfig),
47
- "providerId": apiValue(context?.providerId),
48
- "permissions": apiValue(context?.permissions)
49
- ]
50
- }
51
-
52
- private var shouldShowShortcut: Bool {
53
- headerRight?.useShortcut == true && !(headerRight?.useMore == true && environment.applicationContext == nil)
54
- }
55
-
56
- private func parseResponse(_ response: String) -> Any? {
57
- guard let jsonData = response.data(using: .utf8),
58
- let json = try? JSONSerialization.jsonObject(with: jsonData) as? [String: Any] else {
59
- return nil
60
- }
61
- return json["response"]
62
- }
63
-
64
- // MARK: - Actions
65
- private func loadFavoriteState() {
66
- environment.composeApi?.request(
67
- funcName: "isFavoriteApp",
68
- params: ["code": apiValue(environment.applicationContext?.appCode)]
69
- ) { response in
70
- if let isFavorite = parseResponse(response) as? Bool {
71
- self.isFavorite = isFavorite
72
- }
73
- }
74
- }
75
-
76
- private func onPressShortcut() {
77
- environment.composeApi?.request(
78
- funcName: "onToolAction",
79
- params: [
80
- "item": ["key": "onFavorite"],
81
- "context": contextMap
82
- ]
83
- ) { response in
84
- if let result = parseResponse(response) as? [String: Any],
85
- result["success"] as? Bool == true {
86
- isFavorite.toggle()
87
- }
88
- }
89
- }
90
-
91
- private func onPressHelpCenter() {
92
- environment.composeApi?.request(
93
- funcName: "showHelpCenter",
94
- params: [
95
- "appId": apiValue(environment.applicationContext?.appId),
96
- "code": apiValue(environment.applicationContext?.appCode),
97
- "name": apiValue(environment.applicationContext?.appName),
98
- "icon": apiValue(environment.applicationContext?.appIcon),
99
- "description": apiValue(environment.applicationContext?.description)
100
- ]
101
- ) { _ in }
102
- }
103
-
104
- private func onPressClose() {
105
- environment.composeApi?.request(
106
- funcName: "dismissAll",
107
- params: nil
108
- ) { _ in }
109
- }
110
-
111
- private func onPressMore() {
112
- let params: [String: Any] = [
113
- "useSystemTools": headerRight?.useSystemTools ?? true,
114
- "tools": headerRight?.tools.map { $0.toMap() } ?? [],
115
- "context": contextMap
116
- ]
117
- environment.composeApi?.request(
118
- funcName: "showTools",
119
- params: params
120
- ) { response in
121
- if let toolResponse = parseResponse(response) as? String {
122
- headerRight?.toolCallback?(toolResponse)
123
- }
124
- }
125
- }
126
-
127
- private func getNavigationButtonConfig() -> NavigationButtonConfig {
128
- let totalTools = headerRight?.tools.reduce(0) { $0 + $1.items.count } ?? 0
129
- var icon = isFavorite ? "pin_star_checked" : "pin_star"
130
- var onClickHandler: () -> Void = onPressShortcut
131
-
132
- if totalTools > 1 || headerRight?.useMore == true {
133
- icon = "navigation_more_icon"
134
- onClickHandler = onPressMore
135
- } else if totalTools == 1, let singleTool = headerRight?.tools.first?.items.first {
136
- icon = singleTool.icon
137
- onClickHandler = {
138
- headerRight?.toolCallback?(singleTool.key)
139
- }
140
- }
141
-
142
- return NavigationButtonConfig(icon: icon, onPress: onClickHandler)
143
- }
144
-
145
- var body: some View {
146
- let backgroundButtonColor: Color = tintColor == Colors.black01 ? Colors.black20.opacity(0.6) : Colors.black01.opacity(0.6)
147
- let borderColor: Color = tintColor == Colors.black01 ? Colors.black01.opacity(0.2) : Colors.black20.opacity(0.2)
148
- let navButtonConfig = getNavigationButtonConfig()
149
- let showBadge = headerRight?.tools.contains { group in
150
- group.items.contains { $0.showBadge }
151
- } ?? false
152
-
153
- HStack(alignment: .center, spacing: 0) {
154
- if shouldShowShortcut {
155
- NavigationButton(
156
- disabled: isLoading,
157
- icon: navButtonConfig.icon,
158
- showBadge: showBadge,
159
- onClick: navButtonConfig.onPress,
160
- tintColor: tintColor
161
- )
162
- }
163
-
164
- HStack(alignment: .center, spacing: 0) {
165
- if environment.applicationContext != nil {
166
- Icon(source: "help_center", size: 20, color: tintColor ?? Colors.black17)
167
- .padding(4)
168
- .onTapGesture {
169
- onPressHelpCenter()
170
- }
171
-
172
- Rectangle()
173
- .fill(tintColor ?? Colors.black20)
174
- .frame(width: 0.5, height: 12)
175
- }
176
-
177
- Icon(source: "16_basic_home", size: 20, color: tintColor ?? Colors.black17)
178
- .padding(4)
179
- .onTapGesture {
180
- onPressClose()
181
- }
182
- }
183
- .frame(width: 65, height: 28)
184
- .background(backgroundButtonColor)
185
- .cornerRadius(14)
186
- .overlay(
187
- RoundedRectangle(cornerRadius: 14)
188
- .stroke(borderColor, lineWidth: 0.2)
189
- )
190
- .padding(.leading, Spacing.S)
191
- }
192
- .onAppear {
193
- loadFavoriteState()
194
- }
195
- }
196
- }