@momo-kits/native-kits 0.162.2-debug → 0.162.2-sp.1

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 (278) hide show
  1. package/.claude/settings.local.json +55 -0
  2. package/ios/Application/Components.swift +34 -43
  3. package/ios/Application/FloatingButton.swift +10 -8
  4. package/ios/Application/Navigation/BottomTab/BottomTab.swift +102 -0
  5. package/ios/Application/Navigation/BottomTab/BottomTabBar.swift +215 -0
  6. package/ios/Application/Navigation/BottomTab/CurvedContainer.swift +65 -0
  7. package/ios/Application/Navigation/HeaderBackProps.swift +66 -0
  8. package/ios/Application/Navigation/HeaderTitle.swift +57 -0
  9. package/ios/Application/Navigation/HeaderUser.swift +209 -0
  10. package/ios/Application/Navigation/NavigationContainer.swift +151 -0
  11. package/ios/Application/Navigation/NavigationOptions.swift +109 -0
  12. package/ios/Application/Navigation/Navigator.swift +360 -0
  13. package/ios/Application/Navigation/Overplay/BottomSheet.swift +176 -0
  14. package/ios/Application/Navigation/Overplay/ModalScreen.swift +68 -0
  15. package/ios/Application/Navigation/Overplay/SnackBar.swift +144 -0
  16. package/ios/Application/Navigation/component/Header.swift +178 -0
  17. package/ios/Application/Navigation/component/HeaderBackground.swift +83 -0
  18. package/ios/Application/Navigation/component/HeaderColor.swift +65 -0
  19. package/ios/Application/StackScreen.swift +449 -0
  20. package/ios/Avatar/Avatar.swift +193 -0
  21. package/ios/Badge/Badge.swift +11 -13
  22. package/ios/Badge/BadgeRibbon.swift +12 -19
  23. package/ios/BaselineView/BaselineView.swift +163 -0
  24. package/ios/Button/Button.swift +62 -23
  25. package/ios/Carousel/Carousel.swift +181 -0
  26. package/ios/Checkbox/Checkbox.swift +14 -12
  27. package/ios/Chip/Chip.swift +23 -9
  28. package/ios/Collapse/Collapse.swift +182 -0
  29. package/ios/Colors+Radius+Spacing/Colors.swift +1 -1
  30. package/ios/Colors+Radius+Spacing/Theme.swift +295 -0
  31. package/ios/DateTimePicker/DateTimePicker.swift +210 -0
  32. package/ios/DateTimePicker/DateTimePickerTypes.swift +55 -0
  33. package/ios/DateTimePicker/DateTimePickerUtils.swift +167 -0
  34. package/ios/DateTimePicker/WheelPicker.swift +161 -0
  35. package/ios/Divider/Divider.swift +16 -0
  36. package/ios/Icon/Icon.swift +6 -1
  37. package/ios/IconButton/IconButton.swift +112 -0
  38. package/ios/Information/Information.swift +151 -0
  39. package/ios/Input/Input.swift +42 -25
  40. package/ios/Input/InputPhoneNumber.swift +21 -19
  41. package/ios/Input/InputSearch.swift +101 -45
  42. package/ios/Input/InputTextArea.swift +67 -40
  43. package/ios/InputDropDown/InputDropDown.swift +198 -0
  44. package/ios/InputMoney/InputMoney.swift +335 -0
  45. package/ios/InputOTP/InputOTP.swift +210 -0
  46. package/ios/Loader/Loader.swift +113 -0
  47. package/ios/MoMoUIKits.podspec +5 -0
  48. package/ios/OTPKeyboard/KeyboardButton.swift +1 -1
  49. package/ios/Pagination/PaginationDot.swift +61 -0
  50. package/ios/Pagination/PaginationNumber.swift +35 -0
  51. package/ios/Pagination/PaginationScroll.swift +101 -0
  52. package/ios/Pagination/PaginationWhiteDot.swift +37 -0
  53. package/ios/Popup/PopupDisplay.swift +10 -12
  54. package/ios/Popup/PopupInput.swift +2 -6
  55. package/ios/Popup/PopupNotify.swift +219 -0
  56. package/ios/ProgressInfo/ProgressInfo.swift +294 -0
  57. package/ios/Radio/Radio.swift +70 -0
  58. package/ios/Rating/Rating.swift +82 -0
  59. package/ios/Skeleton/Skeleton.swift +99 -0
  60. package/ios/Slider/Slider.swift +237 -0
  61. package/ios/Stepper/Stepper.swift +220 -0
  62. package/ios/Steps/Steps.swift +451 -0
  63. package/ios/SuggestAction/SuggestAction.swift +97 -0
  64. package/ios/Swipeable/SwipeCell.swift +185 -0
  65. package/ios/Swipeable/SwipeCellModel.swift +21 -0
  66. package/ios/TabView/TabView.swift +530 -0
  67. package/ios/Tag/Tag.swift +98 -0
  68. package/ios/Template/TrustBanner/TrustBanner.swift +2 -0
  69. package/ios/Title/Title.swift +269 -0
  70. package/ios/Tooltip/Tooltip.swift +482 -0
  71. package/ios/Typography/Text.swift +77 -5
  72. package/ios/Typography/Typography.swift +9 -0
  73. package/ios/Uploader/Uploader.swift +183 -0
  74. package/ios/native-kits.podspec +58 -8
  75. package/ios-demo/MoMoUIKitsDemo.podspec +18 -0
  76. package/ios-demo/Resources/dot_loading.json +558 -0
  77. package/ios-demo/Resources/icon.json +4052 -0
  78. package/ios-demo/Resources/lottie_circle_loader.json +1 -0
  79. package/ios-demo/Sources/MoMoUIKitsDemo/DemoScaffold.swift +48 -0
  80. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsBadgeDemoView.swift +25 -0
  81. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsButtonDemoView.swift +26 -0
  82. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsCheckboxDemoView.swift +19 -0
  83. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsChipDemoView.swift +33 -0
  84. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsInputDemoView.swift +48 -0
  85. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsPopupDemoView.swift +21 -0
  86. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsRadioDemoView.swift +17 -0
  87. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsTypographyDemoView.swift +28 -0
  88. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoContext.swift +31 -0
  89. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoFactory.swift +72 -0
  90. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AnimatedHeaderDemo.swift +110 -0
  91. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +93 -0
  92. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +269 -0
  93. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BaselineView.swift +117 -0
  94. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BottomTabDemo.swift +89 -0
  95. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ButtonDemo.swift +100 -0
  96. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +126 -0
  97. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +63 -0
  98. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +20 -0
  99. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +93 -0
  100. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +107 -0
  101. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +124 -0
  102. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +14 -0
  103. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/HeaderUserDemo.swift +49 -0
  104. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +261 -0
  105. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +58 -0
  106. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +78 -0
  107. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +138 -0
  108. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +111 -0
  109. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +136 -0
  110. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +107 -0
  111. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +73 -0
  112. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +100 -0
  113. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +32 -0
  114. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +57 -0
  115. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +70 -0
  116. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +227 -0
  117. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +72 -0
  118. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +175 -0
  119. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +121 -0
  120. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +76 -0
  121. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +89 -0
  122. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +32 -0
  123. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +56 -0
  124. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +32 -0
  125. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +150 -0
  126. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +138 -0
  127. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +103 -0
  128. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +94 -0
  129. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +79 -0
  130. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +152 -0
  131. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +33 -0
  132. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +190 -0
  133. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +34 -0
  134. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +182 -0
  135. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +109 -0
  136. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +187 -0
  137. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +87 -0
  138. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +131 -0
  139. package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +50 -0
  140. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoModels.swift +15 -0
  141. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoRegistry.swift +73 -0
  142. package/package.json +1 -1
  143. package/publish.sh +50 -0
  144. package/scripts/gen-ios-color.mjs +136 -0
  145. package/build.gradle.kts +0 -11
  146. package/compose/build.gradle.kts +0 -186
  147. package/compose/build.gradle.kts.backup +0 -186
  148. package/compose/compose.podspec +0 -47
  149. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +0 -6
  150. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +0 -123
  151. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  152. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  153. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  154. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  155. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  156. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  157. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  158. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  159. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  160. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  161. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  162. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  163. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  164. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +0 -57
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +0 -109
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +0 -201
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +0 -222
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +0 -48
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +0 -86
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +0 -76
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +0 -76
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +0 -305
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +0 -33
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +0 -921
  176. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +0 -121
  177. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +0 -403
  178. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +0 -69
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +0 -157
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +0 -85
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +0 -32
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +0 -340
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -198
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +0 -357
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +0 -123
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +0 -94
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +0 -136
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +0 -224
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +0 -543
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +0 -23
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +0 -76
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +0 -148
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +0 -188
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +0 -116
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +0 -452
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +0 -172
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +0 -255
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +0 -235
  199. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +0 -233
  200. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +0 -259
  201. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +0 -241
  202. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +0 -364
  203. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +0 -108
  204. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +0 -56
  205. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +0 -41
  206. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +0 -92
  207. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +0 -40
  208. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +0 -352
  209. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +0 -103
  210. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +0 -338
  211. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +0 -70
  212. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +0 -87
  213. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
  214. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +0 -96
  215. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +0 -348
  216. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +0 -256
  217. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +0 -494
  218. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +0 -131
  219. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +0 -215
  220. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +0 -96
  221. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +0 -531
  222. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +0 -92
  223. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +0 -135
  224. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +0 -214
  225. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +0 -590
  226. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +0 -177
  227. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +0 -192
  228. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +0 -205
  229. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +0 -29
  230. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +0 -239
  231. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +0 -191
  232. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +0 -306
  233. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +0 -12
  234. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +0 -16
  235. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +0 -188
  236. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +0 -285
  237. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +0 -2
  238. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +0 -35
  239. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +0 -2
  240. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +0 -57
  241. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +0 -68
  242. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +0 -11
  243. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +0 -14
  244. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +0 -50
  245. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +0 -51
  246. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +0 -253
  247. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +0 -133
  248. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +0 -104
  249. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +0 -145
  250. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +0 -345
  251. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +0 -8
  252. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +0 -556
  253. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +0 -161
  254. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +0 -243
  255. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +0 -86
  256. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +0 -187
  257. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +0 -315
  258. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +0 -80
  259. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +0 -306
  260. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +0 -34
  261. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +0 -370
  262. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +0 -131
  263. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +0 -167
  264. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +0 -72
  265. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +0 -66
  266. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +0 -1329
  267. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +0 -70
  268. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +0 -15
  269. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +0 -105
  270. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +0 -33
  271. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +0 -186
  272. package/gradle/libs.versions.toml +0 -67
  273. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  274. package/gradle/wrapper/gradle-wrapper.properties +0 -8
  275. package/gradle.properties +0 -26
  276. package/gradlew +0 -252
  277. package/gradlew.bat +0 -94
  278. package/settings.gradle.kts +0 -64
@@ -0,0 +1,66 @@
1
+ //
2
+ // HeaderBackProps.swift
3
+ // MoMoUIKits
4
+ //
5
+ // SwiftUI mirror of Compose's `HeaderBackProps` + `PopupNotifyProps`/`PopupAction`.
6
+ // When `preventBack` is set, `Navigator.onBackSafe` shows a confirm popup
7
+ // before actually leaving the screen — same behavior as Compose.
8
+ //
9
+
10
+ import SwiftUI
11
+
12
+ /// Mirrors Compose's `PopupAction` (a titled button with an optional handler).
13
+ public struct PopupAction {
14
+ public let title: String
15
+ public let onPress: (() -> Void)?
16
+
17
+ public init(title: String, onPress: (() -> Void)? = nil) {
18
+ self.title = title
19
+ self.onPress = onPress
20
+ }
21
+ }
22
+
23
+ /// Mirrors Compose's `PopupNotifyProps` as consumed by `headerBackProps.preventBack`.
24
+ public struct PreventBackProps {
25
+ public var image: String
26
+ public var title: String
27
+ public var description: String
28
+ public var error: String
29
+ public var primary: PopupAction?
30
+ public var secondary: PopupAction?
31
+ public var buttonDirection: PopupButtonDirection
32
+ public var isShowCloseIcon: Bool
33
+ public var onIconClose: (() -> Void)?
34
+
35
+ public init(
36
+ image: String = "",
37
+ title: String = "",
38
+ description: String = "",
39
+ error: String = "",
40
+ primary: PopupAction? = nil,
41
+ secondary: PopupAction? = nil,
42
+ buttonDirection: PopupButtonDirection = .row,
43
+ isShowCloseIcon: Bool = true,
44
+ onIconClose: (() -> Void)? = nil
45
+ ) {
46
+ self.image = image
47
+ self.title = title
48
+ self.description = description
49
+ self.error = error
50
+ self.primary = primary
51
+ self.secondary = secondary
52
+ self.buttonDirection = buttonDirection
53
+ self.isShowCloseIcon = isShowCloseIcon
54
+ self.onIconClose = onIconClose
55
+ }
56
+ }
57
+
58
+ /// Mirrors Compose's `HeaderBackProps`.
59
+ public struct HeaderBackProps {
60
+ /// When non-nil, a confirm popup is shown before the back navigation runs.
61
+ public var preventBack: PreventBackProps?
62
+
63
+ public init(preventBack: PreventBackProps? = nil) {
64
+ self.preventBack = preventBack
65
+ }
66
+ }
@@ -0,0 +1,57 @@
1
+ //
2
+ // HeaderTitle.swift
3
+ // MoMoUIKits
4
+ //
5
+ // SwiftUI mirror of Compose's `sealed class HeaderTitle` (navigation/component/Header.kt).
6
+ // The header can show either a plain title (`.default`) or a rich "user" title
7
+ // with an avatar group, subtitle, inline icons and a status dot (`.user`).
8
+ // (Compose's `Location`/`Journey` variants are not rendered yet, so they are
9
+ // omitted here for parity with the implemented `HeaderUser`.)
10
+ //
11
+
12
+ import SwiftUI
13
+
14
+ /// Data backing a `.user` header title (mirrors `HeaderTitle.User`).
15
+ public struct HeaderUserData {
16
+ public var title: String
17
+ public var subTitle: String?
18
+ public var image: [String]?
19
+ public var dotColor: Color?
20
+ public var tintColor: Color?
21
+ public var onPress: (() -> Void)?
22
+ public var icons: [String]
23
+ public var isLoading: Bool
24
+
25
+ public init(
26
+ title: String,
27
+ subTitle: String? = nil,
28
+ image: [String]? = nil,
29
+ dotColor: Color? = nil,
30
+ tintColor: Color? = nil,
31
+ onPress: (() -> Void)? = nil,
32
+ icons: [String] = [],
33
+ isLoading: Bool = false
34
+ ) {
35
+ self.title = title
36
+ self.subTitle = subTitle
37
+ self.image = image
38
+ self.dotColor = dotColor
39
+ self.tintColor = tintColor
40
+ self.onPress = onPress
41
+ self.icons = icons
42
+ self.isLoading = isLoading
43
+ }
44
+ }
45
+
46
+ /// Mirrors Compose's `HeaderTitle` sealed class.
47
+ public enum HeaderTitle {
48
+ case `default`(String)
49
+ case user(HeaderUserData)
50
+
51
+ /// Plain title text, when this is a `.default` title (used by the legacy
52
+ /// string-based `Header`/`NavigationOptions` paths).
53
+ public var defaultTitle: String? {
54
+ if case let .default(text) = self { return text }
55
+ return nil
56
+ }
57
+ }
@@ -0,0 +1,209 @@
1
+ //
2
+ // HeaderUser.swift
3
+ // MoMoUIKits
4
+ //
5
+ // SwiftUI mirror of Compose's `HeaderUser` (navigation/component/HeaderUser.kt).
6
+ // Renders a `HeaderTitle.User`: an avatar group (1..n avatars with overflow),
7
+ // a title with optional inline icons, and an optional subtitle. Shows a
8
+ // skeleton shimmer placeholder while `isLoading`.
9
+ //
10
+
11
+ import SwiftUI
12
+
13
+ @available(iOS 16.0, *)
14
+ public struct HeaderUserView: View {
15
+ private let data: HeaderUserData
16
+
17
+ public init(_ data: HeaderUserData) {
18
+ self.data = data
19
+ }
20
+
21
+ private let avatarSize: CGFloat = Spacing.XXL // 32
22
+
23
+ private var maxWidth: CGFloat {
24
+ UIScreen.main.bounds.width - 172
25
+ }
26
+
27
+ public var body: some View {
28
+ if data.isLoading {
29
+ shimmer
30
+ } else {
31
+ content
32
+ }
33
+ }
34
+
35
+ private var content: some View {
36
+ HStack(spacing: 0) {
37
+ HStack(spacing: 0) {
38
+ ZStack(alignment: .bottomTrailing) {
39
+ AvatarGroup(urls: data.image ?? [], title: data.title, size: avatarSize)
40
+ if let dotColor = data.dotColor {
41
+ Circle()
42
+ .fill(dotColor)
43
+ .frame(width: 10, height: 10)
44
+ }
45
+ }
46
+ .frame(width: avatarSize, height: avatarSize)
47
+
48
+ Spacer().frame(width: 6)
49
+
50
+ VStack(alignment: .leading, spacing: 0) {
51
+ HStack(spacing: 0) {
52
+ MomoText(data.title, typography: .actionXsBold, color: data.tintColor ?? Colors.black17, maxLines: 1)
53
+ .truncationMode(.tail)
54
+
55
+ if !data.icons.isEmpty {
56
+ Spacer().frame(width: 6)
57
+ HStack(spacing: 0) {
58
+ ForEach(Array(data.icons.enumerated()), id: \.offset) { _, icon in
59
+ ImageView(icon)
60
+ .frame(width: 16, height: 16)
61
+ .clipShape(RoundedRectangle(cornerRadius: 4))
62
+ }
63
+ }
64
+ }
65
+ }
66
+
67
+ if let subTitle = data.subTitle, !subTitle.isEmpty {
68
+ Spacer().frame(height: 2)
69
+ MomoText(subTitle, typography: .descriptionXsRegular, color: data.tintColor ?? Colors.black17, maxLines: 1)
70
+ .truncationMode(.tail)
71
+ }
72
+ }
73
+ }
74
+ .frame(maxWidth: maxWidth, alignment: .leading)
75
+
76
+ Spacer(minLength: 0)
77
+ }
78
+ .frame(maxWidth: .infinity, alignment: .leading)
79
+ .padding(.vertical, Spacing.XS)
80
+ .contentShape(Rectangle())
81
+ .onTapGesture { data.onPress?() }
82
+ .allowsHitTesting(data.onPress != nil)
83
+ }
84
+
85
+ private var shimmer: some View {
86
+ HStack(spacing: Spacing.M / 2) {
87
+ Circle()
88
+ .fill(Colors.black05)
89
+ .frame(width: avatarSize, height: avatarSize)
90
+ VStack(alignment: .leading, spacing: Spacing.XXS) {
91
+ RoundedRectangle(cornerRadius: 8)
92
+ .fill(Colors.black05)
93
+ .frame(width: 120, height: 18)
94
+ RoundedRectangle(cornerRadius: 8)
95
+ .fill(Colors.black05)
96
+ .frame(width: 120, height: 12)
97
+ }
98
+ }
99
+ .frame(maxWidth: .infinity, alignment: .leading)
100
+ .padding(.vertical, Spacing.XS)
101
+ }
102
+ }
103
+
104
+ // MARK: - Avatar group
105
+
106
+ /// Mirrors Compose's `AvatarGroup`: lays out 1..4 avatars in a fixed collage,
107
+ /// falls back to initials when empty, and shows a "+n" overflow tile beyond 4.
108
+ @available(iOS 16.0, *)
109
+ private struct AvatarGroup: View {
110
+ let urls: [String]
111
+ let title: String
112
+ let size: CGFloat
113
+
114
+ private var child: CGFloat {
115
+ switch urls.count {
116
+ case 0, 1, 2: return 24
117
+ default: return 16
118
+ }
119
+ }
120
+
121
+ var body: some View {
122
+ switch urls.count {
123
+ case 0:
124
+ InitialsAvatar(name: title, size: size)
125
+ case 1:
126
+ avatar(urls[0]).frame(width: size, height: size)
127
+ case 2:
128
+ ZStack {
129
+ avatar(urls[0]).frame(width: child, height: child)
130
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
131
+ avatar(urls[1]).frame(width: child, height: child)
132
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading)
133
+ }
134
+ .frame(width: size, height: size)
135
+ case 3:
136
+ ZStack {
137
+ avatar(urls[0]).frame(width: child, height: child)
138
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing)
139
+ avatar(urls[1]).frame(width: child, height: child)
140
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
141
+ avatar(urls[2]).frame(width: child, height: child)
142
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading)
143
+ }
144
+ .frame(width: size, height: size)
145
+ .padding(2)
146
+ case 4:
147
+ ZStack {
148
+ avatar(urls[0]).frame(width: child, height: child)
149
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading)
150
+ avatar(urls[1]).frame(width: child, height: child)
151
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing)
152
+ avatar(urls[2]).frame(width: child, height: child)
153
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
154
+ avatar(urls[3]).frame(width: child, height: child)
155
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
156
+ }
157
+ .frame(width: size, height: size)
158
+ .padding(1)
159
+ default:
160
+ ZStack {
161
+ avatar(urls[0]).frame(width: child, height: child)
162
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomLeading)
163
+ avatar(urls[1]).frame(width: child, height: child)
164
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
165
+ avatar(urls[2]).frame(width: child, height: child)
166
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
167
+ overflowTile(more: urls.count - 3)
168
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing)
169
+ }
170
+ .frame(width: size, height: size)
171
+ .padding(1)
172
+ }
173
+ }
174
+
175
+ private func avatar(_ url: String) -> some View {
176
+ ImageView(url)
177
+ .aspectRatio(contentMode: .fill)
178
+ .clipShape(Circle())
179
+ .overlay(Circle().stroke(Colors.black05, lineWidth: 0.5))
180
+ }
181
+
182
+ private func overflowTile(more: Int) -> some View {
183
+ MomoText("+\(more)", typography: .descriptionXsRegular, color: Colors.pink03, textAlign: .center, maxLines: 1)
184
+ .frame(width: child, height: child)
185
+ .background(Colors.pink09)
186
+ .clipShape(Circle())
187
+ }
188
+ }
189
+
190
+ @available(iOS 16.0, *)
191
+ private struct InitialsAvatar: View {
192
+ let name: String
193
+ let size: CGFloat
194
+
195
+ private var initials: String {
196
+ let words = name.trimmingCharacters(in: .whitespaces)
197
+ .split(whereSeparator: { $0.isWhitespace })
198
+ .suffix(2)
199
+ return words.compactMap { $0.first.map { String($0).uppercased() } }.joined()
200
+ }
201
+
202
+ var body: some View {
203
+ MomoText(initials, typography: .descriptionXsRegular, color: Colors.pink03, textAlign: .center, maxLines: 1)
204
+ .frame(width: size, height: size)
205
+ .background(Colors.pink09)
206
+ .clipShape(Circle())
207
+ .overlay(Circle().stroke(Colors.black05, lineWidth: 0.5))
208
+ }
209
+ }
@@ -0,0 +1,151 @@
1
+ //
2
+ // NavigationContainer.swift
3
+ // MoMoUIKits
4
+ //
5
+ // SwiftUI mirror of Compose's NavigationContainer.
6
+ // Wraps NavigationStack, injects Navigator into the environment, and renders
7
+ // every registered screen inside `Screen(options)` chrome — same auto-wrap
8
+ // behavior as Compose's StackScreen.
9
+ //
10
+
11
+ import SwiftUI
12
+
13
+ @available(iOS 16.0, *)
14
+ public struct NavigationContainer<Initial: View>: View {
15
+ @StateObject private var navigator: Navigator
16
+
17
+ private let setNavigator: ((Navigator) -> Void)?
18
+
19
+ public init(
20
+ initialScreenName: String = "",
21
+ @ViewBuilder initialScreen: @escaping () -> Initial,
22
+ options: NavigationOptions? = nil,
23
+ setNavigator: ((Navigator) -> Void)? = nil
24
+ ) {
25
+ let nav = Navigator(
26
+ initialScreenName: initialScreenName.isEmpty ? (options?.screenName ?? "") : initialScreenName,
27
+ initialContent: { AnyView(initialScreen()) },
28
+ options: options
29
+ )
30
+ _navigator = StateObject(wrappedValue: nav)
31
+ self.setNavigator = setNavigator
32
+ }
33
+
34
+ public var body: some View {
35
+ NavigationStack(path: $navigator.path) {
36
+ screenView(for: navigator.rootRoute)
37
+ .navigationDestination(for: DynamicScreenRoute.self) { route in
38
+ screenView(for: route)
39
+ }
40
+ }
41
+ .environmentObject(navigator)
42
+ .fullScreenCover(item: $navigator.presented) { route in
43
+ screenView(forDialog: route)
44
+ .environmentObject(navigator)
45
+ }
46
+ .overlay {
47
+ if let item = navigator.overplay {
48
+ OverplayHost(item: item)
49
+ .environmentObject(navigator)
50
+ }
51
+ }
52
+ .onAppear { setNavigator?(navigator) }
53
+ }
54
+
55
+ @ViewBuilder
56
+ private func screenView(for route: DynamicScreenRoute) -> some View {
57
+ if let screen = DynamicScreenRegistry.shared.getScreen(id: route.id) {
58
+ ScreenHost(screen: screen, navigator: navigator)
59
+ .navigationBarBackButtonHidden(true)
60
+ } else {
61
+ EmptyView()
62
+ }
63
+ }
64
+
65
+ @ViewBuilder
66
+ private func screenView(forDialog route: DynamicDialogRoute) -> some View {
67
+ if let screen = DynamicScreenRegistry.shared.getScreen(id: route.id) {
68
+ ScreenHost(screen: screen, navigator: navigator)
69
+ } else {
70
+ EmptyView()
71
+ }
72
+ }
73
+ }
74
+
75
+ // MARK: - ScreenHost
76
+
77
+ @available(iOS 16.0, *)
78
+ private struct ScreenHost: View {
79
+ let screen: DynamicScreen
80
+ let navigator: Navigator
81
+
82
+ var body: some View {
83
+ let options = screen.options ?? NavigationOptions()
84
+ StackScreen(
85
+ backgroundColor: options.backgroundColor,
86
+ headerTransparent: options.headerTransparent,
87
+ fullScreenContent: options.fullScreenContent,
88
+ tintColor: options.tintColor ?? Colors.black17,
89
+ isBack: !options.hiddenBack,
90
+ headerType: options.headerType,
91
+ useAnimated: options.useAnimated,
92
+ title: options.title,
93
+ headerTitle: options.headerTitle,
94
+ titlePosition: options.titlePosition,
95
+ goBack: options.hiddenBack ? nil : { navigator.onBackSafe() },
96
+ scrollable: options.scrollable,
97
+ scrollToTopCallback: options.scrollToTopCallback,
98
+ useAvoidKeyboard: options.useAvoidKeyboard,
99
+ keyboardShouldPersistTaps: options.keyboardShouldPersistTaps,
100
+ footer: options.footer,
101
+ headerRight: options.resolvedHeaderRight,
102
+ animatedHeader: options.animatedHeader,
103
+ layoutOffset: options.layoutOffset,
104
+ inputSearchProps: options.inputSearchProps,
105
+ fabProps: options.fabProps,
106
+ content: { screen.content() }
107
+ )
108
+ }
109
+ }
110
+
111
+ // MARK: - Overplay host
112
+
113
+ @available(iOS 16.0, *)
114
+ private struct OverplayHost: View {
115
+ let item: OverplayItem
116
+ @EnvironmentObject var navigator: Navigator
117
+
118
+ var body: some View {
119
+ // Each component self-animates on appear and drives its own exit through
120
+ // the Navigator before the item is removed (mirrors Compose's overplay).
121
+ switch item.type {
122
+ case .modal:
123
+ ModalScreen(barrierDismissible: item.barrierDismissible) {
124
+ item.content()
125
+ }
126
+ .id(item.id)
127
+ case .bottomSheet:
128
+ BottomSheetView(
129
+ header: item.header ?? .title(),
130
+ isSurface: item.isSurface,
131
+ barrierDismissible: item.barrierDismissible
132
+ ) {
133
+ item.content()
134
+ }
135
+ .id(item.id)
136
+ case .snackBar:
137
+ if let snackBar = item.snackBar {
138
+ SnackBarView(snackBar: snackBar, bottomInset: safeAreaBottomInset() + Spacing.S)
139
+ .id(item.id)
140
+ }
141
+ }
142
+ }
143
+ }
144
+
145
+ /// Bottom safe-area inset (home indicator), used to lift the snack bar.
146
+ @available(iOS 16.0, *)
147
+ private func safeAreaBottomInset() -> CGFloat {
148
+ UIApplication.shared.connectedScenes
149
+ .compactMap { ($0 as? UIWindowScene)?.keyWindow?.safeAreaInsets.bottom }
150
+ .first ?? 0
151
+ }
@@ -0,0 +1,109 @@
1
+ //
2
+ // NavigationOptions.swift
3
+ // MoMoUIKits
4
+ //
5
+ // SwiftUI mirror of Compose's NavigationOptions.
6
+ // Each option lines up with a parameter on the existing `Screen` view,
7
+ // so NavigationContainer can auto-wrap a registered screen body in `Screen(options)`.
8
+ //
9
+
10
+ import SwiftUI
11
+
12
+ public struct NavigationOptions {
13
+ public var screenName: String?
14
+ public var title: String
15
+ /// Rich header title (mirrors Compose's `headerTitle`). When set to `.user`
16
+ /// the header renders an avatar group instead of `title`; `.default` keeps
17
+ /// the plain `title` text.
18
+ public var headerTitle: HeaderTitle?
19
+ public var titlePosition: TitlePosition
20
+ public var headerType: HeaderType
21
+ /// Mirrors Compose's `HeaderType.Extended/Default(useAnimated = ...)`: when true
22
+ /// and `inputSearchProps` is set, the search bar animates into the header on scroll.
23
+ public var useAnimated: Bool
24
+ public var headerTransparent: Bool
25
+ public var fullScreenContent: Bool
26
+ public var hiddenBack: Bool
27
+ public var backgroundColor: Color?
28
+ public var tintColor: Color?
29
+ public var scrollable: Bool
30
+ /// Mirrors Compose's `ScrollData.scrollToTopCallback`: invoked when the
31
+ /// screen is asked to scroll to top (e.g. on a status-bar tap).
32
+ public var scrollToTopCallback: (() -> Void)?
33
+ public var useAvoidKeyboard: Bool
34
+ /// Mirrors Compose's `KeyboardOptions.keyboardShouldPersistTaps`: when true,
35
+ /// tapping anywhere on the screen dismisses the keyboard.
36
+ public var keyboardShouldPersistTaps: Bool
37
+ /// Mirrors Compose's `HeaderBackProps`: drives the prevent-back confirm popup.
38
+ public var headerBackProps: HeaderBackProps?
39
+ /// Typed toolkit data for the default header right control (mirrors
40
+ /// Compose's `HeaderRight.Toolkit`). Use `headerRight` for `.custom` and nil
41
+ /// for `.none`.
42
+ public var headerRightData: HeaderRightData?
43
+ public var headerRight: (() -> any View)?
44
+ public var footer: (() -> AnyView)?
45
+ public var animatedHeader: AnimatedHeader?
46
+ public var layoutOffset: CGFloat
47
+ public var inputSearchProps: InputSearchProps?
48
+ public var fabProps: FabProps?
49
+ public var onBackHandler: (() -> Void)?
50
+
51
+ public init(
52
+ screenName: String? = nil,
53
+ title: String = "Stack",
54
+ headerTitle: HeaderTitle? = nil,
55
+ titlePosition: TitlePosition = .left,
56
+ headerType: HeaderType = .default,
57
+ useAnimated: Bool = false,
58
+ headerTransparent: Bool = false,
59
+ fullScreenContent: Bool = false,
60
+ hiddenBack: Bool = false,
61
+ backgroundColor: Color? = nil,
62
+ tintColor: Color? = Colors.black17,
63
+ scrollable: Bool = true,
64
+ scrollToTopCallback: (() -> Void)? = nil,
65
+ useAvoidKeyboard: Bool = true,
66
+ keyboardShouldPersistTaps: Bool = false,
67
+ headerBackProps: HeaderBackProps? = nil,
68
+ headerRightData: HeaderRightData? = nil,
69
+ headerRight: (() -> any View)? = { HeaderRight() },
70
+ footer: (() -> AnyView)? = nil,
71
+ animatedHeader: AnimatedHeader? = nil,
72
+ layoutOffset: CGFloat = 56,
73
+ inputSearchProps: InputSearchProps? = nil,
74
+ fabProps: FabProps? = nil,
75
+ onBackHandler: (() -> Void)? = nil
76
+ ) {
77
+ self.screenName = screenName
78
+ self.title = title
79
+ self.headerTitle = headerTitle
80
+ self.titlePosition = titlePosition
81
+ self.headerType = headerType
82
+ self.useAnimated = useAnimated
83
+ self.headerTransparent = headerTransparent
84
+ self.fullScreenContent = fullScreenContent
85
+ self.hiddenBack = hiddenBack
86
+ self.backgroundColor = backgroundColor
87
+ self.tintColor = tintColor
88
+ self.scrollable = scrollable
89
+ self.scrollToTopCallback = scrollToTopCallback
90
+ self.useAvoidKeyboard = useAvoidKeyboard
91
+ self.keyboardShouldPersistTaps = keyboardShouldPersistTaps
92
+ self.headerBackProps = headerBackProps
93
+ self.headerRightData = headerRightData
94
+ self.headerRight = headerRight
95
+ self.footer = footer
96
+ self.animatedHeader = animatedHeader
97
+ self.layoutOffset = layoutOffset
98
+ self.inputSearchProps = inputSearchProps
99
+ self.fabProps = fabProps
100
+ self.onBackHandler = onBackHandler
101
+ }
102
+ }
103
+
104
+ extension NavigationOptions {
105
+ var resolvedHeaderRight: (() -> any View)? {
106
+ guard let headerRightData else { return headerRight }
107
+ return { HeaderRight(headerRight: headerRightData, tintColor: tintColor) }
108
+ }
109
+ }