@momo-kits/native-kits 0.167.1-duo.8-debug → 0.167.1-duo.9

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 (254) hide show
  1. package/CLAUDE.md +4 -1
  2. package/ios/Application/ApplicationEnvironment.swift +11 -0
  3. package/ios/Application/ComposeApi.swift +2 -1
  4. package/ios/Application/{Components.swift → LegacyHeader.swift} +6 -62
  5. package/ios/Application/Screen.swift +3 -2
  6. package/ios/Avatar/Avatar.swift +4 -3
  7. package/ios/Badge/Badge.swift +6 -4
  8. package/ios/Badge/BadgeDot.swift +1 -1
  9. package/ios/Badge/BadgeRibbon.swift +0 -1
  10. package/ios/Button/Button.swift +15 -12
  11. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +12 -20
  12. package/ios/Carousel/Carousel.swift +29 -12
  13. package/ios/Checkbox/Checkbox.swift +7 -3
  14. package/ios/Chip/Chip.swift +5 -4
  15. package/ios/Collapse/Collapse.swift +70 -19
  16. package/ios/Colors+Radius+Spacing/Colors.swift +9 -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 +18 -0
  21. package/ios/Icon/Icon.swift +7 -1
  22. package/ios/IconButton/IconButton.swift +15 -7
  23. package/ios/Image/Image.swift +7 -34
  24. package/ios/Information/Information.swift +27 -9
  25. package/ios/Input/ErrorView.swift +2 -2
  26. package/ios/Input/Input.swift +160 -147
  27. package/ios/Input/InputPhoneNumber.swift +12 -9
  28. package/ios/Input/InputSearch.swift +102 -75
  29. package/ios/Input/InputTextArea.swift +128 -145
  30. package/ios/InputDropDown/InputDropDown.swift +10 -7
  31. package/ios/InputMoney/InputMoney.swift +33 -11
  32. package/ios/InputOTP/InputOTP.swift +22 -12
  33. package/ios/Layout/Card.swift +50 -0
  34. package/ios/Layout/GridContext.swift +123 -3
  35. package/ios/Layout/Item.swift +5 -4
  36. package/ios/Layout/Section.swift +4 -100
  37. package/ios/Loader/Loader.swift +5 -9
  38. package/ios/Lottie/LottieView.swift +10 -0
  39. package/ios/{Application/Navigation/Overplay → Navigation}/BottomSheet.swift +61 -9
  40. package/ios/{Application/Navigation → Navigation}/BottomTab/BottomTab.swift +60 -34
  41. package/ios/{Application/Navigation → Navigation}/BottomTab/BottomTabBar.swift +11 -6
  42. package/ios/{Application → Navigation/Component}/FloatingButton.swift +14 -3
  43. package/ios/Navigation/Component/Header.swift +493 -0
  44. package/ios/Navigation/Component/HeaderBackground.swift +134 -0
  45. package/ios/Navigation/Component/HeaderJourney.swift +73 -0
  46. package/ios/Navigation/Component/HeaderLocation.swift +48 -0
  47. package/ios/Navigation/Component/HeaderRight.swift +386 -0
  48. package/ios/Navigation/Component/HeaderTitle.swift +36 -0
  49. package/ios/{Application/Navigation → Navigation/Component}/HeaderUser.swift +20 -23
  50. package/ios/{Application/Navigation/component → Navigation/Component}/SideBar.swift +49 -28
  51. package/ios/{Application/Navigation/Overplay → Navigation/Component}/SnackBar.swift +5 -5
  52. package/ios/Navigation/HostBackGestureBridge.swift +57 -0
  53. package/ios/Navigation/Navigation.swift +190 -0
  54. package/ios/{Application/Navigation → Navigation}/NavigationContainer.swift +46 -41
  55. package/ios/{Application/Navigation → Navigation}/Navigator.swift +65 -9
  56. package/ios/{Application → Navigation}/StackScreen.swift +236 -103
  57. package/ios/{Application/Navigation → Navigation}/Tracking/ScreenTracker.swift +12 -5
  58. package/ios/OTPKeyboard/OTPKeyboard.swift +8 -11
  59. package/ios/Pagination/PaginationScroll.swift +2 -2
  60. package/ios/Popup/PopupDisplay.swift +79 -159
  61. package/ios/Popup/PopupInput.swift +10 -13
  62. package/ios/Popup/PopupLayout.swift +97 -2
  63. package/ios/Popup/PopupNotify.swift +27 -55
  64. package/ios/Popup/PopupPromotion.swift +22 -50
  65. package/ios/PopupView/FullscreenPopup.swift +13 -19
  66. package/ios/PopupView/PopupView.swift +1 -1
  67. package/ios/PopupView/Utils++.swift +0 -8
  68. package/ios/ProgressInfo/ProgressInfo.swift +4 -2
  69. package/ios/Radio/Radio.swift +2 -1
  70. package/ios/Rating/Rating.swift +9 -1
  71. package/ios/ScrollIndicator/ScrollIndicator.swift +11 -10
  72. package/ios/Skeleton/Skeleton.swift +22 -27
  73. package/ios/Slider/Slider.swift +16 -18
  74. package/ios/Stepper/Stepper.swift +6 -1
  75. package/ios/Steps/Steps.swift +8 -6
  76. package/ios/SuggestAction/SuggestAction.swift +5 -0
  77. package/ios/Swipeable/SwipeCell.swift +10 -6
  78. package/ios/Switch/Switch.swift +22 -20
  79. package/ios/TabView/TabView.swift +102 -21
  80. package/ios/Tag/Tag.swift +15 -4
  81. package/ios/Template/Logo/Logo.swift +2 -1
  82. package/ios/Template/TrustBanner/TrustBanner.swift +41 -27
  83. package/ios/Title/Title.swift +6 -17
  84. package/ios/Tooltip/Tooltip.swift +29 -14
  85. package/ios/Typography/Text.swift +61 -19
  86. package/ios/Uploader/Uploader.swift +3 -1
  87. package/ios/native-kits.podspec +1 -0
  88. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +1 -1
  89. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +77 -1
  90. package/package.json +1 -1
  91. package/build.gradle.kts +0 -11
  92. package/compose/build.gradle.kts +0 -204
  93. package/compose/build.gradle.kts.backup +0 -204
  94. package/compose/compose.podspec +0 -47
  95. package/compose/src/androidMain/kotlin/vn/momo/kits/const/HostFont.android.kt +0 -19
  96. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  97. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/BackGesture.android.kt +0 -12
  98. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/OsFontScale.android.kt +0 -7
  99. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -153
  100. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/ReservedRegions.android.kt +0 -6
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -52
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -124
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -183
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -207
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -39
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -293
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -831
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Localize.kt +0 -269
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -110
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -378
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/application/WidgetContainer.kt +0 -56
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -82
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -338
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -175
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -356
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -113
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -89
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -128
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -209
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -542
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -49
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -125
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -231
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -189
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -475
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -114
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -266
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -240
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -223
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -264
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -185
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -343
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -84
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -361
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -108
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -310
  149. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -59
  150. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  151. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -21
  152. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -90
  153. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -323
  154. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -220
  155. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -473
  156. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -122
  157. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -199
  158. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -91
  159. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -552
  160. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -88
  161. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -125
  162. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -207
  163. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -498
  164. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -176
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -182
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -193
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -234
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -188
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -325
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/const/HostFont.kt +0 -16
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitDesignSystem.kt +0 -18
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/const/KitFontScale.kt +0 -22
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  176. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  177. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -297
  178. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -54
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -50
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/ScreenLayout.kt +0 -232
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -41
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -52
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -66
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -104
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -48
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -338
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/HostBackGestureBridge.kt +0 -58
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -137
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -106
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -205
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -393
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -708
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackTransition.kt +0 -148
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/SwipeBackHaptic.kt +0 -35
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -203
  199. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -232
  200. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  201. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoBarCompression.kt +0 -98
  202. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/DuoTabBar.kt +0 -312
  203. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -169
  204. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -408
  205. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -92
  206. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderJourney.kt +0 -105
  207. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderLocation.kt +0 -74
  208. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -366
  209. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -37
  210. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -363
  211. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SideBar.kt +0 -185
  212. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -132
  213. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -127
  214. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/BackGesture.kt +0 -12
  215. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -91
  216. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/OsFontScale.kt +0 -9
  217. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -74
  218. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ReservedRegions.kt +0 -13
  219. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  220. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -55
  221. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  222. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -118
  223. package/compose/src/iosMain/kotlin/vn/momo/kits/const/HostFont.ios.kt +0 -40
  224. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/HostBackGesture.ios.kt +0 -45
  225. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -32
  226. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/BackGesture.ios.kt +0 -38
  227. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/OsFontScale.ios.kt +0 -66
  228. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -217
  229. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/ReservedRegions.ios.kt +0 -86
  230. package/gradle/libs.versions.toml +0 -69
  231. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  232. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  233. package/gradle.properties +0 -26
  234. package/gradlew +0 -252
  235. package/gradlew.bat +0 -94
  236. package/ios/Application/HeaderRight.swift +0 -324
  237. package/ios/Application/Navigation/HeaderBackProps.swift +0 -66
  238. package/ios/Application/Navigation/HeaderTitle.swift +0 -57
  239. package/ios/Application/Navigation/NavigationOptions.swift +0 -109
  240. package/ios/Application/Navigation/NavigatorManager.swift +0 -29
  241. package/ios/Application/Navigation/component/DuoScrollGradient.swift +0 -54
  242. package/ios/Application/Navigation/component/Header.swift +0 -183
  243. package/ios/Application/Navigation/component/HeaderBackground.swift +0 -84
  244. package/ios/Application/Navigation/component/HeaderColor.swift +0 -65
  245. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +0 -11
  246. package/ios/Application/Navigation/component/NavigationFooter.swift +0 -90
  247. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +0 -280
  248. package/ios-demo/README.md +0 -120
  249. package/settings.gradle.kts +0 -64
  250. /package/ios/{Application/Layout → Layout}/ScreenLayout.swift +0 -0
  251. /package/ios/{Application/Navigation → Navigation}/BottomTab/CurvedContainer.swift +0 -0
  252. /package/ios/{Application/Navigation → Navigation}/BottomTab/DuoBarCompression.swift +0 -0
  253. /package/ios/{Application/Navigation → Navigation}/BottomTab/DuoTabBar.swift +0 -0
  254. /package/ios/{Application/Navigation/Overplay → Navigation}/ModalScreen.swift +0 -0
@@ -1,183 +0,0 @@
1
- //
2
- // Header.swift
3
- // MoMoUIKits
4
- //
5
- // SwiftUI mirror of Compose's `Header` (navigation/component/Header.kt).
6
- // Renders the 52pt header bar: a circular back button (colors resolved via
7
- // `getHeaderColor`), the title area (`HeaderContent` → plain title, user title
8
- // or inline search), the header-right toolkit, and a scroll-triggered bottom
9
- // shadow. The header band background itself is painted by `HeaderBackground`.
10
- //
11
- // Named `NavigationHeader` to coexist with the legacy `Header` in
12
- // `Components.swift` (kept as-is, used as a package elsewhere; to be marked
13
- // deprecated later). Used by the new `StackScreen` navigation path.
14
- //
15
-
16
- import SwiftUI
17
-
18
- public struct NavigationHeader: View {
19
- var headerType: HeaderType = .default
20
- var titlePosition: TitlePosition
21
- var title: String
22
- /// Optional rich title (mirrors Compose's `HeaderTitle`); `.user` renders an
23
- /// avatar group, `.default`/nil renders plain `title`.
24
- var headerTitle: HeaderTitle?
25
- var headerRight: (() -> any View)? = { NavigationHeaderRight() }
26
- var goBack: (() -> Void)?
27
- var opacity: CGFloat = 1
28
- var animatedHeader: AnimatedHeader?
29
- var scrollState: CGFloat = 0
30
- var inputSearchProps: InputSearchProps?
31
- var tintColor: Color?
32
- /// Title opacity; used by the animated search header to fade the title out on scroll.
33
- var titleOpacity: CGFloat = 1
34
-
35
- public init(
36
- headerType: HeaderType = .default,
37
- titlePosition: TitlePosition,
38
- title: String,
39
- headerTitle: HeaderTitle? = nil,
40
- headerRight: (() -> any View)? = { HeaderRight() },
41
- goBack: (() -> Void)? = nil,
42
- opacity: CGFloat = 1,
43
- animatedHeader: AnimatedHeader? = nil,
44
- scrollState: CGFloat = 0,
45
- inputSearchProps: InputSearchProps? = nil,
46
- tintColor: Color? = nil,
47
- titleOpacity: CGFloat = 1
48
- ) {
49
- self.headerType = headerType
50
- self.titlePosition = titlePosition
51
- self.title = title
52
- self.headerTitle = headerTitle
53
- self.headerRight = headerRight
54
- self.goBack = goBack
55
- self.opacity = opacity
56
- self.animatedHeader = animatedHeader
57
- self.scrollState = scrollState
58
- self.inputSearchProps = inputSearchProps
59
- self.tintColor = tintColor
60
- self.titleOpacity = titleOpacity
61
- }
62
-
63
- @Environment(\.screenLayout) private var layout
64
-
65
- private var isAnimated: Bool { animatedHeader != nil }
66
- /// iPhone Duo side bar holds back and the toolkit; a custom header right stays in the bar.
67
- private var useSideBar: Bool { layout.sideBar != nil }
68
- private var isSurface: Bool { animatedHeader?.isSurface ?? true }
69
-
70
- private var headerColor: HeaderColor {
71
- getHeaderColor(isAnimated: isAnimated, isSurface: isSurface, opacity: opacity, tintColor: tintColor)
72
- }
73
-
74
- /// Centered title needs a full-width overlay to stay screen-centered, not
75
- /// boxed between the back button and the header-right (mirrors Compose).
76
- private var centerTitle: Bool {
77
- guard inputSearchProps == nil else { return false }
78
- let isDefault = headerTitle == nil || headerTitle?.defaultTitle != nil
79
- return titlePosition == .center && isDefault
80
- }
81
-
82
- public var body: some View {
83
- if headerType != .none {
84
- ZStack {
85
- HStack(spacing: 0) {
86
- if let goBack, !useSideBar {
87
- BackButton(color: headerColor, onBack: goBack)
88
- Spacer().frame(width: Spacing.S)
89
- }
90
-
91
- if centerTitle {
92
- Spacer()
93
- } else {
94
- titleArea(centered: false)
95
- .frame(maxWidth: .infinity, alignment: .leading)
96
- }
97
-
98
- if let headerRight, !(useSideBar && toolkitHeaderRight(headerRight) != nil) {
99
- AnyView(headerRight())
100
- .background(
101
- GeometryReader { geo in
102
- Color.clear.preference(key: HeaderRightWidthKey.self, value: geo.size.width)
103
- }
104
- )
105
- }
106
- }
107
- .padding(.horizontal, Spacing.M)
108
-
109
- if centerTitle {
110
- titleArea(centered: true)
111
- .padding(.horizontal, Spacing.M)
112
- }
113
- }
114
- .frame(height: layout.headerBarHeight)
115
- .overlay(alignment: .bottom) { VerticalShadow(opacity: opacity) }
116
- // the row starts headerStatusBarHeight below the window top: 0 with the status bar off
117
- // the top edge, lower on the iPhone Duo outer display to center on the camera
118
- .padding(.top, layout.headerStatusBarHeight - layout.insets.top)
119
- }
120
- }
121
-
122
- /// Mirrors Compose's `HeaderContent`: plain title, user title, or — when a
123
- /// header search is active — the inline search field.
124
- @ViewBuilder
125
- private func titleArea(centered: Bool) -> some View {
126
- if let inputSearchProps {
127
- InputSearch(props: inputSearchProps)
128
- } else if case let .user(userData)? = headerTitle {
129
- HeaderUserView(userData)
130
- } else {
131
- MomoText(
132
- headerTitle?.defaultTitle ?? title,
133
- typography: .actionSBold,
134
- color: headerColor.tintIconColor,
135
- textAlign: centered ? .center : .leading,
136
- maxLines: 1
137
- )
138
- .opacity(titleOpacity)
139
- .truncationMode(.tail)
140
- .frame(maxWidth: centered ? .infinity : nil, alignment: centered ? .center : .leading)
141
- }
142
- }
143
- }
144
-
145
- // MARK: - Back button
146
-
147
- /// Mirrors Compose's `BackButton`: a 28pt circular control with the back arrow.
148
- private struct BackButton: View {
149
- let color: HeaderColor
150
- let onBack: () -> Void
151
-
152
- var body: some View {
153
- SwiftUI.Button(action: onBack) {
154
- Circle()
155
- .fill(color.backgroundButton)
156
- .overlay(Circle().stroke(color.borderColor, lineWidth: 0.2))
157
- .frame(width: 28, height: 28)
158
- .overlay(Icon(source: "arrow-back", size: 20, color: color.tintIconColor))
159
- }
160
- .buttonStyle(.plain)
161
- }
162
- }
163
-
164
- // MARK: - Vertical shadow
165
-
166
- /// Mirrors Compose's `VerticalShadow`: a 6pt drop shadow under the header that
167
- /// only appears once the header is fully opaque (scrolled).
168
- private struct VerticalShadow: View {
169
- let opacity: CGFloat
170
-
171
- var body: some View {
172
- if opacity >= 1 {
173
- LinearGradient(
174
- gradient: Gradient(colors: [Color.black.opacity(0.05), .clear]),
175
- startPoint: .top,
176
- endPoint: .bottom
177
- )
178
- .frame(height: 6)
179
- .frame(maxWidth: .infinity)
180
- .offset(y: 6)
181
- }
182
- }
183
- }
@@ -1,84 +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
- @Environment(\.screenLayout) private var layout
47
-
48
- public var body: some View {
49
- let opacity = max(0, 1 - scrollState / CGFloat(HEADER_HEIGHT))
50
- let minHeight = fullScreenContent ? 0 : layout.headerHeight
51
- let maxHeight: CGFloat = 154
52
- let backgroundColor = headerTransparent ? Color.clear : Colors.black01
53
- let topColor = opacity == 0 ? backgroundColor : Color(hex: 0xFDCADE)
54
-
55
- Group {
56
- switch headerType {
57
- case .default:
58
- ZStack(alignment: .bottom) {
59
- backgroundColor
60
- .frame(height: minHeight)
61
- if !headerTransparent {
62
- pinkGradient(topColor: topColor, bottomColor: backgroundColor)
63
- .frame(height: maxHeight)
64
- .frame(height: minHeight, alignment: .top)
65
- .clipped()
66
- }
67
- }
68
-
69
- case .extended:
70
- ZStack {
71
- if !headerTransparent {
72
- backgroundColor
73
- .frame(height: maxHeight)
74
- pinkGradient(topColor: topColor, bottomColor: backgroundColor)
75
- .frame(height: maxHeight)
76
- }
77
- }
78
-
79
- case .none:
80
- EmptyView()
81
- }
82
- }
83
- }
84
- }
@@ -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, .horizontal]))
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
- }