@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.
- package/CLAUDE.md +99 -0
- package/PUBLISH_GUIDE.md +675 -0
- package/README.md +184 -5
- package/ios/Application/ApplicationEnvironment.swift +71 -0
- package/ios/Application/Components.swift +270 -0
- package/ios/Application/ComposeApi.swift +22 -0
- package/ios/Application/FloatingButton.swift +174 -0
- package/ios/Application/HeaderRight.swift +306 -0
- package/ios/Application/LanguageSource.swift +93 -0
- package/ios/Application/Localize.swift +378 -0
- package/ios/Application/LocalizeModifier.swift +30 -0
- package/ios/Application/MaxApi.swift +18 -0
- package/ios/Application/Navigation/BottomTab/BottomTab.swift +104 -0
- package/ios/Application/Navigation/BottomTab/BottomTabBar.swift +215 -0
- package/ios/Application/Navigation/BottomTab/CurvedContainer.swift +65 -0
- package/ios/Application/Navigation/HeaderBackProps.swift +66 -0
- package/ios/Application/Navigation/HeaderTitle.swift +57 -0
- package/ios/Application/Navigation/HeaderUser.swift +209 -0
- package/ios/Application/Navigation/NavigationContainer.swift +213 -0
- package/ios/Application/Navigation/NavigationOptions.swift +109 -0
- package/ios/Application/Navigation/Navigator.swift +453 -0
- package/ios/Application/Navigation/NavigatorManager.swift +22 -0
- package/ios/Application/Navigation/Overplay/BottomSheet.swift +256 -0
- package/ios/Application/Navigation/Overplay/ModalScreen.swift +74 -0
- package/ios/Application/Navigation/Overplay/SnackBar.swift +144 -0
- package/ios/Application/Navigation/Tracking/ScreenTracker.swift +117 -0
- package/ios/Application/Navigation/component/Header.swift +178 -0
- package/ios/Application/Navigation/component/HeaderBackground.swift +83 -0
- package/ios/Application/Navigation/component/HeaderColor.swift +65 -0
- package/ios/Application/Navigation/component/HeaderRightWidthKey.swift +11 -0
- package/ios/Application/Navigation/component/NavigationFooter.swift +90 -0
- package/ios/Application/Navigation/component/NavigationHeaderRight.swift +196 -0
- package/ios/Application/Screen.swift +250 -0
- package/ios/Application/StackScreen.swift +492 -0
- package/ios/Avatar/Avatar.swift +193 -0
- package/ios/Badge/Badge.swift +84 -0
- package/ios/Badge/BadgeDot.swift +31 -0
- package/ios/Badge/BadgeRibbon.swift +319 -0
- package/ios/BaselineView/BaselineView.swift +163 -0
- package/ios/Button/Button.swift +232 -84
- package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +126 -0
- package/ios/Carousel/Carousel.swift +196 -0
- package/ios/Checkbox/Checkbox.swift +77 -0
- package/ios/Chip/Chip.swift +120 -0
- package/ios/Collapse/Collapse.swift +192 -0
- package/ios/{Colors+Spacing → Colors+Radius+Spacing}/Colors.swift +42 -37
- package/ios/Colors+Radius+Spacing/Radius.swift +22 -0
- package/ios/{Colors+Spacing → Colors+Radius+Spacing}/Spacing.swift +3 -1
- package/ios/Colors+Radius+Spacing/Theme.swift +295 -0
- package/ios/DateTimePicker/DateTimePicker.swift +212 -0
- package/ios/DateTimePicker/DateTimePickerTypes.swift +55 -0
- package/ios/DateTimePicker/DateTimePickerUtils.swift +167 -0
- package/ios/DateTimePicker/WheelPicker.swift +165 -0
- package/ios/Divider/Divider.swift +16 -0
- package/ios/Extensions/ActiveOpacityButtonStyle.swift +14 -0
- package/ios/Extensions/Color++.swift +32 -0
- package/ios/Icon/Icon.swift +69 -0
- package/ios/IconButton/IconButton.swift +140 -0
- package/ios/Image/Image.swift +87 -0
- package/ios/Information/Information.swift +156 -0
- package/ios/Input/ErrorView.swift +58 -0
- package/ios/Input/Input.swift +461 -77
- package/ios/Input/InputPhoneNumber.swift +192 -0
- package/ios/Input/InputSearch.swift +301 -0
- package/ios/Input/InputTextArea.swift +318 -0
- package/ios/InputDropDown/InputDropDown.swift +201 -0
- package/ios/InputMoney/InputMoney.swift +405 -0
- package/ios/InputOTP/InputOTP.swift +211 -0
- package/ios/Layout/GridContext.swift +30 -0
- package/ios/Layout/Item.swift +42 -0
- package/ios/Layout/Section.swift +134 -0
- package/ios/Loader/Loader.swift +113 -0
- package/ios/Lottie/LottieView.swift +86 -0
- package/ios/MoMoUIKits.podspec +5 -0
- package/ios/OTPKeyboard/KeyboardButton.swift +13 -5
- package/ios/OTPKeyboard/OTPKeyboard.swift +1 -1
- package/ios/Pagination/PaginationDot.swift +61 -0
- package/ios/Pagination/PaginationNumber.swift +35 -0
- package/ios/Pagination/PaginationScroll.swift +101 -0
- package/ios/Pagination/PaginationWhiteDot.swift +37 -0
- package/ios/Popup/PopupDisplay.swift +279 -0
- package/ios/Popup/PopupInput.swift +92 -0
- package/ios/Popup/PopupNotify.swift +219 -0
- package/ios/Popup/PopupPromotion.swift +74 -0
- package/ios/PopupView/FullscreenPopup.swift +251 -0
- package/ios/{Popup → PopupView}/Modifiers.swift +6 -20
- package/ios/{Popup → PopupView}/PopupView.swift +38 -146
- package/ios/PopupView/Utils++.swift +281 -0
- package/ios/ProgressInfo/ProgressInfo.swift +297 -0
- package/ios/Radio/Radio.swift +69 -0
- package/ios/Rating/Rating.swift +83 -0
- package/{example/ios/Example/Preview Content/Preview Assets.xcassets/Contents.json → ios/Resources/MoMoUIKitsColors.xcassets/AccentColor.colorset/Contents.json} +5 -0
- package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Text.colorset/Contents.json +3 -3
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/Contents.json +9 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-default.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-disable.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-pressed.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-selected.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-surface.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/background-tonal.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/border-default.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/border-disable.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/gradient.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/primary.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/secondary.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-container.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-primary.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/success-secondary.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-default.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-disable.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-hint.colorset/Contents.json +38 -0
- package/ios/Resources/MoMoUIKitsColors.xcassets/ThemeColors/text-secondary.colorset/Contents.json +38 -0
- package/ios/ScrollIndicator/ScrollIndicator.swift +110 -0
- package/ios/Skeleton/Skeleton.swift +99 -0
- package/ios/Slider/Slider.swift +237 -0
- package/ios/StatusBarTap/StatusBarTap.h +13 -0
- package/ios/StatusBarTap/StatusBarTap.m +75 -0
- package/ios/Stepper/Stepper.swift +221 -0
- package/ios/Steps/Steps.swift +467 -0
- package/ios/SuggestAction/SuggestAction.swift +100 -0
- package/ios/Swipeable/SwipeCell.swift +226 -31
- package/ios/Swipeable/SwipeCellModel.swift +21 -0
- package/ios/Switch/Switch.swift +69 -0
- package/ios/TabView/TabView.swift +534 -0
- package/ios/Tag/Tag.swift +99 -0
- package/ios/Template/Logo/Logo.swift +75 -0
- package/ios/Template/TrustBanner/TrustBanner.swift +123 -0
- package/ios/Title/Title.swift +270 -0
- package/ios/Tooltip/Tooltip.swift +486 -0
- package/ios/Typography/FontScale.swift +103 -0
- package/ios/Typography/FontScaleStore.swift +58 -0
- package/ios/Typography/KitDesignSystem.swift +17 -0
- package/ios/Typography/Text.swift +262 -0
- package/ios/Typography/Typography.swift +80 -23
- package/ios/Uploader/Uploader.swift +174 -0
- package/ios/native-kits.podspec +73 -13
- package/ios-demo/MoMoUIKitsDemo.podspec +20 -0
- package/ios-demo/Resources/dot_loading.json +558 -0
- package/ios-demo/Resources/icon.json +4052 -0
- package/ios-demo/Resources/lottie_circle_loader.json +1 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/DemoScaffold.swift +48 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsBadgeDemoView.swift +25 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsButtonDemoView.swift +26 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsCheckboxDemoView.swift +19 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsChipDemoView.swift +33 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsInputDemoView.swift +48 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsPopupDemoView.swift +21 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsRadioDemoView.swift +17 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsTypographyDemoView.swift +28 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoContext.swift +31 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoFactory.swift +24 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AnimatedHeaderDemo.swift +110 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +107 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +75 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BaselineView.swift +117 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BottomTabDemo.swift +89 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ButtonDemo.swift +108 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +96 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +60 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +76 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +102 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +107 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +100 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DemoScreen.swift +420 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +56 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/HeaderUserDemo.swift +49 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +276 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +93 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconDemo.swift +81 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +65 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +96 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +117 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +94 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +94 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +88 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +120 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +85 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +87 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +73 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LocalizeDemo.swift +235 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +241 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +68 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PlaygroundData.swift +76 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +175 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +95 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +67 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +101 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +64 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +68 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SectionDemo.swift +83 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +61 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +90 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +82 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +93 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +114 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +90 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +107 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +58 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +114 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +86 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +181 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +104 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +118 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +87 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +85 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +53 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoModels.swift +15 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoRegistry.swift +73 -0
- package/package.json +6 -6
- package/publish.sh +554 -20
- package/scripts/gen-ios-color.mjs +136 -0
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -114
- package/LICENSE +0 -20
- package/android/build.gradle +0 -82
- package/android/gradle.properties +0 -5
- package/android/src/main/AndroidManifest.xml +0 -4
- package/android/src/main/java/com/momoplatform/nativekits/NativeKitsPackage.kt +0 -17
- package/android/src/main/java/com/momoplatform/nativekits/NativeKitsViewManager.kt +0 -20
- package/example/ios/Example/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -63
- package/example/ios/Example/ComponentDetail.swift +0 -35
- package/example/ios/Example/ComponentItem.swift +0 -24
- package/example/ios/Example/ComponentModel.swift +0 -33
- package/example/ios/Example/ContentView.swift +0 -53
- package/example/ios/Example/Example.entitlements +0 -10
- package/example/ios/Example/Foundation/ButtonDemo.swift +0 -80
- package/example/ios/Example/Foundation/Popup/ActionSheets.swift +0 -136
- package/example/ios/Example/Foundation/Popup/Floats.swift +0 -127
- package/example/ios/Example/Foundation/Popup/Popups.swift +0 -101
- package/example/ios/Example/Foundation/PopupDemo.swift +0 -366
- package/example/ios/Example/Foundation/TextInputDemo.swift +0 -31
- package/example/ios/Example/Foundation/TypographyDemo.swift +0 -53
- package/example/ios/Example/Foundation.swift +0 -26
- package/example/ios/Example/Info.plist +0 -18
- package/example/ios/Example/Library/SwipeableDemo.swift +0 -105
- package/example/ios/Example/Library.swift +0 -26
- package/example/ios/Example/Main.swift +0 -11
- package/example/ios/Example/Overview.swift +0 -20
- package/example/ios/Example/Resource/SFProText-Black.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Bold.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Heavy.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Light.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Medium.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Regular.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Semibold.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Thin.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Ultralight.ttf +0 -0
- package/example/ios/Example/Resource/foundation.json +0 -33
- package/example/ios/Example/Resource/library.json +0 -8
- package/example/ios/Example/Utils.swift +0 -30
- package/example/ios/Example/ViewModifier/DarkViewModifier.swift +0 -22
- package/example/ios/Example.xcodeproj/project.pbxproj +0 -570
- package/example/ios/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/example/ios/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/example/ios/Example.xcodeproj/project.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
- package/example/ios/Example.xcworkspace/contents.xcworkspacedata +0 -10
- package/example/ios/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
- package/example/ios/Podfile +0 -6
- package/example/ios/Podfile.lock +0 -16
- package/example/ios/Pods/Local Podspecs/MoMoUIKits.podspec.json +0 -29
- package/example/ios/Pods/Manifest.lock +0 -16
- package/example/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -661
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -25
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-umbrella.h +0 -16
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.debug.xcconfig +0 -12
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.release.xcconfig +0 -12
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown +0 -3
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist +0 -29
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h +0 -16
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig +0 -14
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig +0 -14
- package/ios/Colors+Spacing/Radius.swift +0 -11
- package/ios/Popup/Utils++.swift +0 -163
- package/ios/Theme.md +0 -18
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Background.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Border.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Card.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Error.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Primary.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/PrimaryDark.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/PrimaryLight.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Secondary.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Success.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/TextSecondary.colorset/Contents.json +0 -0
- /package/{example/ios/Example/Assets.xcassets → ios/Resources/MoMoUIKitsColors.xcassets}/Warning.colorset/Contents.json +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
/// Non-reactive entry point, for call sites that cannot read the environment (UIKit bridges,
|
|
4
|
+
/// free functions). Inside a SwiftUI view prefer `@Environment(\.momoFontScale)` so the view
|
|
5
|
+
/// re-renders when Dynamic Type or the host preference changes.
|
|
6
|
+
public func scaleSize(_ size: CGFloat) -> CGFloat {
|
|
7
|
+
FontScaleStore.shared.snapshot(size)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@available(*, deprecated, message: "Max font scale is fixed at 1.5; this override is no longer applied. Drop the second argument.")
|
|
11
|
+
public func scaleSize(_ size: CGFloat, _ scaleRate: CGFloat?) -> CGFloat {
|
|
12
|
+
scaleSize(size)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public enum TypographyStyle {
|
|
16
|
+
case headlineDefaultBold
|
|
17
|
+
case headerMBold
|
|
18
|
+
case headerDefaultBold
|
|
19
|
+
case headerSSemibold
|
|
20
|
+
case headerXsSemibold
|
|
21
|
+
case bodyDefaultRegular
|
|
22
|
+
case bodyDefaultRegularStrikethrough
|
|
23
|
+
case descriptionDefaultRegular
|
|
24
|
+
case descriptionDefaultRegularStrikethrough
|
|
25
|
+
case descriptionXsRegular
|
|
26
|
+
case descriptionXsRegularStrikethrough
|
|
27
|
+
case labelDefaultMedium
|
|
28
|
+
case labelSMedium
|
|
29
|
+
case labelXsMedium
|
|
30
|
+
case actionDefaultBold
|
|
31
|
+
case actionSBold
|
|
32
|
+
case actionXsBold
|
|
33
|
+
case actionXxsBold
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public extension TypographyStyle {
|
|
37
|
+
var fontSize: CGFloat {
|
|
38
|
+
switch self {
|
|
39
|
+
case .headlineDefaultBold: return 24
|
|
40
|
+
case .headerMBold: return 18
|
|
41
|
+
case .headerDefaultBold: return 16
|
|
42
|
+
case .headerSSemibold: return 14
|
|
43
|
+
case .headerXsSemibold: return 12
|
|
44
|
+
case .bodyDefaultRegular, .bodyDefaultRegularStrikethrough: return 14
|
|
45
|
+
case .descriptionDefaultRegular, .descriptionDefaultRegularStrikethrough: return 12
|
|
46
|
+
case .descriptionXsRegular, .descriptionXsRegularStrikethrough: return 10
|
|
47
|
+
case .labelDefaultMedium: return 14
|
|
48
|
+
case .labelSMedium: return 12
|
|
49
|
+
case .labelXsMedium: return 10
|
|
50
|
+
case .actionDefaultBold: return 16
|
|
51
|
+
case .actionSBold: return 14
|
|
52
|
+
case .actionXsBold: return 12
|
|
53
|
+
case .actionXxsBold: return 10
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
var lineHeight: CGFloat {
|
|
57
|
+
switch self {
|
|
58
|
+
case .headlineDefaultBold: return 34
|
|
59
|
+
case .headerMBold: return 26
|
|
60
|
+
case .headerDefaultBold: return 22
|
|
61
|
+
case .headerSSemibold: return 20
|
|
62
|
+
case .headerXsSemibold: return 18
|
|
63
|
+
case .bodyDefaultRegular, .bodyDefaultRegularStrikethrough: return 20
|
|
64
|
+
case .descriptionDefaultRegular, .descriptionDefaultRegularStrikethrough: return 18
|
|
65
|
+
case .descriptionXsRegular, .descriptionXsRegularStrikethrough: return 14
|
|
66
|
+
case .labelDefaultMedium: return 20
|
|
67
|
+
case .labelSMedium: return 18
|
|
68
|
+
case .labelXsMedium: return 14
|
|
69
|
+
case .actionDefaultBold: return 22
|
|
70
|
+
case .actionSBold: return 20
|
|
71
|
+
case .actionXsBold: return 18
|
|
72
|
+
case .actionXxsBold: return 14
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
var fontWeight: Font.Weight {
|
|
76
|
+
switch self {
|
|
77
|
+
case .headlineDefaultBold, .headerMBold, .headerDefaultBold,
|
|
78
|
+
.actionDefaultBold, .actionSBold, .actionXsBold, .actionXxsBold:
|
|
79
|
+
return .bold
|
|
80
|
+
case .headerSSemibold, .headerXsSemibold:
|
|
81
|
+
return .semibold
|
|
82
|
+
case .bodyDefaultRegular, .bodyDefaultRegularStrikethrough,
|
|
83
|
+
.descriptionDefaultRegular, .descriptionDefaultRegularStrikethrough,
|
|
84
|
+
.descriptionXsRegular, .descriptionXsRegularStrikethrough:
|
|
85
|
+
return .regular
|
|
86
|
+
case .labelDefaultMedium, .labelSMedium, .labelXsMedium:
|
|
87
|
+
return .medium
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
var isStrikethrough: Bool {
|
|
91
|
+
switch self {
|
|
92
|
+
case .bodyDefaultRegularStrikethrough,
|
|
93
|
+
.descriptionDefaultRegularStrikethrough,
|
|
94
|
+
.descriptionXsRegularStrikethrough:
|
|
95
|
+
return true
|
|
96
|
+
default:
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private func momoFontName(family: String, weight: Font.Weight) -> String? {
|
|
103
|
+
// Ngoai whitelist thi tra nil de momoFont() roi ve .system(...), dung nhu truoc DS-791.
|
|
104
|
+
guard KitDesignSystem.shared.isWhiteList else { return nil }
|
|
105
|
+
guard family == "MomoTrustSans" else { return nil }
|
|
106
|
+
switch weight {
|
|
107
|
+
case .ultraLight, .thin: return "MomoTrustSans-ExtraLight"
|
|
108
|
+
case .light: return "MomoTrustSans-Light"
|
|
109
|
+
case .regular: return "MomoTrustSans-Regular"
|
|
110
|
+
case .medium: return "MomoTrustSans-Medium"
|
|
111
|
+
case .semibold: return "MomoTrustSans-SemiBold"
|
|
112
|
+
case .bold: return "MomoTrustSans-Bold"
|
|
113
|
+
case .heavy, .black: return "MomoTrustSans-ExtraBold"
|
|
114
|
+
default: return "MomoTrustSans-Regular"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private func momoFont(size: CGFloat, weight: Font.Weight, family: String) -> Font {
|
|
119
|
+
guard let name = momoFontName(family: family, weight: weight),
|
|
120
|
+
UIFont(name: name, size: size) != nil else {
|
|
121
|
+
return .system(size: size, weight: weight)
|
|
122
|
+
}
|
|
123
|
+
return .custom(name, fixedSize: size)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public struct MomoText: View {
|
|
127
|
+
@Environment(\.appTheme) private var theme
|
|
128
|
+
@Environment(\.momoFontScale) private var fontScale
|
|
129
|
+
private let content: String
|
|
130
|
+
private let typography: TypographyStyle
|
|
131
|
+
private let color: Color?
|
|
132
|
+
private let textAlign: TextAlignment
|
|
133
|
+
private let maxLines: Int
|
|
134
|
+
private let minLines: Int
|
|
135
|
+
private let lineLimitRange: ClosedRange<Int>?
|
|
136
|
+
private let truncationMode: Text.TruncationMode
|
|
137
|
+
private let strikethrough: Bool
|
|
138
|
+
private let underline: Bool
|
|
139
|
+
private let letterSpacing: CGFloat?
|
|
140
|
+
private let softWrap: Bool
|
|
141
|
+
private let accessibilityId: String?
|
|
142
|
+
private var highlightText: [String] = []
|
|
143
|
+
|
|
144
|
+
public init(
|
|
145
|
+
_ content: String,
|
|
146
|
+
typography: TypographyStyle = .bodyDefaultRegular,
|
|
147
|
+
color: Color? = nil,
|
|
148
|
+
textAlign: TextAlignment = .leading,
|
|
149
|
+
maxLines: Int = Int.max,
|
|
150
|
+
minLines: Int = 1,
|
|
151
|
+
truncationMode: Text.TruncationMode = .tail,
|
|
152
|
+
strikethrough: Bool = false,
|
|
153
|
+
underline: Bool = false,
|
|
154
|
+
letterSpacing: CGFloat? = nil,
|
|
155
|
+
softWrap: Bool = true,
|
|
156
|
+
accessibilityId: String? = nil
|
|
157
|
+
) {
|
|
158
|
+
self.content = content
|
|
159
|
+
self.typography = typography
|
|
160
|
+
self.color = color
|
|
161
|
+
self.textAlign = textAlign
|
|
162
|
+
self.maxLines = maxLines
|
|
163
|
+
self.minLines = minLines
|
|
164
|
+
// SwiftUI's range-based `lineLimit` is iOS 16+ only; keep the range for
|
|
165
|
+
// newer OS versions and fall back to the legacy single-value overload.
|
|
166
|
+
if maxLines == Int.max && minLines <= 1 {
|
|
167
|
+
self.lineLimitRange = nil
|
|
168
|
+
} else {
|
|
169
|
+
let upper = maxLines == Int.max ? Int.max : Swift.max(maxLines, minLines)
|
|
170
|
+
self.lineLimitRange = Swift.max(1, minLines)...upper
|
|
171
|
+
}
|
|
172
|
+
self.truncationMode = truncationMode
|
|
173
|
+
self.strikethrough = strikethrough
|
|
174
|
+
self.underline = underline
|
|
175
|
+
self.letterSpacing = letterSpacing
|
|
176
|
+
self.softWrap = softWrap
|
|
177
|
+
self.accessibilityId = accessibilityId
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
init(_ content: String, typography: TypographyStyle, highlightText: [String]) {
|
|
181
|
+
self.init(content, typography: typography)
|
|
182
|
+
self.highlightText = highlightText
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Whole-word matches of `highlightText` render semibold; the longest keyword wins (RN parity).
|
|
186
|
+
private var baseText: SwiftUI.Text {
|
|
187
|
+
let keywords = highlightText.filter { !$0.isEmpty }.sorted { $0.count > $1.count }
|
|
188
|
+
guard !keywords.isEmpty else { return SwiftUI.Text(content) }
|
|
189
|
+
let highlightFont = momoFont(size: fontScale(typography.fontSize), weight: TypographyStyle.headerXsSemibold.fontWeight, family: theme.font)
|
|
190
|
+
func isWordChar(_ character: Character?) -> Bool {
|
|
191
|
+
guard let character else { return false }
|
|
192
|
+
return character.isLetter || character.isNumber || character == "_"
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
var result = SwiftUI.Text(verbatim: "")
|
|
196
|
+
var plainStart = content.startIndex
|
|
197
|
+
var index = content.startIndex
|
|
198
|
+
while index < content.endIndex {
|
|
199
|
+
let previous = index > content.startIndex ? content[content.index(before: index)] : nil
|
|
200
|
+
let keyword = isWordChar(previous) ? nil : keywords.first { keyword in
|
|
201
|
+
guard content[index...].hasPrefix(keyword) else { return false }
|
|
202
|
+
let end = content.index(index, offsetBy: keyword.count)
|
|
203
|
+
return !isWordChar(end < content.endIndex ? content[end] : nil)
|
|
204
|
+
}
|
|
205
|
+
guard let keyword else {
|
|
206
|
+
index = content.index(after: index)
|
|
207
|
+
continue
|
|
208
|
+
}
|
|
209
|
+
let end = content.index(index, offsetBy: keyword.count)
|
|
210
|
+
result = result
|
|
211
|
+
+ SwiftUI.Text(verbatim: String(content[plainStart..<index]))
|
|
212
|
+
+ SwiftUI.Text(verbatim: String(content[index..<end])).font(highlightFont)
|
|
213
|
+
plainStart = end
|
|
214
|
+
index = end
|
|
215
|
+
}
|
|
216
|
+
return result + SwiftUI.Text(verbatim: String(content[plainStart...]))
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
public var body: some View {
|
|
220
|
+
let textColor = color ?? theme.colors.text.default
|
|
221
|
+
// Strikethrough is driven either by the typography variant (mirrors Compose
|
|
222
|
+
// *Strikethrough styles) or the explicit `strikethrough` flag.
|
|
223
|
+
let isStrikethrough = strikethrough || typography.isStrikethrough
|
|
224
|
+
|
|
225
|
+
var text = baseText
|
|
226
|
+
.font(momoFont(size: fontScale(typography.fontSize), weight: typography.fontWeight, family: theme.font))
|
|
227
|
+
.foregroundColor(textColor)
|
|
228
|
+
.strikethrough(isStrikethrough, color: textColor)
|
|
229
|
+
.underline(underline, color: textColor)
|
|
230
|
+
|
|
231
|
+
if let letterSpacing = letterSpacing {
|
|
232
|
+
text = text.tracking(letterSpacing)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return text
|
|
236
|
+
.multilineTextAlignment(textAlign)
|
|
237
|
+
.lineSpacing(fontScale(typography.lineHeight) - fontScale(typography.fontSize))
|
|
238
|
+
.modifier(LineLimitModifier(range: lineLimitRange))
|
|
239
|
+
.truncationMode(truncationMode)
|
|
240
|
+
.fixedSize(horizontal: !softWrap, vertical: false)
|
|
241
|
+
.accessibilityIdentifier(accessibilityId ?? content)
|
|
242
|
+
.ignoreBoldTextSetting()
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Applies a line-limit range only on iOS 16+. Older targets use the legacy
|
|
247
|
+
// single-value overload so the file still compiles for iOS 15.
|
|
248
|
+
private struct LineLimitModifier: ViewModifier {
|
|
249
|
+
let range: ClosedRange<Int>?
|
|
250
|
+
|
|
251
|
+
func body(content: Content) -> some View {
|
|
252
|
+
if let range = range {
|
|
253
|
+
if #available(iOS 16.0, *) {
|
|
254
|
+
content.lineLimit(range)
|
|
255
|
+
} else {
|
|
256
|
+
content.lineLimit(range.upperBound)
|
|
257
|
+
}
|
|
258
|
+
} else {
|
|
259
|
+
content
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
@@ -1,30 +1,87 @@
|
|
|
1
1
|
import SwiftUI
|
|
2
2
|
|
|
3
|
+
public extension View {
|
|
4
|
+
/// Forces SwiftUI to ignore the OS "Bold Text" accessibility setting so the
|
|
5
|
+
/// kit's typography weight stays fixed and matches the Compose implementation
|
|
6
|
+
/// (which does not honor that OS setting). Apply it wherever a `.font(...)` is set.
|
|
7
|
+
func ignoreBoldTextSetting() -> some View {
|
|
8
|
+
environment(\.legibilityWeight, .regular)
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
3
12
|
public extension Font {
|
|
13
|
+
/// Non-reactive: resolves against the current `FontScaleStore` snapshot at each access. The
|
|
14
|
+
/// styles below are computed properties for that reason — as stored `static let`s they would
|
|
15
|
+
/// freeze the scale at first access and never pick up a Dynamic Type change.
|
|
16
|
+
/// Inside a view, `@Environment(\.momoFontScale)` + `fontScale.font(size:weight:)` also re-renders.
|
|
4
17
|
static func appFont(size: CGFloat) -> Font {
|
|
5
|
-
|
|
18
|
+
FontScaleStore.shared.snapshot.font(size: size)
|
|
6
19
|
}
|
|
7
20
|
|
|
8
|
-
|
|
9
|
-
static
|
|
10
|
-
static
|
|
11
|
-
static
|
|
12
|
-
static
|
|
13
|
-
static
|
|
14
|
-
static
|
|
15
|
-
static
|
|
16
|
-
static
|
|
17
|
-
static
|
|
18
|
-
static
|
|
19
|
-
static
|
|
20
|
-
static
|
|
21
|
-
static
|
|
22
|
-
static
|
|
23
|
-
static
|
|
24
|
-
static
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
static
|
|
28
|
-
static
|
|
29
|
-
static
|
|
21
|
+
// New supported typography styles
|
|
22
|
+
static var headline_default_bold: Font { appFont(size: 24).weight(.bold) }
|
|
23
|
+
static var header_m_bold: Font { appFont(size: 18).weight(.bold) }
|
|
24
|
+
static var header_default_bold: Font { appFont(size: 16).weight(.bold) }
|
|
25
|
+
static var header_default_semibold: Font { appFont(size: 16).weight(.semibold) }
|
|
26
|
+
static var header_s_semibold: Font { appFont(size: 14).weight(.semibold) }
|
|
27
|
+
static var header_xs_semibold: Font { appFont(size: 12).weight(.semibold) }
|
|
28
|
+
static var body_default_regular: Font { appFont(size: 14).weight(.regular) }
|
|
29
|
+
static var description_default_regular: Font { appFont(size: 12).weight(.regular) }
|
|
30
|
+
static var description_xs_regular: Font { appFont(size: 10).weight(.regular) }
|
|
31
|
+
static var label_default_medium: Font { appFont(size: 14).weight(.medium) }
|
|
32
|
+
static var label_s_medium: Font { appFont(size: 12).weight(.medium) }
|
|
33
|
+
static var label_xs_medium: Font { appFont(size: 10).weight(.medium) }
|
|
34
|
+
static var action_default_bold: Font { appFont(size: 16).weight(.bold) }
|
|
35
|
+
static var action_s_bold: Font { appFont(size: 14).weight(.bold) }
|
|
36
|
+
static var action_xs_bold: Font { appFont(size: 12).weight(.bold) }
|
|
37
|
+
static var action_xxs_bold: Font { appFont(size: 10).weight(.bold) }
|
|
38
|
+
|
|
39
|
+
// Legacy styles
|
|
40
|
+
static var headline_default: Font { appFont(size: 28).weight(.semibold) }
|
|
41
|
+
static var headline_s: Font { appFont(size: 24).weight(.semibold) }
|
|
42
|
+
static var headline_l: Font { appFont(size: 32).weight(.semibold) }
|
|
43
|
+
static var headline_xl: Font { appFont(size: 36).weight(.semibold) }
|
|
44
|
+
static var title_default: Font { appFont(size: 20).weight(.bold) }
|
|
45
|
+
static var title_xs: Font { appFont(size: 16).weight(.bold) }
|
|
46
|
+
static var title_s: Font { appFont(size: 18).weight(.bold) }
|
|
47
|
+
static var header_default: Font { appFont(size: 15).weight(.semibold) }
|
|
48
|
+
static var header_xs: Font { appFont(size: 12).weight(.semibold) }
|
|
49
|
+
static var header_s: Font { appFont(size: 14).weight(.semibold) }
|
|
50
|
+
static var paragraph_default: Font { appFont(size: 15).weight(.regular) }
|
|
51
|
+
static var paragraph_bold: Font { appFont(size: 15).weight(.bold) }
|
|
52
|
+
static var description_default: Font { appFont(size: 14).weight(.regular) }
|
|
53
|
+
static var description_xs: Font { appFont(size: 10).weight(.regular) }
|
|
54
|
+
static var description_s: Font { appFont(size: 12).weight(.regular) }
|
|
55
|
+
static var label_default: Font { appFont(size: 14).weight(.medium) }
|
|
56
|
+
static var label_xxs: Font { appFont(size: 8).weight(.medium) }
|
|
57
|
+
static var label_xs: Font { appFont(size: 10).weight(.medium) }
|
|
58
|
+
static var label_s: Font { appFont(size: 12).weight(.medium) }
|
|
59
|
+
static var action_default: Font { appFont(size: 16).weight(.bold) }
|
|
60
|
+
static var action_xxs: Font { appFont(size: 10).weight(.bold) }
|
|
61
|
+
static var action_xs: Font { appFont(size: 12).weight(.bold) }
|
|
62
|
+
static var action_s: Font { appFont(size: 15).weight(.bold) }
|
|
63
|
+
|
|
64
|
+
// deprecated
|
|
65
|
+
static var h1: Font { appFont(size: 36).weight(.semibold) } //headline_xl
|
|
66
|
+
static var h2: Font { appFont(size: 32).weight(.semibold) }
|
|
67
|
+
static var h3: Font { appFont(size: 28).weight(.semibold) }
|
|
68
|
+
static var h4: Font { appFont(size: 24).weight(.semibold) }
|
|
69
|
+
static var title1: Font { appFont(size: 20).weight(.bold) }
|
|
70
|
+
static var title2: Font { appFont(size: 18).weight(.bold) }
|
|
71
|
+
static var title3: Font { appFont(size: 16).weight(.bold) }
|
|
72
|
+
static var headerText1: Font { appFont(size: 15).weight(.semibold) } //header_default
|
|
73
|
+
static var headerText2: Font { appFont(size: 14).weight(.semibold) }
|
|
74
|
+
static var headerText3: Font { appFont(size: 12).weight(.semibold) }
|
|
75
|
+
static var paragraph: Font { appFont(size: 15).weight(.regular) } //paragraph_default
|
|
76
|
+
static var description1: Font { appFont(size: 14).weight(.regular) }
|
|
77
|
+
static var description2: Font { appFont(size: 12).weight(.regular) }
|
|
78
|
+
static var description3: Font { appFont(size: 10).weight(.regular) }
|
|
79
|
+
static var label1: Font { appFont(size: 14).weight(.medium) }
|
|
80
|
+
static var label2: Font { appFont(size: 12).weight(.medium) }
|
|
81
|
+
static var label3: Font { appFont(size: 10).weight(.medium) }
|
|
82
|
+
static var label4: Font { appFont(size: 8).weight(.medium) }
|
|
83
|
+
static var action1: Font { appFont(size: 16).weight(.bold) }
|
|
84
|
+
static var action2: Font { appFont(size: 15).weight(.bold) }
|
|
85
|
+
static var action3: Font { appFont(size: 12).weight(.bold) }
|
|
86
|
+
static var action4: Font { appFont(size: 10).weight(.bold) }
|
|
30
87
|
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
/// Native SwiftUI port of the Compose `Uploader` component.
|
|
4
|
+
///
|
|
5
|
+
/// Renders a horizontal row with an optional dashed "add image" picker cell
|
|
6
|
+
/// followed by a horizontally scrollable list of uploaded image thumbnails.
|
|
7
|
+
/// Each thumbnail can show a loading shimmer overlay and an optional cancel
|
|
8
|
+
/// button.
|
|
9
|
+
///
|
|
10
|
+
/// Mirrors the Compose surface in
|
|
11
|
+
/// `compose/.../components/Uploader.kt`:
|
|
12
|
+
/// - `images`, `numberOfImages`, `disabled`, `width`, `height`
|
|
13
|
+
/// - callbacks `onAdd`, `onCancel`, `onPressImage`
|
|
14
|
+
///
|
|
15
|
+
/// Note: like Compose, this component does NOT perform any native photo-picker
|
|
16
|
+
/// or file-system access. It exposes the `onAdd` callback so the host can
|
|
17
|
+
/// present a picker and supply the resulting image data back via the `images`
|
|
18
|
+
/// list (the demo passes mock image URLs).
|
|
19
|
+
public struct UploadImage: Identifiable {
|
|
20
|
+
public let id = UUID()
|
|
21
|
+
public var uri: String?
|
|
22
|
+
public var loading: Bool
|
|
23
|
+
|
|
24
|
+
public init(uri: String? = nil, loading: Bool = false) {
|
|
25
|
+
self.uri = uri
|
|
26
|
+
self.loading = loading
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public struct Uploader: View {
|
|
31
|
+
// MARK: Properties
|
|
32
|
+
|
|
33
|
+
private let images: [UploadImage]
|
|
34
|
+
private let numberOfImages: Int
|
|
35
|
+
private let disabled: Bool
|
|
36
|
+
private let width: CGFloat
|
|
37
|
+
private let height: CGFloat
|
|
38
|
+
private let onAdd: () -> Void
|
|
39
|
+
private let onCancel: ((UploadImage, Int) -> Void)?
|
|
40
|
+
private let onPressImage: (UploadImage, Int) -> Void
|
|
41
|
+
|
|
42
|
+
// MARK: Lifecycle
|
|
43
|
+
|
|
44
|
+
public init(
|
|
45
|
+
images: [UploadImage],
|
|
46
|
+
numberOfImages: Int = 1,
|
|
47
|
+
disabled: Bool = false,
|
|
48
|
+
width: CGFloat = 64,
|
|
49
|
+
height: CGFloat = 64,
|
|
50
|
+
onAdd: @escaping () -> Void = {},
|
|
51
|
+
onCancel: ((UploadImage, Int) -> Void)? = nil,
|
|
52
|
+
onPressImage: @escaping (UploadImage, Int) -> Void = { _, _ in }
|
|
53
|
+
) {
|
|
54
|
+
self.images = images
|
|
55
|
+
self.numberOfImages = numberOfImages
|
|
56
|
+
self.disabled = disabled
|
|
57
|
+
self.width = width
|
|
58
|
+
self.height = height
|
|
59
|
+
self.onAdd = onAdd
|
|
60
|
+
self.onCancel = onCancel
|
|
61
|
+
self.onPressImage = onPressImage
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// MARK: Body
|
|
65
|
+
|
|
66
|
+
private var shouldShowPicker: Bool {
|
|
67
|
+
images.count < numberOfImages
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public var body: some View {
|
|
71
|
+
HStack(alignment: .top, spacing: Spacing.S) {
|
|
72
|
+
if shouldShowPicker {
|
|
73
|
+
UploaderPickerCell(
|
|
74
|
+
disabled: disabled,
|
|
75
|
+
width: width,
|
|
76
|
+
height: height,
|
|
77
|
+
onAdd: onAdd
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
ScrollView(.horizontal, showsIndicators: false) {
|
|
82
|
+
HStack(alignment: .top, spacing: Spacing.S) {
|
|
83
|
+
ForEach(Array(images.enumerated()), id: \.element.id) { index, image in
|
|
84
|
+
UploaderImageItem(
|
|
85
|
+
image: image,
|
|
86
|
+
width: width,
|
|
87
|
+
height: height,
|
|
88
|
+
index: index,
|
|
89
|
+
onCancel: onCancel,
|
|
90
|
+
onPressImage: { onPressImage(image, index) }
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// MARK: - Picker cell
|
|
100
|
+
|
|
101
|
+
private struct UploaderPickerCell: View {
|
|
102
|
+
@Environment(\.appTheme) private var theme
|
|
103
|
+
|
|
104
|
+
let disabled: Bool
|
|
105
|
+
let width: CGFloat
|
|
106
|
+
let height: CGFloat
|
|
107
|
+
let onAdd: () -> Void
|
|
108
|
+
|
|
109
|
+
// text.disable / text.hint and border.disable / border.default tokens.
|
|
110
|
+
private var mainColor: Color { disabled ? theme.colors.text.disable : theme.colors.text.hint }
|
|
111
|
+
private var borderColor: Color { disabled ? theme.colors.border.disable : theme.colors.border.default }
|
|
112
|
+
|
|
113
|
+
var body: some View {
|
|
114
|
+
SwiftUI.Button(action: { if !disabled { onAdd() } }) {
|
|
115
|
+
VStack(spacing: Spacing.XXS) {
|
|
116
|
+
Icon(source: "16_navigation_plus", size: 16, color: mainColor)
|
|
117
|
+
MomoText("Thêm hình", typography: .descriptionXsRegular, color: mainColor)
|
|
118
|
+
}
|
|
119
|
+
.frame(width: width, height: height)
|
|
120
|
+
.background(
|
|
121
|
+
RoundedRectangle(cornerRadius: Radius.XS)
|
|
122
|
+
.strokeBorder(
|
|
123
|
+
borderColor,
|
|
124
|
+
style: StrokeStyle(lineWidth: 1, dash: [10, 6])
|
|
125
|
+
)
|
|
126
|
+
)
|
|
127
|
+
.clipShape(RoundedRectangle(cornerRadius: Radius.XS))
|
|
128
|
+
}
|
|
129
|
+
.buttonStyle(ActiveOpacityButtonStyle())
|
|
130
|
+
.disabled(disabled)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// MARK: - Image item
|
|
135
|
+
|
|
136
|
+
private struct UploaderImageItem: View {
|
|
137
|
+
let image: UploadImage
|
|
138
|
+
let width: CGFloat
|
|
139
|
+
let height: CGFloat
|
|
140
|
+
let index: Int
|
|
141
|
+
let onCancel: ((UploadImage, Int) -> Void)?
|
|
142
|
+
let onPressImage: () -> Void
|
|
143
|
+
|
|
144
|
+
var body: some View {
|
|
145
|
+
SwiftUI.Button(action: onPressImage) {
|
|
146
|
+
ZStack(alignment: .topTrailing) {
|
|
147
|
+
ImageView(image.uri ?? "", contentMode: .fill)
|
|
148
|
+
.frame(width: width, height: height)
|
|
149
|
+
.clipShape(RoundedRectangle(cornerRadius: Radius.XS))
|
|
150
|
+
|
|
151
|
+
if image.loading {
|
|
152
|
+
Skeleton()
|
|
153
|
+
.frame(width: width, height: height)
|
|
154
|
+
.clipShape(RoundedRectangle(cornerRadius: Radius.XS))
|
|
155
|
+
.background(
|
|
156
|
+
Color.white.opacity(0.4)
|
|
157
|
+
.clipShape(RoundedRectangle(cornerRadius: Radius.XS))
|
|
158
|
+
)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if let onCancel, !image.loading {
|
|
162
|
+
SwiftUI.Button(action: { onCancel(image, index) }) {
|
|
163
|
+
Icon(source: "navigation_close_circle_full", size: 16, color: nil)
|
|
164
|
+
}
|
|
165
|
+
.buttonStyle(ActiveOpacityButtonStyle())
|
|
166
|
+
.padding(.top, Spacing.XXS)
|
|
167
|
+
.padding(.trailing, Spacing.XXS)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
.frame(width: width, height: height)
|
|
171
|
+
}
|
|
172
|
+
.buttonStyle(ActiveOpacityButtonStyle())
|
|
173
|
+
}
|
|
174
|
+
}
|
package/ios/native-kits.podspec
CHANGED
|
@@ -1,15 +1,75 @@
|
|
|
1
|
-
Pod::Spec.new do |
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
spec.swift_versions = ['5.0']
|
|
10
|
-
spec.ios.deployment_target = '13.0'
|
|
1
|
+
Pod::Spec.new do |s|
|
|
2
|
+
s.name = 'MoMoUIKits'
|
|
3
|
+
s.version = '0.167.1-beta.4'
|
|
4
|
+
s.summary = 'MoMoUIKits for iOS'
|
|
5
|
+
s.homepage = 'https://momo.vn'
|
|
6
|
+
s.license = { :type => 'MIT' }
|
|
7
|
+
s.author = { 'MoMo' => 'dev@momo.vn' }
|
|
8
|
+
s.source = { :path => '.' }
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
s.ios.deployment_target = '15.0'
|
|
11
|
+
s.swift_version = '5.0'
|
|
12
|
+
s.module_name = 'MoMoUIKits'
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
s.source_files = [
|
|
15
|
+
"Application/**/*.{swift,m,h}",
|
|
16
|
+
"Avatar/**/*.{swift,m,h}",
|
|
17
|
+
"Badge/**/*.{swift,m,h}",
|
|
18
|
+
"BaselineView/**/*.{swift,m,h}",
|
|
19
|
+
"Button/**/*.{swift,m,h}",
|
|
20
|
+
"CalculatorKeyboard/**/*.{swift,m,h}",
|
|
21
|
+
"Carousel/**/*.{swift,m,h}",
|
|
22
|
+
"Checkbox/**/*.{swift,m,h}",
|
|
23
|
+
"Chip/**/*.{swift,m,h}",
|
|
24
|
+
"Collapse/**/*.{swift,m,h}",
|
|
25
|
+
"Colors+Radius+Spacing/**/*.{swift,m,h}",
|
|
26
|
+
"DateTimePicker/**/*.{swift,m,h}",
|
|
27
|
+
"Divider/**/*.{swift,m,h}",
|
|
28
|
+
"Extensions/**/*.{swift,m,h}",
|
|
29
|
+
"Icon/**/*.{swift,m,h}",
|
|
30
|
+
"IconButton/**/*.{swift,m,h}",
|
|
31
|
+
"Image/**/*.{swift,m,h}",
|
|
32
|
+
"Information/**/*.{swift,m,h}",
|
|
33
|
+
"Input/**/*.{swift,m,h}",
|
|
34
|
+
"InputDropDown/**/*.{swift,m,h}",
|
|
35
|
+
"InputMoney/**/*.{swift,m,h}",
|
|
36
|
+
"InputOTP/**/*.{swift,m,h}",
|
|
37
|
+
"Layout/**/*.{swift,m,h}",
|
|
38
|
+
"Loader/**/*.{swift,m,h}",
|
|
39
|
+
"Lottie/**/*.{swift,m,h}",
|
|
40
|
+
"OTPKeyboard/**/*.{swift,m,h}",
|
|
41
|
+
"Pagination/**/*.{swift,m,h}",
|
|
42
|
+
"Popup/**/*.{swift,m,h}",
|
|
43
|
+
"PopupView/**/*.{swift,m,h}",
|
|
44
|
+
"ProgressInfo/**/*.{swift,m,h}",
|
|
45
|
+
"Radio/**/*.{swift,m,h}",
|
|
46
|
+
"Rating/**/*.{swift,m,h}",
|
|
47
|
+
"ScrollIndicator/**/*.{swift,m,h}",
|
|
48
|
+
"Skeleton/**/*.{swift,m,h}",
|
|
49
|
+
"Slider/**/*.{swift,m,h}",
|
|
50
|
+
"StatusBarTap/**/*.{swift,m,h}",
|
|
51
|
+
"Stepper/**/*.{swift,m,h}",
|
|
52
|
+
"Steps/**/*.{swift,m,h}",
|
|
53
|
+
"SuggestAction/**/*.{swift,m,h}",
|
|
54
|
+
"Swipeable/**/*.{swift,m,h}",
|
|
55
|
+
"Switch/**/*.{swift,m,h}",
|
|
56
|
+
"TabView/**/*.{swift,m,h}",
|
|
57
|
+
"Tag/**/*.{swift,m,h}",
|
|
58
|
+
"Template/**/*.{swift,m,h}",
|
|
59
|
+
"Title/**/*.{swift,m,h}",
|
|
60
|
+
"Tooltip/**/*.{swift,m,h}",
|
|
61
|
+
"Typography/**/*.{swift,m,h}",
|
|
62
|
+
"Uploader/**/*.{swift,m,h}"
|
|
63
|
+
]
|
|
64
|
+
s.resource_bundles = {
|
|
65
|
+
'MoMoUIKitsResources' => ['Resources/**/*']
|
|
66
|
+
}
|
|
67
|
+
s.public_header_files = "StatusBarTap/*.h"
|
|
68
|
+
s.frameworks = 'SwiftUI', 'Combine'
|
|
69
|
+
s.pod_target_xcconfig = {
|
|
70
|
+
'DEFINES_MODULE' => 'YES'
|
|
71
|
+
}
|
|
72
|
+
s.dependency 'SDWebImageSwiftUI', '2.2.1'
|
|
73
|
+
s.dependency 'lottie-ios', '4.6.0'
|
|
74
|
+
s.dependency 'SkeletonUI', '1.0.11'
|
|
75
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Pod::Spec.new do |s|
|
|
2
|
+
s.name = 'MoMoUIKitsDemo'
|
|
3
|
+
s.version = '0.167.1-beta.4'
|
|
4
|
+
s.summary = 'Demo browser for MoMoUIKits SwiftUI components'
|
|
5
|
+
s.homepage = 'https://momo.vn'
|
|
6
|
+
s.license = { :type => 'MIT' }
|
|
7
|
+
s.author = { 'MoMo' => 'dev@momo.vn' }
|
|
8
|
+
s.source = { :path => '.' }
|
|
9
|
+
|
|
10
|
+
s.ios.deployment_target = '15.0'
|
|
11
|
+
s.swift_version = '5.0'
|
|
12
|
+
|
|
13
|
+
s.source_files = 'Sources/**/*.{swift}'
|
|
14
|
+
s.resource_bundles = {
|
|
15
|
+
'MoMoUIKitsDemoResources' => ['Resources/**/*']
|
|
16
|
+
}
|
|
17
|
+
s.frameworks = 'SwiftUI', 'UIKit'
|
|
18
|
+
s.dependency 'MoMoUIKits'
|
|
19
|
+
s.dependency 'lottie-ios', '4.6.0'
|
|
20
|
+
end
|