@momo-kits/native-kits 0.0.1-beta.4 → 0.0.2-alpha.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 (296) hide show
  1. package/CLAUDE.md +99 -0
  2. package/PUBLISH_GUIDE.md +675 -0
  3. package/README.md +184 -5
  4. package/ios/Application/ApplicationEnvironment.swift +71 -0
  5. package/ios/Application/Components.swift +270 -0
  6. package/ios/Application/ComposeApi.swift +22 -0
  7. package/ios/Application/FloatingButton.swift +174 -0
  8. package/ios/Application/HeaderRight.swift +306 -0
  9. package/ios/Application/LanguageSource.swift +93 -0
  10. package/ios/Application/Localize.swift +378 -0
  11. package/ios/Application/LocalizeModifier.swift +30 -0
  12. package/ios/Application/MaxApi.swift +18 -0
  13. package/ios/Application/Navigation/BottomTab/BottomTab.swift +104 -0
  14. package/ios/Application/Navigation/BottomTab/BottomTabBar.swift +215 -0
  15. package/ios/Application/Navigation/BottomTab/CurvedContainer.swift +65 -0
  16. package/ios/Application/Navigation/HeaderBackProps.swift +66 -0
  17. package/ios/Application/Navigation/HeaderTitle.swift +57 -0
  18. package/ios/Application/Navigation/HeaderUser.swift +209 -0
  19. package/ios/Application/Navigation/NavigationContainer.swift +213 -0
  20. package/ios/Application/Navigation/NavigationOptions.swift +109 -0
  21. package/ios/Application/Navigation/Navigator.swift +453 -0
  22. package/ios/Application/Navigation/NavigatorManager.swift +22 -0
  23. package/ios/Application/Navigation/Overplay/BottomSheet.swift +256 -0
  24. package/ios/Application/Navigation/Overplay/ModalScreen.swift +74 -0
  25. package/ios/Application/Navigation/Overplay/SnackBar.swift +144 -0
  26. package/ios/Application/Navigation/Tracking/ScreenTracker.swift +117 -0
  27. package/ios/Application/Navigation/component/Header.swift +178 -0
  28. package/ios/Application/Navigation/component/HeaderBackground.swift +83 -0
  29. package/ios/Application/Navigation/component/HeaderColor.swift +65 -0
  30. package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +11 -0
  31. package/ios/Application/Navigation/component/NavigationFooter.swift +90 -0
  32. package/ios/Application/Navigation/component/NavigationHeaderRight.swift +196 -0
  33. package/ios/Application/Screen.swift +250 -0
  34. package/ios/Application/StackScreen.swift +492 -0
  35. package/ios/Avatar/Avatar.swift +193 -0
  36. package/ios/Badge/Badge.swift +84 -0
  37. package/ios/Badge/BadgeDot.swift +31 -0
  38. package/ios/Badge/BadgeRibbon.swift +319 -0
  39. package/ios/BaselineView/BaselineView.swift +163 -0
  40. package/ios/Button/Button.swift +232 -84
  41. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +126 -0
  42. package/ios/Carousel/Carousel.swift +196 -0
  43. package/ios/Checkbox/Checkbox.swift +77 -0
  44. package/ios/Chip/Chip.swift +120 -0
  45. package/ios/Collapse/Collapse.swift +192 -0
  46. package/ios/{Colors+Spacing → Colors+Radius+Spacing}/Colors.swift +42 -37
  47. package/ios/Colors+Radius+Spacing/Radius.swift +22 -0
  48. package/ios/{Colors+Spacing → Colors+Radius+Spacing}/Spacing.swift +3 -1
  49. package/ios/Colors+Radius+Spacing/Theme.swift +295 -0
  50. package/ios/DateTimePicker/DateTimePicker.swift +212 -0
  51. package/ios/DateTimePicker/DateTimePickerTypes.swift +55 -0
  52. package/ios/DateTimePicker/DateTimePickerUtils.swift +167 -0
  53. package/ios/DateTimePicker/WheelPicker.swift +165 -0
  54. package/ios/Divider/Divider.swift +16 -0
  55. package/ios/Extensions/ActiveOpacityButtonStyle.swift +14 -0
  56. package/ios/Extensions/Color++.swift +32 -0
  57. package/ios/Icon/Icon.swift +69 -0
  58. package/ios/IconButton/IconButton.swift +140 -0
  59. package/ios/Image/Image.swift +87 -0
  60. package/ios/Information/Information.swift +156 -0
  61. package/ios/Input/ErrorView.swift +58 -0
  62. package/ios/Input/Input.swift +461 -77
  63. package/ios/Input/InputPhoneNumber.swift +192 -0
  64. package/ios/Input/InputSearch.swift +301 -0
  65. package/ios/Input/InputTextArea.swift +318 -0
  66. package/ios/InputDropDown/InputDropDown.swift +201 -0
  67. package/ios/InputMoney/InputMoney.swift +405 -0
  68. package/ios/InputOTP/InputOTP.swift +211 -0
  69. package/ios/Layout/GridContext.swift +30 -0
  70. package/ios/Layout/Item.swift +42 -0
  71. package/ios/Layout/Section.swift +134 -0
  72. package/ios/Loader/Loader.swift +113 -0
  73. package/ios/Lottie/LottieView.swift +86 -0
  74. package/ios/MoMoUIKits.podspec +5 -0
  75. package/ios/OTPKeyboard/KeyboardButton.swift +13 -5
  76. package/ios/OTPKeyboard/OTPKeyboard.swift +1 -1
  77. package/ios/Pagination/PaginationDot.swift +61 -0
  78. package/ios/Pagination/PaginationNumber.swift +35 -0
  79. package/ios/Pagination/PaginationScroll.swift +101 -0
  80. package/ios/Pagination/PaginationWhiteDot.swift +37 -0
  81. package/ios/Popup/PopupDisplay.swift +279 -0
  82. package/ios/Popup/PopupInput.swift +92 -0
  83. package/ios/Popup/PopupNotify.swift +219 -0
  84. package/ios/Popup/PopupPromotion.swift +74 -0
  85. package/ios/PopupView/FullscreenPopup.swift +251 -0
  86. package/ios/{Popup → PopupView}/Modifiers.swift +6 -20
  87. package/ios/{Popup → PopupView}/PopupView.swift +38 -146
  88. package/ios/PopupView/Utils++.swift +281 -0
  89. package/ios/ProgressInfo/ProgressInfo.swift +297 -0
  90. package/ios/Radio/Radio.swift +69 -0
  91. package/ios/Rating/Rating.swift +83 -0
  92. package/{example/ios/Example/Preview Content/Preview Assets.xcassets/Contents.json → ios/Resources/MoMoUIKitsColors.xcassets/AccentColor.colorset/Contents.json} +5 -0
  93. package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Text.colorset/Contents.json +3 -3
  94. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/Contents.json +9 -0
  95. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-default.colorset/Contents.json +38 -0
  96. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-disable.colorset/Contents.json +38 -0
  97. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-pressed.colorset/Contents.json +38 -0
  98. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-selected.colorset/Contents.json +38 -0
  99. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-surface.colorset/Contents.json +38 -0
  100. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-tonal.colorset/Contents.json +38 -0
  101. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/border-default.colorset/Contents.json +38 -0
  102. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/border-disable.colorset/Contents.json +38 -0
  103. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/gradient.colorset/Contents.json +38 -0
  104. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/primary.colorset/Contents.json +38 -0
  105. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/secondary.colorset/Contents.json +38 -0
  106. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-container.colorset/Contents.json +38 -0
  107. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-primary.colorset/Contents.json +38 -0
  108. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-secondary.colorset/Contents.json +38 -0
  109. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-default.colorset/Contents.json +38 -0
  110. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-disable.colorset/Contents.json +38 -0
  111. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-hint.colorset/Contents.json +38 -0
  112. package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-secondary.colorset/Contents.json +38 -0
  113. package/ios/ScrollIndicator/ScrollIndicator.swift +110 -0
  114. package/ios/Skeleton/Skeleton.swift +99 -0
  115. package/ios/Slider/Slider.swift +237 -0
  116. package/ios/StatusBarTap/StatusBarTap.h +13 -0
  117. package/ios/StatusBarTap/StatusBarTap.m +75 -0
  118. package/ios/Stepper/Stepper.swift +221 -0
  119. package/ios/Steps/Steps.swift +467 -0
  120. package/ios/SuggestAction/SuggestAction.swift +100 -0
  121. package/ios/Swipeable/SwipeCell.swift +226 -31
  122. package/ios/Swipeable/SwipeCellModel.swift +21 -0
  123. package/ios/Switch/Switch.swift +69 -0
  124. package/ios/TabView/TabView.swift +534 -0
  125. package/ios/Tag/Tag.swift +99 -0
  126. package/ios/Template/Logo/Logo.swift +75 -0
  127. package/ios/Template/TrustBanner/TrustBanner.swift +123 -0
  128. package/ios/Title/Title.swift +270 -0
  129. package/ios/Tooltip/Tooltip.swift +486 -0
  130. package/ios/Typography/FontScale.swift +103 -0
  131. package/ios/Typography/FontScaleStore.swift +58 -0
  132. package/ios/Typography/KitDesignSystem.swift +17 -0
  133. package/ios/Typography/Text.swift +262 -0
  134. package/ios/Typography/Typography.swift +80 -23
  135. package/ios/Uploader/Uploader.swift +174 -0
  136. package/ios/native-kits.podspec +73 -13
  137. package/ios-demo/MoMoUIKitsDemo.podspec +20 -0
  138. package/ios-demo/Resources/dot_loading.json +558 -0
  139. package/ios-demo/Resources/icon.json +4052 -0
  140. package/ios-demo/Resources/lottie_circle_loader.json +1 -0
  141. package/ios-demo/Sources/MoMoUIKitsDemo/DemoScaffold.swift +48 -0
  142. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsBadgeDemoView.swift +25 -0
  143. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsButtonDemoView.swift +26 -0
  144. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsCheckboxDemoView.swift +19 -0
  145. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsChipDemoView.swift +33 -0
  146. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsInputDemoView.swift +48 -0
  147. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsPopupDemoView.swift +21 -0
  148. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsRadioDemoView.swift +17 -0
  149. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsTypographyDemoView.swift +28 -0
  150. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoContext.swift +31 -0
  151. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoFactory.swift +24 -0
  152. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AnimatedHeaderDemo.swift +110 -0
  153. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +107 -0
  154. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +75 -0
  155. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BaselineView.swift +117 -0
  156. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BottomTabDemo.swift +89 -0
  157. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ButtonDemo.swift +108 -0
  158. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +96 -0
  159. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +60 -0
  160. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +76 -0
  161. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +102 -0
  162. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +107 -0
  163. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +100 -0
  164. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DemoScreen.swift +420 -0
  165. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +56 -0
  166. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/HeaderUserDemo.swift +49 -0
  167. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +276 -0
  168. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +93 -0
  169. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconDemo.swift +81 -0
  170. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +65 -0
  171. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +96 -0
  172. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +117 -0
  173. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +94 -0
  174. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +94 -0
  175. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +88 -0
  176. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +120 -0
  177. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +85 -0
  178. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +87 -0
  179. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +73 -0
  180. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LocalizeDemo.swift +235 -0
  181. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +241 -0
  182. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +68 -0
  183. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PlaygroundData.swift +76 -0
  184. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +175 -0
  185. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +95 -0
  186. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +67 -0
  187. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +101 -0
  188. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +64 -0
  189. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +68 -0
  190. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SectionDemo.swift +83 -0
  191. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +61 -0
  192. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +90 -0
  193. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +82 -0
  194. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +93 -0
  195. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +114 -0
  196. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +90 -0
  197. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +107 -0
  198. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +58 -0
  199. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +114 -0
  200. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +86 -0
  201. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +181 -0
  202. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +104 -0
  203. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +118 -0
  204. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +87 -0
  205. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +85 -0
  206. package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +53 -0
  207. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoModels.swift +15 -0
  208. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoRegistry.swift +73 -0
  209. package/package.json +6 -6
  210. package/publish.sh +554 -20
  211. package/scripts/gen-ios-color.mjs +136 -0
  212. package/CODE_OF_CONDUCT.md +0 -133
  213. package/CONTRIBUTING.md +0 -114
  214. package/LICENSE +0 -20
  215. package/android/build.gradle +0 -82
  216. package/android/gradle.properties +0 -5
  217. package/android/src/main/AndroidManifest.xml +0 -4
  218. package/android/src/main/java/com/momoplatform/nativekits/NativeKitsPackage.kt +0 -17
  219. package/android/src/main/java/com/momoplatform/nativekits/NativeKitsViewManager.kt +0 -20
  220. package/example/ios/Example/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -63
  221. package/example/ios/Example/ComponentDetail.swift +0 -35
  222. package/example/ios/Example/ComponentItem.swift +0 -24
  223. package/example/ios/Example/ComponentModel.swift +0 -33
  224. package/example/ios/Example/ContentView.swift +0 -53
  225. package/example/ios/Example/Example.entitlements +0 -10
  226. package/example/ios/Example/Foundation/ButtonDemo.swift +0 -80
  227. package/example/ios/Example/Foundation/Popup/ActionSheets.swift +0 -136
  228. package/example/ios/Example/Foundation/Popup/Floats.swift +0 -127
  229. package/example/ios/Example/Foundation/Popup/Popups.swift +0 -101
  230. package/example/ios/Example/Foundation/PopupDemo.swift +0 -366
  231. package/example/ios/Example/Foundation/TextInputDemo.swift +0 -31
  232. package/example/ios/Example/Foundation/TypographyDemo.swift +0 -53
  233. package/example/ios/Example/Foundation.swift +0 -26
  234. package/example/ios/Example/Info.plist +0 -18
  235. package/example/ios/Example/Library/SwipeableDemo.swift +0 -105
  236. package/example/ios/Example/Library.swift +0 -26
  237. package/example/ios/Example/Main.swift +0 -11
  238. package/example/ios/Example/Overview.swift +0 -20
  239. package/example/ios/Example/Resource/SFProText-Black.ttf +0 -0
  240. package/example/ios/Example/Resource/SFProText-Bold.ttf +0 -0
  241. package/example/ios/Example/Resource/SFProText-Heavy.ttf +0 -0
  242. package/example/ios/Example/Resource/SFProText-Light.ttf +0 -0
  243. package/example/ios/Example/Resource/SFProText-Medium.ttf +0 -0
  244. package/example/ios/Example/Resource/SFProText-Regular.ttf +0 -0
  245. package/example/ios/Example/Resource/SFProText-Semibold.ttf +0 -0
  246. package/example/ios/Example/Resource/SFProText-Thin.ttf +0 -0
  247. package/example/ios/Example/Resource/SFProText-Ultralight.ttf +0 -0
  248. package/example/ios/Example/Resource/foundation.json +0 -33
  249. package/example/ios/Example/Resource/library.json +0 -8
  250. package/example/ios/Example/Utils.swift +0 -30
  251. package/example/ios/Example/ViewModifier/DarkViewModifier.swift +0 -22
  252. package/example/ios/Example.xcodeproj/project.pbxproj +0 -570
  253. package/example/ios/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  254. package/example/ios/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  255. package/example/ios/Example.xcodeproj/project.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  256. package/example/ios/Example.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  257. package/example/ios/Example.xcworkspace/contents.xcworkspacedata +0 -10
  258. package/example/ios/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  259. package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  260. package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
  261. package/example/ios/Podfile +0 -6
  262. package/example/ios/Podfile.lock +0 -16
  263. package/example/ios/Pods/Local Podspecs/MoMoUIKits.podspec.json +0 -29
  264. package/example/ios/Pods/Manifest.lock +0 -16
  265. package/example/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -661
  266. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
  267. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
  268. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -25
  269. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-dummy.m +0 -5
  270. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-prefix.pch +0 -12
  271. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-umbrella.h +0 -16
  272. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.debug.xcconfig +0 -12
  273. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.modulemap +0 -6
  274. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.release.xcconfig +0 -12
  275. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown +0 -3
  276. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist +0 -29
  277. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m +0 -5
  278. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h +0 -16
  279. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig +0 -14
  280. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap +0 -6
  281. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig +0 -14
  282. package/ios/Colors+Spacing/Radius.swift +0 -11
  283. package/ios/Popup/Utils++.swift +0 -163
  284. package/ios/Theme.md +0 -18
  285. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Background.colorset/Contents.json +0 -0
  286. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Border.colorset/Contents.json +0 -0
  287. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Card.colorset/Contents.json +0 -0
  288. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Contents.json +0 -0
  289. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Error.colorset/Contents.json +0 -0
  290. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Primary.colorset/Contents.json +0 -0
  291. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/PrimaryDark.colorset/Contents.json +0 -0
  292. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/PrimaryLight.colorset/Contents.json +0 -0
  293. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Secondary.colorset/Contents.json +0 -0
  294. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Success.colorset/Contents.json +0 -0
  295. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/TextSecondary.colorset/Contents.json +0 -0
  296. /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Warning.colorset/Contents.json +0 -0
@@ -0,0 +1,279 @@
1
+ import SDWebImageSwiftUI
2
+ import SwiftUI
3
+
4
+ // MARK: - PopupButtonDirection
5
+
6
+ public enum PopupButtonDirection {
7
+ case row
8
+ case column
9
+ case auto
10
+ }
11
+
12
+ // MARK: - PopupButtonType
13
+
14
+ public enum PopupButtonType {
15
+ case text
16
+ case button
17
+ }
18
+
19
+ extension View {
20
+ func measureLineHeights(font: Font,
21
+ oneLine: Binding<CGFloat>,
22
+ twoLines: Binding<CGFloat>) -> some View {
23
+ overlay(
24
+ VStack(spacing: 0) {
25
+ Text("A")
26
+ .font(font)
27
+ .ignoreBoldTextSetting()
28
+ .lineLimit(1)
29
+ .fixedSize()
30
+ .background(
31
+ GeometryReader { g in
32
+ Color.clear.onAppear { oneLine.wrappedValue = g.size.height }
33
+ }
34
+ )
35
+ .hidden()
36
+
37
+ Text("A\nA")
38
+ .font(font)
39
+ .ignoreBoldTextSetting()
40
+ .lineLimit(2)
41
+ .fixedSize(horizontal: false, vertical: true)
42
+ .background(
43
+ GeometryReader { g in
44
+ Color.clear.onAppear { twoLines.wrappedValue = g.size.height }
45
+ }
46
+ )
47
+ .hidden()
48
+ }
49
+ .frame(width: 0, height: 0)
50
+ )
51
+ }
52
+ }
53
+
54
+ // MARK: - PopupDisplay
55
+
56
+ public struct PopupDisplay: View {
57
+ @Environment(\.localize) private var localize
58
+
59
+ // MARK: Lifecycle
60
+
61
+ public init(isPresented: Binding<Bool>, title: String = "", description: String = "", url: String = "", buttonDirection: PopupButtonDirection = .column, buttonType: PopupButtonType = .button, actionButtonTitle: String = "", closeButtonTitle: String = "", onPressAction: @escaping () -> Void = {}, onPressCloseButton: @escaping () -> Void = {}, onClose: @escaping () -> Void = {}, errorCode: String = "", isShowCloseIcon: Bool = true) {
62
+ self._isPresented = isPresented
63
+ self.title = title
64
+ self.description = description
65
+ self.url = url
66
+ self.buttonDirection = buttonDirection
67
+ self.buttonType = buttonType
68
+ self.onPressAction = onPressAction
69
+ self.onPressCloseButton = onPressCloseButton
70
+ self.onClose = onClose
71
+ self.closeButtonTitle = closeButtonTitle
72
+ self.actionButtonTitle = actionButtonTitle
73
+ self.errorCode = errorCode
74
+ self.isShowCloseIcon = isShowCloseIcon
75
+ }
76
+
77
+ // MARK: Public
78
+
79
+ @State private var oneLineH: CGFloat = 0
80
+ @State private var twoLineH: CGFloat = 0
81
+
82
+ private var fallbackLH: CGFloat { UIFont.preferredFont(forTextStyle: .body).lineHeight }
83
+ private var perLine: CGFloat { max(twoLineH - oneLineH, oneLineH > 0 ? oneLineH : fallbackLH) }
84
+
85
+ private func heightForLines(lines: CGFloat) -> CGFloat {
86
+ guard oneLineH > 0 && twoLineH > 0 else { return ceil(fallbackLH * lines) }
87
+ return ceil(oneLineH + max(0, lines - 1) * (twoLineH - oneLineH))
88
+ }
89
+ private var maxHeight8_5: CGFloat { heightForLines(lines: 8.5) }
90
+
91
+
92
+ @State private var textHeight: CGFloat = .zero
93
+ @State private var isScrollable = false
94
+
95
+ public var body: some View {
96
+ var shouldUseColumn: Bool {
97
+ buttonDirection == .column || (buttonDirection == .auto && (closeButtonTitle.count > 12 || actionButtonTitle.count > 12))
98
+ }
99
+
100
+ VStack(spacing: 12) {
101
+ ZStack(alignment: .topTrailing) {
102
+ if(isShowCloseIcon) {
103
+ SwiftUI.Button(action: onClose) {
104
+ Image(systemName: "xmark.circle.fill")
105
+ .resizable()
106
+ .frame(width: 22, height: 22)
107
+ .overlay(RoundedRectangle(cornerRadius: Radius.L).stroke(Colors.black01, lineWidth: 2))
108
+ }.foregroundColor(Colors.black20)
109
+ .background(Colors.black01.cornerRadius(15))
110
+ .padding(.trailing, -11)
111
+ .padding(.top, -11)
112
+ .zIndex(1)
113
+ .accessibility(identifier: "ic_popup_close")
114
+ }
115
+
116
+ VStack(spacing: 0) {
117
+ if(!url.isEmpty) {
118
+ WebImage(url: URL(string: url), isAnimating: .constant(true))
119
+ .resizable()
120
+ .placeholder {
121
+ Rectangle()
122
+ .fill(Color.gray.opacity(0.3))
123
+ .aspectRatio(1.777, contentMode: .fit)
124
+ .frame(maxWidth: .infinity, maxHeight: 184)
125
+ }
126
+ .aspectRatio(1.777, contentMode: .fit)
127
+ .frame(maxWidth: .infinity, alignment: .center)
128
+ .clipShape(RoundedCorner(radius: 15, corners: [.topLeft, .topRight]))
129
+ .clipped()
130
+ }
131
+ VStack(alignment: .leading, spacing: 0) {
132
+ MomoText(title, typography: .headerDefaultBold)
133
+ .padding(.top, 24)
134
+ .padding(.bottom, 8)
135
+ .lineLimit(2)
136
+ .accessibility(identifier: "title_popup_permission")
137
+
138
+ Group {
139
+ if isScrollable {
140
+ ScrollView(showsIndicators: false) {
141
+ MomoText(description, typography: .bodyDefaultRegular)
142
+ .multilineTextAlignment(.leading)
143
+ .background(GeometryReader { geo in
144
+ Color.clear.onAppear { textHeight = geo.size.height }
145
+ })
146
+ .measureLineHeights(font: .body_default_regular,
147
+ oneLine: $oneLineH,
148
+ twoLines: $twoLineH)
149
+ .accessibility(identifier: "description_popup_permission")
150
+ }
151
+ // Cap the visible height to ~8.5 lines
152
+ .frame(height: min(maxHeight8_5, textHeight))
153
+ } else {
154
+ MomoText(description, typography: .bodyDefaultRegular)
155
+ .multilineTextAlignment(.leading)
156
+ .background(GeometryReader { geo in
157
+ Color.clear.onAppear {
158
+ textHeight = geo.size.height
159
+ // Trigger scroll at ~8.5 lines
160
+ isScrollable = textHeight > maxHeight8_5
161
+ }
162
+ })
163
+ .measureLineHeights(font: .body_default_regular,
164
+ oneLine: $oneLineH,
165
+ twoLines: $twoLineH)
166
+ .accessibility(identifier: "description_popup_permission")
167
+ }
168
+ }
169
+ .padding(.bottom, 8)
170
+
171
+ if(!errorCode.isEmpty) {
172
+ MomoText(localize.translate("errorCode") + errorCode, typography: .descriptionXsRegular, color: Colors.black12)
173
+ .lineLimit(1)
174
+ .padding(.bottom, 8)
175
+ }
176
+ }
177
+ .frame(maxWidth: .infinity, alignment: .leading)
178
+ .padding(.horizontal, 24)
179
+ .padding(.bottom, 16)
180
+
181
+ if shouldUseColumn {
182
+ if buttonType == .text {
183
+ ColumnTextButtons
184
+ } else {
185
+ ColumnButtons
186
+ }
187
+ } else {
188
+ if buttonType == .text {
189
+ RowTextButtons
190
+ } else {
191
+ RowButtons
192
+ }
193
+ }
194
+ }
195
+ .fixedSize(horizontal: false, vertical: true)
196
+ }
197
+ }
198
+ .background(Color.white.cornerRadius(15))
199
+ .padding(.horizontal, 12)
200
+ .accessibilityElement(children: .ignore)
201
+ .accessibility(identifier: "popup_notify")
202
+ }
203
+
204
+ // MARK: Internal
205
+
206
+ @Binding var isPresented: Bool
207
+ var title: String
208
+ var description: String
209
+ var url: String
210
+ var buttonDirection: PopupButtonDirection
211
+ var buttonType: PopupButtonType
212
+ var onPressAction: () -> Void
213
+ var onPressCloseButton: () -> Void
214
+ var onClose: () -> Void
215
+ var actionButtonTitle: String
216
+ var closeButtonTitle: String
217
+ var errorCode: String
218
+ var isShowCloseIcon: Bool
219
+
220
+ var RowTextButtons: some View {
221
+ HStack {
222
+ SwiftUI.Button(action: onPressCloseButton) {
223
+ MomoText(closeButtonTitle, typography: .actionSBold, color: Colors.black09)
224
+ }
225
+ .padding(.trailing, 12)
226
+
227
+ SwiftUI.Button(action: onPressAction) {
228
+ MomoText(actionButtonTitle, typography: .actionSBold, color: Colors.primary)
229
+ }
230
+ }
231
+ .frame(maxWidth: .infinity, alignment: .trailing)
232
+ .padding(EdgeInsets(top: 0, leading: 0, bottom: 24, trailing: 24))
233
+ }
234
+
235
+ var ColumnTextButtons: some View {
236
+ VStack(alignment: .trailing) {
237
+ SwiftUI.Button(action: onPressAction) {
238
+ MomoText(actionButtonTitle, typography: .actionSBold, color: Colors.primary)
239
+ }
240
+ .padding(.bottom, 6)
241
+
242
+ SwiftUI.Button(action: onPressCloseButton) {
243
+ MomoText(closeButtonTitle, typography: .actionSBold, color: Colors.black09)
244
+ }
245
+ }
246
+ .frame(maxWidth: .infinity, alignment: .trailing)
247
+ .padding(EdgeInsets(top: 0, leading: 0, bottom: 24, trailing: 24))
248
+ }
249
+
250
+ var RowButtons: some View {
251
+ HStack {
252
+ if(!closeButtonTitle.isEmpty) {
253
+ Button(title: closeButtonTitle, action: onPressCloseButton, type: .text, size: .medium).accessibility(identifier: "btn_popup_cancel")
254
+ }
255
+ Button(title: actionButtonTitle, action: onPressAction, size: .medium)
256
+ .accessibility(identifier: "btn_popup_allow")
257
+ }
258
+ .frame(maxWidth: .infinity, alignment: .center)
259
+ .padding(.horizontal, 24)
260
+ .padding(.bottom, 24)
261
+ }
262
+
263
+ var ColumnButtons: some View {
264
+ VStack(alignment: .trailing) {
265
+ Button(
266
+ title: actionButtonTitle,
267
+ action: onPressAction,
268
+ size: .medium
269
+ ).accessibility(identifier: "btn_popup_allow")
270
+ if(!closeButtonTitle.isEmpty) {
271
+ Button(title: closeButtonTitle, action: onPressCloseButton, type: .text, size: .medium).accessibility(identifier: "btn_popup_cancel")
272
+ }
273
+ }
274
+ .frame(maxWidth: .infinity, alignment: .trailing)
275
+ .padding(.horizontal, 24)
276
+ .padding(.bottom, 24)
277
+ }
278
+
279
+ }
@@ -0,0 +1,92 @@
1
+ import SDWebImageSwiftUI
2
+ import SwiftUI
3
+
4
+ public struct PopupInput: View {
5
+ // MARK: Lifecycle
6
+
7
+ public init(isPresented: Binding<Bool>, title: String = "", description: String = "", numberOfButtons: Int = 1, actionButtonTitle: String = "", closeButtonTitle: String = "", onPressAction: @escaping () -> Void = {}, onPressCloseButton: @escaping () -> Void = {}, onClose: @escaping () -> Void = {}, inputPlaceholder: String = "", inputValue: Binding<String> = Binding.constant(""), onTextChange: ((String) -> Void)? = nil) {
8
+ self._isPresented = isPresented
9
+ self._inputValue = inputValue
10
+ self.title = title
11
+ self.description = description
12
+ self.onPressAction = onPressAction
13
+ self.onPressCloseButton = onPressCloseButton
14
+ self.onClose = onClose
15
+ self.inputPlaceholder = inputPlaceholder
16
+ self.onTextChange = onTextChange
17
+ self.numberOfButtons = numberOfButtons
18
+ self.closeButtonTitle = closeButtonTitle
19
+ self.actionButtonTitle = actionButtonTitle
20
+ }
21
+
22
+ // MARK: Public
23
+
24
+ public var body: some View {
25
+ VStack(spacing: 12) {
26
+ ZStack(alignment: .topTrailing) {
27
+ SwiftUI.Button(action: onPressClose) {
28
+ Image(systemName: "xmark.circle.fill")
29
+ .resizable()
30
+ .frame(width: 16, height: 16)
31
+ }.foregroundColor(Colors.black20)
32
+ .background(Colors.black01.cornerRadius(8))
33
+ .offset(x: 6, y: -6)
34
+ .zIndex(1)
35
+
36
+ VStack {
37
+ VStack(alignment: .leading) {
38
+ MomoText(title, typography: .headerDefaultBold, color: .black)
39
+ .padding(.top, 12)
40
+ .padding(.bottom, 24)
41
+
42
+ MomoText(description, typography: .bodyDefaultRegular, color: .black)
43
+ .opacity(0.6)
44
+ .multilineTextAlignment(.leading)
45
+ .padding(.bottom, 20)
46
+ }.padding(.horizontal, 24)
47
+
48
+ Input(text: $inputValue, placeholder: inputPlaceholder, onChangeText: onTextChange)
49
+ .padding(.horizontal, 24)
50
+
51
+ if numberOfButtons == 1 {
52
+ Button(title: actionButtonTitle, action: onPressAction)
53
+ .padding(.horizontal, 24)
54
+ .padding(.bottom, 24)
55
+ } else {
56
+ HStack {
57
+ Button(title: closeButtonTitle, action: onPressCloseButton, type: .secondary)
58
+ Button(title: actionButtonTitle, action: onPressAction)
59
+ }.padding(.horizontal, 24)
60
+ .padding(.bottom, 24)
61
+ }
62
+
63
+ }.clipped()
64
+ }
65
+ }
66
+ .background(Color.white.cornerRadius(8))
67
+ .shadow(color: .black.opacity(0.08), radius: 2, x: 0, y: 0)
68
+ .shadow(color: .black.opacity(0.16), radius: 24, x: 0, y: 0)
69
+ .padding(.horizontal, 40)
70
+ }
71
+
72
+ // MARK: Internal
73
+
74
+ @Binding var isPresented: Bool
75
+ @Binding var inputValue: String
76
+ var title: String
77
+ var description: String
78
+ var onPressAction: () -> Void
79
+ var onPressCloseButton: () -> Void
80
+ var onClose: () -> Void
81
+ var inputPlaceholder: String
82
+ var onTextChange: ((String) -> Void)?
83
+ var numberOfButtons: Int
84
+ var actionButtonTitle: String
85
+ var closeButtonTitle: String
86
+
87
+
88
+ func onPressClose(){
89
+ isPresented = false
90
+ onClose()
91
+ }
92
+ }
@@ -0,0 +1,219 @@
1
+ import SDWebImageSwiftUI
2
+ import SwiftUI
3
+
4
+ public typealias PopupActionDirection = PopupButtonDirection
5
+
6
+ public struct PopupNotifyProps {
7
+ public var image: String
8
+ public var title: String
9
+ public var description: String
10
+ public var error: String
11
+ public var primary: PopupAction?
12
+ public var secondary: PopupAction?
13
+ public var buttonDirection: PopupActionDirection
14
+ public var onIconClose: () -> Void
15
+ public var isShowCloseIcon: Bool
16
+
17
+ public init(
18
+ image: String = "",
19
+ title: String = "Title",
20
+ description: String = "Description",
21
+ error: String = "",
22
+ primary: PopupAction? = nil,
23
+ secondary: PopupAction? = nil,
24
+ buttonDirection: PopupActionDirection = .row,
25
+ onIconClose: @escaping () -> Void,
26
+ isShowCloseIcon: Bool = true
27
+ ) {
28
+ self.image = image
29
+ self.title = title
30
+ self.description = description
31
+ self.error = error
32
+ self.primary = primary
33
+ self.secondary = secondary
34
+ self.buttonDirection = buttonDirection
35
+ self.onIconClose = onIconClose
36
+ self.isShowCloseIcon = isShowCloseIcon
37
+ }
38
+ }
39
+
40
+ public struct PopupNotify: View {
41
+ @Environment(\.localize) private var localize
42
+ @Environment(\.momoFontScale) private var fontScale
43
+
44
+ public let props: PopupNotifyProps
45
+
46
+ @State private var descriptionHeight: CGFloat = 0
47
+
48
+ private var errorCodePrefix: String {
49
+ localize.translate("errorCode")
50
+ }
51
+
52
+ private var maxDescriptionHeight: CGFloat {
53
+ fontScale(TypographyStyle.bodyDefaultRegular.lineHeight) * 8.5
54
+ }
55
+
56
+ private var shouldUseColumnButtons: Bool {
57
+ switch props.buttonDirection {
58
+ case .column:
59
+ return true
60
+ case .row:
61
+ return false
62
+ case .auto:
63
+ return (props.secondary?.title.count ?? 0) > 12 || (props.primary?.title.count ?? 0) > 12
64
+ }
65
+ }
66
+
67
+ public init(props: PopupNotifyProps) {
68
+ self.props = props
69
+ }
70
+
71
+ public var body: some View {
72
+ ZStack(alignment: .topTrailing) {
73
+ VStack(spacing: 0) {
74
+ if !props.image.isEmpty {
75
+ popupImage
76
+ }
77
+
78
+ VStack(alignment: .leading, spacing: 0) {
79
+ MomoText(
80
+ props.title,
81
+ typography: .headerDefaultBold,
82
+ maxLines: 2,
83
+ accessibilityId: "title_popup_permission"
84
+ )
85
+ .padding(.bottom, Spacing.S)
86
+
87
+ descriptionContent
88
+
89
+ if !props.error.isEmpty {
90
+ MomoText(
91
+ errorCodePrefix + props.error,
92
+ typography: .descriptionXsRegular,
93
+ color: Colors.black12,
94
+ maxLines: 1
95
+ )
96
+ .padding(.top, Spacing.S)
97
+ }
98
+ }
99
+ .frame(maxWidth: .infinity, alignment: .leading)
100
+ .padding(Spacing.XL)
101
+
102
+ actionButtons
103
+ .padding(.horizontal, Spacing.XL)
104
+ .padding(.bottom, Spacing.XL)
105
+ }
106
+ .background(Colors.black01)
107
+ .clipShape(RoundedRectangle(cornerRadius: Radius.L))
108
+
109
+ if props.isShowCloseIcon {
110
+ closeButton
111
+ .offset(x: 1, y: -11)
112
+ }
113
+ }
114
+ .padding(.horizontal, Spacing.M)
115
+ .accessibilityElement(children: .ignore)
116
+ .accessibilityIdentifier("popup_notify")
117
+ }
118
+
119
+ private var popupImage: some View {
120
+ WebImage(url: URL(string: props.image), isAnimating: .constant(true))
121
+ .resizable()
122
+ .placeholder {
123
+ Rectangle()
124
+ .fill(Colors.black03)
125
+ .aspectRatio(1.777, contentMode: .fit)
126
+ .frame(maxWidth: .infinity)
127
+ }
128
+ .aspectRatio(1.777, contentMode: .fit)
129
+ .frame(maxWidth: .infinity)
130
+ .clipShape(RoundedCorner(radius: Radius.L, corners: [.topLeft, .topRight]))
131
+ }
132
+
133
+ @ViewBuilder
134
+ private var descriptionContent: some View {
135
+ if descriptionHeight > maxDescriptionHeight {
136
+ ScrollView(.vertical, showsIndicators: false) {
137
+ descriptionText
138
+ }
139
+ .frame(height: maxDescriptionHeight)
140
+ } else {
141
+ descriptionText
142
+ }
143
+ }
144
+
145
+ private var descriptionText: some View {
146
+ MomoText(
147
+ props.description,
148
+ typography: .bodyDefaultRegular,
149
+ accessibilityId: "description_popup_permission"
150
+ )
151
+ .frame(maxWidth: .infinity, alignment: .leading)
152
+ .background(
153
+ GeometryReader { proxy in
154
+ Color.clear
155
+ .onAppear { descriptionHeight = proxy.size.height }
156
+ .onChange(of: props.description) { _ in
157
+ descriptionHeight = proxy.size.height
158
+ }
159
+ }
160
+ )
161
+ }
162
+
163
+ @ViewBuilder
164
+ private var actionButtons: some View {
165
+ if shouldUseColumnButtons {
166
+ VStack(spacing: Spacing.S) {
167
+ primaryButton
168
+ if props.secondary != nil {
169
+ secondaryButton
170
+ }
171
+ }
172
+ } else {
173
+ HStack(spacing: Spacing.S) {
174
+ if props.secondary != nil {
175
+ secondaryButton
176
+ .frame(maxWidth: .infinity)
177
+ }
178
+ primaryButton
179
+ .frame(maxWidth: .infinity)
180
+ }
181
+ }
182
+ }
183
+
184
+ private var primaryButton: some View {
185
+ Button(
186
+ title: props.primary?.title ?? "",
187
+ action: { props.primary?.onPress?() },
188
+ size: .medium
189
+ )
190
+ .accessibilityIdentifier("btn_popup_allow")
191
+ }
192
+
193
+ private var secondaryButton: some View {
194
+ Button(
195
+ title: props.secondary?.title ?? "",
196
+ action: { props.secondary?.onPress?() },
197
+ type: .text,
198
+ size: .medium
199
+ )
200
+ .accessibilityIdentifier("btn_popup_cancel")
201
+ }
202
+
203
+ private var closeButton: some View {
204
+ SwiftUI.Button(action: props.onIconClose) {
205
+ ZStack {
206
+ Circle()
207
+ .fill(Colors.black17)
208
+ .overlay(
209
+ Circle()
210
+ .stroke(Colors.black01, lineWidth: 2)
211
+ )
212
+ .frame(width: 22, height: 22)
213
+
214
+ Icon(source: "navigation_close", size: 16, color: Colors.black01)
215
+ }
216
+ }
217
+ .accessibilityIdentifier("ic_popup_close")
218
+ }
219
+ }
@@ -0,0 +1,74 @@
1
+ import SwiftUI
2
+ import SDWebImageSwiftUI
3
+
4
+ public struct PopupPromotion: View {
5
+ @Environment(\.appTheme) private var theme
6
+
7
+ var imageUrl: String
8
+ var onIconClose: (() -> Void)?
9
+ var onAction: (() -> Void)?
10
+
11
+
12
+ public init(
13
+ imageUrl: String,
14
+ onIconClose: (() -> Void)? = nil,
15
+ onAction: (() -> Void)? = nil
16
+ ) {
17
+ self.imageUrl = imageUrl
18
+ self.onIconClose = onIconClose
19
+ self.onAction = onAction
20
+ }
21
+
22
+ public var body: some View {
23
+ VStack(spacing: 8) {
24
+ if(imageUrl.isEmpty) {
25
+ Icon(source: "media_fail", size: UIScreen.main.bounds.width - Spacing.XL * 2)
26
+ }
27
+ else {
28
+ WebImage(url: URL(string: imageUrl)!)
29
+ .resizable()
30
+ .placeholder {
31
+ Color.gray
32
+ .aspectRatio(0.72, contentMode: .fit)
33
+ .frame(maxWidth: UIScreen.main.bounds.width - Spacing.XL * 2)
34
+ .clipped()
35
+ }
36
+ .aspectRatio(0.72, contentMode: .fit)
37
+ .frame(maxWidth: UIScreen.main.bounds.width - Spacing.XL * 2, alignment: .center)
38
+ .clipped()
39
+ .onTapGesture {
40
+ onAction?()
41
+ }
42
+ }
43
+ buildCloseIcon()
44
+ .accessibility(identifier: "ic_popup_close")
45
+ }
46
+ .accessibilityElement(children: .ignore)
47
+ .accessibility(identifier: "popup_promotion")
48
+ }
49
+
50
+ @ViewBuilder
51
+ private func buildCloseIcon() -> some View {
52
+ HStack(alignment: .center, spacing: 0) {
53
+ SwiftUI.Button(action: {
54
+ onIconClose?()
55
+ }) {
56
+ ZStack {
57
+ Circle()
58
+ .strokeBorder(theme.colors.background.surface, lineWidth: 2)
59
+ .background(Circle().fill(theme.colors.text.default))
60
+ .frame(width: 22, height: 22)
61
+
62
+ Icon(source: "navigation_close", size: 16, color: theme.colors.background.surface)
63
+ }
64
+ .frame(width: 40, height: 40)
65
+ .padding(8)
66
+ .zIndex(1)
67
+ }
68
+ }
69
+ }
70
+
71
+ }
72
+
73
+
74
+