@momo-kits/native-kits 0.162.2-debug → 0.162.2-sp.1-debug
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/settings.local.json +55 -0
- package/compose/build.gradle.kts +1 -1
- package/compose/compose.podspec +1 -1
- package/gradle.properties +1 -1
- package/ios/Application/Components.swift +34 -43
- package/ios/Application/FloatingButton.swift +10 -8
- package/ios/Application/Navigation/BottomTab/BottomTab.swift +102 -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 +151 -0
- package/ios/Application/Navigation/NavigationOptions.swift +109 -0
- package/ios/Application/Navigation/Navigator.swift +360 -0
- package/ios/Application/Navigation/Overplay/BottomSheet.swift +176 -0
- package/ios/Application/Navigation/Overplay/ModalScreen.swift +68 -0
- package/ios/Application/Navigation/Overplay/SnackBar.swift +144 -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/StackScreen.swift +449 -0
- package/ios/Avatar/Avatar.swift +193 -0
- package/ios/Badge/Badge.swift +11 -13
- package/ios/Badge/BadgeRibbon.swift +12 -19
- package/ios/BaselineView/BaselineView.swift +163 -0
- package/ios/Button/Button.swift +62 -23
- package/ios/Carousel/Carousel.swift +181 -0
- package/ios/Checkbox/Checkbox.swift +14 -12
- package/ios/Chip/Chip.swift +23 -9
- package/ios/Collapse/Collapse.swift +182 -0
- package/ios/Colors+Radius+Spacing/Colors.swift +1 -1
- package/ios/Colors+Radius+Spacing/Theme.swift +295 -0
- package/ios/DateTimePicker/DateTimePicker.swift +210 -0
- package/ios/DateTimePicker/DateTimePickerTypes.swift +55 -0
- package/ios/DateTimePicker/DateTimePickerUtils.swift +167 -0
- package/ios/DateTimePicker/WheelPicker.swift +161 -0
- package/ios/Divider/Divider.swift +16 -0
- package/ios/Icon/Icon.swift +6 -1
- package/ios/IconButton/IconButton.swift +112 -0
- package/ios/Information/Information.swift +151 -0
- package/ios/Input/Input.swift +42 -25
- package/ios/Input/InputPhoneNumber.swift +21 -19
- package/ios/Input/InputSearch.swift +101 -45
- package/ios/Input/InputTextArea.swift +67 -40
- package/ios/InputDropDown/InputDropDown.swift +198 -0
- package/ios/InputMoney/InputMoney.swift +335 -0
- package/ios/InputOTP/InputOTP.swift +210 -0
- package/ios/Loader/Loader.swift +113 -0
- package/ios/MoMoUIKits.podspec +5 -0
- package/ios/OTPKeyboard/KeyboardButton.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 +10 -12
- package/ios/Popup/PopupInput.swift +2 -6
- package/ios/Popup/PopupNotify.swift +219 -0
- package/ios/ProgressInfo/ProgressInfo.swift +294 -0
- package/ios/Radio/Radio.swift +70 -0
- package/ios/Rating/Rating.swift +82 -0
- package/ios/Skeleton/Skeleton.swift +99 -0
- package/ios/Slider/Slider.swift +237 -0
- package/ios/Stepper/Stepper.swift +220 -0
- package/ios/Steps/Steps.swift +451 -0
- package/ios/SuggestAction/SuggestAction.swift +97 -0
- package/ios/Swipeable/SwipeCell.swift +185 -0
- package/ios/Swipeable/SwipeCellModel.swift +21 -0
- package/ios/TabView/TabView.swift +530 -0
- package/ios/Tag/Tag.swift +98 -0
- package/ios/Template/TrustBanner/TrustBanner.swift +2 -0
- package/ios/Title/Title.swift +269 -0
- package/ios/Tooltip/Tooltip.swift +482 -0
- package/ios/Typography/Text.swift +77 -5
- package/ios/Typography/Typography.swift +9 -0
- package/ios/Uploader/Uploader.swift +183 -0
- package/ios/native-kits.podspec +58 -8
- package/ios-demo/MoMoUIKitsDemo.podspec +18 -0
- package/ios-demo/README.md +120 -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 +72 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AnimatedHeaderDemo.swift +110 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +93 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +269 -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 +100 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +126 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +63 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +20 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +93 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +107 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +124 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +14 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/HeaderUserDemo.swift +49 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +261 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +58 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +78 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +138 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +111 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +136 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +107 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +73 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +100 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +32 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +57 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +70 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +227 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +72 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +175 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +121 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +76 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +89 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +32 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +56 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +32 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +150 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +138 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +103 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +94 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +79 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +152 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +33 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +190 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +34 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +182 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +109 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +187 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +87 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +131 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +50 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoModels.swift +15 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoRegistry.swift +73 -0
- package/local.properties +8 -0
- package/package.json +1 -1
- package/publish.sh +50 -0
- package/scripts/gen-ios-color.mjs +136 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"v":"5.10.2","fr":30,"ip":0,"op":20,"w":100,"h":100,"nm":"Spinner3.1_Refine","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":12,"ty":4,"nm":"loading 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":20}],"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2,"l":2},"a":{"a":0,"k":[44.124,44.124,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[90,90],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.996078431373,0.956862745098,0.980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[44.124,44.124],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20],"e":[0]},{"t":20}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[35],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[50],"e":[35]},{"t":20}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":20,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"loading 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0],"e":[360]},{"t":20}],"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2,"l":2},"a":{"a":0,"k":[44.124,44.124,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[90,90],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.835294117647,0.917647058824,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[44.124,44.124],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0],"e":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[20],"e":[0]},{"t":20}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[35],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[50],"e":[35]},{"t":20}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":20,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"base pink 2","sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2,"l":2},"a":{"a":0,"k":[44.124,44.124,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[90,90],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.996078431373,0.972549019608,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[44.124,44.124],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":20,"st":0,"ct":1,"bm":0}],"markers":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct DemoScaffold<Content: View>: View {
|
|
5
|
+
let title: String
|
|
6
|
+
let content: Content
|
|
7
|
+
|
|
8
|
+
init(title: String, @ViewBuilder content: () -> Content) {
|
|
9
|
+
self.title = title
|
|
10
|
+
self.content = content()
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
var body: some View {
|
|
14
|
+
ScrollView {
|
|
15
|
+
VStack(alignment: .leading, spacing: 16) {
|
|
16
|
+
MomoText(title, typography: .headlineDefaultBold)
|
|
17
|
+
content
|
|
18
|
+
}
|
|
19
|
+
.frame(maxWidth: .infinity, alignment: .leading)
|
|
20
|
+
.padding(16)
|
|
21
|
+
}
|
|
22
|
+
.background(defaultTheme.colors.background.default.ignoresSafeArea())
|
|
23
|
+
.navigationTitle(title)
|
|
24
|
+
.navigationBarTitleDisplayMode(.inline)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
struct DemoSection<Content: View>: View {
|
|
29
|
+
let title: String
|
|
30
|
+
let content: Content
|
|
31
|
+
|
|
32
|
+
init(_ title: String, @ViewBuilder content: () -> Content) {
|
|
33
|
+
self.title = title
|
|
34
|
+
self.content = content()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
var body: some View {
|
|
38
|
+
VStack(alignment: .leading, spacing: 12) {
|
|
39
|
+
MomoText(title, typography: .headerDefaultBold)
|
|
40
|
+
content
|
|
41
|
+
}
|
|
42
|
+
.frame(maxWidth: .infinity, alignment: .leading)
|
|
43
|
+
.padding(16)
|
|
44
|
+
.background(defaultTheme.colors.background.surface)
|
|
45
|
+
.clipShape(RoundedRectangle(cornerRadius: Radius.S, style: .continuous))
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct UIKitsBadgeDemoView: View {
|
|
5
|
+
var body: some View {
|
|
6
|
+
DemoScaffold(title: "Badge") {
|
|
7
|
+
DemoSection("Numeric") {
|
|
8
|
+
HStack(spacing: 12) {
|
|
9
|
+
Badge(label: "1")
|
|
10
|
+
Badge(label: "12")
|
|
11
|
+
Badge(label: "100")
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
DemoSection("Labels") {
|
|
16
|
+
HStack(spacing: 12) {
|
|
17
|
+
Badge(label: "New")
|
|
18
|
+
Badge(label: "Hot", backgroundColor: Colors.pink03)
|
|
19
|
+
Badge(label: "Sale", backgroundColor: Colors.orange03)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct UIKitsButtonDemoView: View {
|
|
5
|
+
var body: some View {
|
|
6
|
+
DemoScaffold(title: "Button") {
|
|
7
|
+
DemoSection("Types") {
|
|
8
|
+
MoMoUIKits.Button(title: "Primary Button", action: {})
|
|
9
|
+
MoMoUIKits.Button(title: "Secondary Button", action: {}, type: .secondary)
|
|
10
|
+
MoMoUIKits.Button(title: "Tonal Button", action: {}, type: .tonal)
|
|
11
|
+
MoMoUIKits.Button(title: "Outline Button", action: {}, type: .outline)
|
|
12
|
+
MoMoUIKits.Button(title: "Danger Button", action: {}, type: .danger)
|
|
13
|
+
MoMoUIKits.Button(title: "Text Button", action: {}, type: .text)
|
|
14
|
+
MoMoUIKits.Button(title: "Disabled Button", action: {}, type: .disabled)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
DemoSection("Sizes and Loading") {
|
|
18
|
+
MoMoUIKits.Button(title: "Large", action: {}, size: .large)
|
|
19
|
+
MoMoUIKits.Button(title: "Medium", action: {}, size: .medium)
|
|
20
|
+
MoMoUIKits.Button(title: "Small", action: {}, size: .small)
|
|
21
|
+
MoMoUIKits.Button(title: "Loading", action: {}, loading: true)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct UIKitsCheckboxDemoView: View {
|
|
5
|
+
@State private var checked = true
|
|
6
|
+
@State private var unchecked = false
|
|
7
|
+
|
|
8
|
+
var body: some View {
|
|
9
|
+
DemoScaffold(title: "Checkbox") {
|
|
10
|
+
DemoSection("States") {
|
|
11
|
+
Checkbox($checked, title: "Checked")
|
|
12
|
+
Checkbox($unchecked, title: "Unchecked")
|
|
13
|
+
Checkbox(.constant(true), disabled: true, title: "Disabled checked")
|
|
14
|
+
Checkbox(.constant(true), indeterminate: true, title: "Indeterminate")
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct UIKitsChipDemoView: View {
|
|
5
|
+
@State private var selected = "All"
|
|
6
|
+
|
|
7
|
+
var body: some View {
|
|
8
|
+
DemoScaffold(title: "Chip") {
|
|
9
|
+
DemoSection("Selectable") {
|
|
10
|
+
HStack(spacing: 8) {
|
|
11
|
+
chip("All")
|
|
12
|
+
chip("Active")
|
|
13
|
+
chip("Done")
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
DemoSection("Sizes") {
|
|
18
|
+
HStack(spacing: 8) {
|
|
19
|
+
Chip(label: "Large", size: .large)
|
|
20
|
+
Chip(label: "Small", size: .small)
|
|
21
|
+
Chip(label: "Selected", selected: true, size: .large)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private func chip(_ label: String) -> some View {
|
|
28
|
+
Chip(label: label, selected: selected == label) {
|
|
29
|
+
selected = label
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct UIKitsInputDemoView: View {
|
|
5
|
+
@State private var text = ""
|
|
6
|
+
@State private var phone = "0987654321"
|
|
7
|
+
@State private var password = "momokits"
|
|
8
|
+
|
|
9
|
+
var body: some View {
|
|
10
|
+
DemoScaffold(title: "Input") {
|
|
11
|
+
DemoSection("Text Input") {
|
|
12
|
+
Input(
|
|
13
|
+
text: $text,
|
|
14
|
+
placeholder: "Enter text",
|
|
15
|
+
hintText: "Hint text",
|
|
16
|
+
onChangeText: { text = $0 }
|
|
17
|
+
)
|
|
18
|
+
Input(
|
|
19
|
+
text: $phone,
|
|
20
|
+
placeholder: "Phone number",
|
|
21
|
+
floatingValue: "Phone",
|
|
22
|
+
keyboardType: .phonePad,
|
|
23
|
+
onChangeText: { phone = $0 }
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
DemoSection("States") {
|
|
28
|
+
Input(
|
|
29
|
+
text: $password,
|
|
30
|
+
placeholder: "Password",
|
|
31
|
+
secureTextEntry: true,
|
|
32
|
+
onChangeText: { password = $0 }
|
|
33
|
+
)
|
|
34
|
+
Input(
|
|
35
|
+
text: .constant("Invalid value"),
|
|
36
|
+
placeholder: "Error",
|
|
37
|
+
error: "This field has an error"
|
|
38
|
+
)
|
|
39
|
+
Input(
|
|
40
|
+
text: .constant("Disabled value"),
|
|
41
|
+
placeholder: "Disabled",
|
|
42
|
+
disabled: true
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct UIKitsPopupDemoView: View {
|
|
5
|
+
var body: some View {
|
|
6
|
+
DemoScaffold(title: "Popup Notify") {
|
|
7
|
+
DemoSection("Default") {
|
|
8
|
+
PopupNotify(
|
|
9
|
+
props: PopupNotifyProps(
|
|
10
|
+
title: "Payment successful",
|
|
11
|
+
description: "This popup demonstrates the native SwiftUI notification component.",
|
|
12
|
+
primary: PopupAction(title: "Done", onPress: {}),
|
|
13
|
+
secondary: PopupAction(title: "Later", onPress: {}),
|
|
14
|
+
onIconClose: {}
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct UIKitsRadioDemoView: View {
|
|
5
|
+
@State private var selected: AnyHashable = "compose"
|
|
6
|
+
|
|
7
|
+
var body: some View {
|
|
8
|
+
DemoScaffold(title: "Radio") {
|
|
9
|
+
DemoSection("Options") {
|
|
10
|
+
Radio(value: "compose", groupValue: $selected, label: "Compose")
|
|
11
|
+
Radio(value: "swiftui", groupValue: $selected, label: "SwiftUI")
|
|
12
|
+
Radio(value: "disabled", groupValue: $selected, disabled: true, label: "Disabled")
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
struct UIKitsTypographyDemoView: View {
|
|
5
|
+
var body: some View {
|
|
6
|
+
DemoScaffold(title: "Typography") {
|
|
7
|
+
DemoSection("Headings") {
|
|
8
|
+
MomoText("Headline default bold", typography: .headlineDefaultBold)
|
|
9
|
+
MomoText("Header medium bold", typography: .headerMBold)
|
|
10
|
+
MomoText("Header default bold", typography: .headerDefaultBold)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
DemoSection("Body") {
|
|
14
|
+
MomoText("Body default regular", typography: .bodyDefaultRegular)
|
|
15
|
+
MomoText("Description default regular", typography: .descriptionDefaultRegular)
|
|
16
|
+
MomoText("Label default medium", typography: .labelDefaultMedium)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
DemoSection("Colors") {
|
|
20
|
+
MomoText("Primary text", typography: .bodyDefaultRegular, color: defaultTheme.colors.primary)
|
|
21
|
+
MomoText("Success text", typography: .bodyDefaultRegular, color: defaultTheme.colors.success.primary)
|
|
22
|
+
MomoText("Warning text", typography: .bodyDefaultRegular, color: defaultTheme.colors.warning.primary)
|
|
23
|
+
MomoText("Error text", typography: .bodyDefaultRegular, color: defaultTheme.colors.error.primary)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import MoMoUIKits
|
|
3
|
+
|
|
4
|
+
public struct MoMoUIKitsDemoContext {
|
|
5
|
+
public let appId: String
|
|
6
|
+
public let appCode: String
|
|
7
|
+
public let appName: String?
|
|
8
|
+
public let appIcon: String
|
|
9
|
+
|
|
10
|
+
public init(
|
|
11
|
+
appId: String = "",
|
|
12
|
+
appCode: String = "",
|
|
13
|
+
appName: String? = nil,
|
|
14
|
+
appIcon: String = ""
|
|
15
|
+
) {
|
|
16
|
+
self.appId = appId
|
|
17
|
+
self.appCode = appCode
|
|
18
|
+
self.appName = appName
|
|
19
|
+
self.appIcon = appIcon
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
var miniAppContext: MiniAppContext {
|
|
23
|
+
MiniAppContext(
|
|
24
|
+
appId: appId,
|
|
25
|
+
appCode: appCode,
|
|
26
|
+
appName: appName,
|
|
27
|
+
appIcon: appIcon
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
import UIKit
|
|
3
|
+
import MoMoUIKits
|
|
4
|
+
|
|
5
|
+
public enum MoMoUIKitsDemoViewControllerFactory {
|
|
6
|
+
public static func make(
|
|
7
|
+
context: MoMoUIKitsDemoContext = MoMoUIKitsDemoContext(),
|
|
8
|
+
composeViewController: (() -> UIViewController)? = nil
|
|
9
|
+
) -> UIViewController {
|
|
10
|
+
UIHostingController(
|
|
11
|
+
rootView: MoMoUIKitsDemoView(
|
|
12
|
+
context: context,
|
|
13
|
+
composeViewController: composeViewController
|
|
14
|
+
)
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public struct MoMoUIKitsDemoView: View {
|
|
20
|
+
private let context: MoMoUIKitsDemoContext
|
|
21
|
+
private let composeViewController: (() -> UIViewController)?
|
|
22
|
+
@State private var mode: MoMoUIKitsDemoMode
|
|
23
|
+
|
|
24
|
+
public init(
|
|
25
|
+
context: MoMoUIKitsDemoContext = MoMoUIKitsDemoContext(),
|
|
26
|
+
composeViewController: (() -> UIViewController)? = nil
|
|
27
|
+
) {
|
|
28
|
+
self.context = context
|
|
29
|
+
self.composeViewController = composeViewController
|
|
30
|
+
_mode = State(initialValue: composeViewController == nil ? .swiftUI : .compose)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public var body: some View {
|
|
34
|
+
VStack(spacing: 0) {
|
|
35
|
+
Picker("", selection: $mode) {
|
|
36
|
+
if composeViewController != nil {
|
|
37
|
+
Text("Compose").tag(MoMoUIKitsDemoMode.compose)
|
|
38
|
+
}
|
|
39
|
+
Text("SwiftUI").tag(MoMoUIKitsDemoMode.swiftUI)
|
|
40
|
+
}
|
|
41
|
+
.pickerStyle(.segmented)
|
|
42
|
+
.padding(.horizontal, 16)
|
|
43
|
+
.padding(.vertical, 12)
|
|
44
|
+
.background(Color(.systemBackground))
|
|
45
|
+
|
|
46
|
+
Group {
|
|
47
|
+
if mode == .compose, let composeViewController {
|
|
48
|
+
ComposeDemoHostView(makeViewController: composeViewController)
|
|
49
|
+
} else {
|
|
50
|
+
SwiftUIDemoBrowserView(context: context)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private enum MoMoUIKitsDemoMode: String {
|
|
59
|
+
case compose
|
|
60
|
+
case swiftUI
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private struct ComposeDemoHostView: UIViewControllerRepresentable {
|
|
64
|
+
let makeViewController: () -> UIViewController
|
|
65
|
+
|
|
66
|
+
func makeUIViewController(context: Context) -> UIViewController {
|
|
67
|
+
makeViewController()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
|
|
71
|
+
}
|
|
72
|
+
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AnimatedHeaderDemo.swift
|
|
3
|
+
// Example
|
|
4
|
+
//
|
|
5
|
+
// Usage demo for the animated (image) header. Mirrors Compose's
|
|
6
|
+
// `AnimatedHeaderUsage`: an image header configured with an aspect ratio +
|
|
7
|
+
// surface flag, over tall scrollable content that collapses the header.
|
|
8
|
+
//
|
|
9
|
+
// On iOS the header is supplied through the pushed screen's NavigationOptions
|
|
10
|
+
// (`animatedHeader:`) — options are fixed at push time (no live setOptions like
|
|
11
|
+
// Compose) — so the ratio/surface are chosen here and applied on "Show".
|
|
12
|
+
//
|
|
13
|
+
|
|
14
|
+
import MoMoUIKits
|
|
15
|
+
import SwiftUI
|
|
16
|
+
|
|
17
|
+
struct AnimatedHeaderDemo: View {
|
|
18
|
+
var body: some View {
|
|
19
|
+
if #available(iOS 16.0, *) {
|
|
20
|
+
AnimatedHeaderDemoContent()
|
|
21
|
+
} else {
|
|
22
|
+
Text("Animated header demo requires iOS 16+").padding()
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@available(iOS 16.0, *)
|
|
28
|
+
struct AnimatedHeaderDemoContent: View {
|
|
29
|
+
@EnvironmentObject private var navigator: Navigator
|
|
30
|
+
|
|
31
|
+
@State private var ratio: AnimatedHeaderRatio = .ratio16_9
|
|
32
|
+
@State private var isSurface = true
|
|
33
|
+
|
|
34
|
+
private let imageUrl = "https://static.momocdn.net/app/img/booking/holiday/mid_atumn_dldl.jpeg"
|
|
35
|
+
|
|
36
|
+
var body: some View {
|
|
37
|
+
VStack(alignment: .leading, spacing: 20) {
|
|
38
|
+
MomoText("Aspect ratio", typography: .headerDefaultBold)
|
|
39
|
+
Picker("Ratio", selection: $ratio) {
|
|
40
|
+
Text("16:9").tag(AnimatedHeaderRatio.ratio16_9)
|
|
41
|
+
Text("1:1").tag(AnimatedHeaderRatio.ratio1_1)
|
|
42
|
+
Text("3:2").tag(AnimatedHeaderRatio.ratio3_2)
|
|
43
|
+
}
|
|
44
|
+
.pickerStyle(.segmented)
|
|
45
|
+
|
|
46
|
+
Toggle(isOn: $isSurface) {
|
|
47
|
+
MomoText("Surface")
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
MoMoUIKits.Button(
|
|
51
|
+
title: "Show Animated Header",
|
|
52
|
+
action: show,
|
|
53
|
+
type: .primary,
|
|
54
|
+
size: .large
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
Spacer()
|
|
58
|
+
}
|
|
59
|
+
.frame(maxWidth: .infinity, alignment: .leading)
|
|
60
|
+
.padding(16)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private func show() {
|
|
64
|
+
let ratio = ratio
|
|
65
|
+
let isSurface = isSurface
|
|
66
|
+
let url = imageUrl
|
|
67
|
+
navigator.push(
|
|
68
|
+
{ AnimatedHeaderTargetScreen(ratio: ratio) },
|
|
69
|
+
options: NavigationOptions(
|
|
70
|
+
title: "Animated Header",
|
|
71
|
+
animatedHeader: AnimatedHeader(
|
|
72
|
+
aspectRatio: ratio,
|
|
73
|
+
isSurface: isSurface,
|
|
74
|
+
composable: { _ in
|
|
75
|
+
AnyView(
|
|
76
|
+
ImageView(url)
|
|
77
|
+
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
|
78
|
+
.clipped()
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// MARK: - Target screen (tall content under the image header)
|
|
88
|
+
|
|
89
|
+
@available(iOS 16.0, *)
|
|
90
|
+
private struct AnimatedHeaderTargetScreen: View {
|
|
91
|
+
@EnvironmentObject private var navigator: Navigator
|
|
92
|
+
let ratio: AnimatedHeaderRatio
|
|
93
|
+
|
|
94
|
+
var body: some View {
|
|
95
|
+
// A white rounded card that overlaps the hero image's lower part; the top
|
|
96
|
+
// inset under the image header is handled by StackScreen.
|
|
97
|
+
VStack(alignment: .leading, spacing: 16) {
|
|
98
|
+
MomoText("Scroll up to collapse the header", typography: .headerDefaultBold)
|
|
99
|
+
ForEach(0..<24, id: \.self) { i in
|
|
100
|
+
MomoText("Content row \(i + 1)")
|
|
101
|
+
.frame(maxWidth: .infinity, alignment: .leading)
|
|
102
|
+
}
|
|
103
|
+
MoMoUIKits.Button(title: "Go back", action: { navigator.pop() }, type: .secondary, size: .large)
|
|
104
|
+
}
|
|
105
|
+
.frame(maxWidth: .infinity, minHeight: UIScreen.main.bounds.height, alignment: .topLeading)
|
|
106
|
+
.padding(16)
|
|
107
|
+
.background(Colors.black01)
|
|
108
|
+
.clipShape(UnevenRoundedRectangle(topLeadingRadius: 16, topTrailingRadius: 16))
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AvatarDemo.swift
|
|
3
|
+
// Example
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
import SwiftUI
|
|
7
|
+
import MoMoUIKits
|
|
8
|
+
|
|
9
|
+
struct AvatarDemo: View {
|
|
10
|
+
var body: some View {
|
|
11
|
+
ScrollView {
|
|
12
|
+
VStack(alignment: .leading, spacing: 24) {
|
|
13
|
+
section("Size") {
|
|
14
|
+
HStack(alignment: .center, spacing: 8) {
|
|
15
|
+
Avatar(size: .size24)
|
|
16
|
+
Avatar(size: .size32)
|
|
17
|
+
Avatar(size: .size40)
|
|
18
|
+
Avatar(size: .size48)
|
|
19
|
+
Avatar(size: .size56)
|
|
20
|
+
Avatar(size: .size72)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
section("Rounded vs Square") {
|
|
25
|
+
HStack(spacing: 8) {
|
|
26
|
+
Avatar(size: .size40, rounded: true)
|
|
27
|
+
Avatar(size: .size40, rounded: false)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
section("Name (initials)") {
|
|
32
|
+
HStack(spacing: 8) {
|
|
33
|
+
Avatar(size: .size40, name: "Nguyen Van A")
|
|
34
|
+
Avatar(size: .size40, name: "John Doe")
|
|
35
|
+
Avatar(size: .size40, name: "MoMo")
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
section("Image") {
|
|
40
|
+
HStack(spacing: 8) {
|
|
41
|
+
Avatar(size: .size40, image: "https://i.pravatar.cc/150?img=1")
|
|
42
|
+
Avatar(size: .size56, image: "https://i.pravatar.cc/150?img=2")
|
|
43
|
+
Avatar(size: .size72, image: "https://i.pravatar.cc/150?img=3")
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
section("showIconMomo") {
|
|
48
|
+
HStack(spacing: 8) {
|
|
49
|
+
Avatar(size: .size40, showIconMomo: true)
|
|
50
|
+
Avatar(size: .size48, name: "MN", showIconMomo: true)
|
|
51
|
+
Avatar(size: .size56, image: "https://i.pravatar.cc/150?img=4", showIconMomo: true)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
section("showIconSupport") {
|
|
56
|
+
HStack(spacing: 8) {
|
|
57
|
+
Avatar(size: .size40, showIconSupport: true)
|
|
58
|
+
Avatar(size: .size48, name: "CS", showIconSupport: true)
|
|
59
|
+
Avatar(size: .size56, image: "https://i.pravatar.cc/150?img=5", showIconSupport: true)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
section("showIconMomo + showIconSupport") {
|
|
64
|
+
HStack(spacing: 8) {
|
|
65
|
+
Avatar(size: .size56, showIconMomo: true, showIconSupport: true)
|
|
66
|
+
Avatar(size: .size72, name: "NV", showIconMomo: true, showIconSupport: true)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
.padding()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@ViewBuilder
|
|
75
|
+
private func section<Content: View>(
|
|
76
|
+
_ title: String,
|
|
77
|
+
@ViewBuilder content: () -> Content
|
|
78
|
+
) -> some View {
|
|
79
|
+
VStack(alignment: .leading, spacing: 8) {
|
|
80
|
+
Text(title)
|
|
81
|
+
.font(.headline)
|
|
82
|
+
content()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
#if DEBUG
|
|
88
|
+
struct AvatarDemo_Previews: PreviewProvider {
|
|
89
|
+
static var previews: some View {
|
|
90
|
+
AvatarDemo()
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
#endif
|