@momo-kits/native-kits 0.162.30 → 0.162.31
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 +19 -0
- package/ios/Application/ApplicationEnvironment.swift +14 -6
- package/ios/Application/LanguageSource.swift +93 -0
- package/ios/Application/Localize.swift +73 -4
- package/ios/Application/LocalizeModifier.swift +30 -0
- package/ios/Application/Navigation/NavigationContainer.swift +28 -18
- package/ios/Application/Navigation/Navigator.swift +121 -53
- package/ios/Application/Navigation/NavigatorManager.swift +49 -0
- package/ios/Application/Navigation/component/NavigationFooter.swift +90 -0
- package/ios/Application/StackScreen.swift +19 -28
- package/ios/Badge/Badge.swift +2 -1
- package/ios/Badge/BadgeRibbon.swift +6 -2
- package/ios/Button/Button.swift +41 -61
- package/ios/Chip/Chip.swift +6 -5
- package/ios/Icon/Icon.swift +13 -4
- package/ios/Input/ErrorView.swift +2 -1
- package/ios/Input/Input.swift +9 -2
- package/ios/Input/InputPhoneNumber.swift +2 -1
- package/ios/Input/InputSearch.swift +3 -2
- package/ios/Input/InputTextArea.swift +6 -1
- package/ios/InputMoney/InputMoney.swift +5 -2
- package/ios/InputOTP/InputOTP.swift +2 -1
- package/ios/Layout/GridContext.swift +30 -0
- package/ios/Layout/Item.swift +42 -0
- package/ios/Layout/Section.swift +134 -0
- package/ios/Popup/PopupNotify.swift +2 -1
- package/ios/ProgressInfo/ProgressInfo.swift +4 -3
- package/ios/Rating/Rating.swift +2 -1
- package/ios/Stepper/Stepper.swift +2 -1
- package/ios/SuggestAction/SuggestAction.swift +3 -2
- package/ios/Tag/Tag.swift +2 -1
- package/ios/Template/TrustBanner/TrustBanner.swift +4 -2
- package/ios/Title/Title.swift +3 -2
- package/ios/Tooltip/Tooltip.swift +2 -1
- package/ios/Typography/FontScale.swift +103 -0
- package/ios/Typography/FontScaleStore.swift +52 -13
- package/ios/Typography/Text.swift +12 -29
- package/ios/Typography/Typography.swift +66 -86
- package/ios/native-kits.podspec +2 -1
- package/ios-demo/MoMoUIKitsDemo.podspec +1 -1
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +87 -73
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +55 -249
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ButtonDemo.swift +90 -82
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +74 -104
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +47 -50
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +63 -7
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +90 -81
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +73 -97
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DemoScreen.swift +420 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +46 -4
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +54 -57
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +80 -45
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconDemo.swift +81 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +49 -62
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +66 -116
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +104 -98
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +76 -118
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +73 -86
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +69 -54
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +74 -54
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +73 -20
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +68 -38
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +55 -52
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LocalizeDemo.swift +51 -4
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +14 -2
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +47 -51
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PlaygroundData.swift +76 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +67 -93
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +34 -43
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +83 -71
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +55 -23
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +58 -46
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SectionDemo.swift +83 -0
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +41 -12
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +67 -127
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +54 -110
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +69 -79
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +78 -58
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +76 -65
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +82 -127
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +44 -19
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +92 -168
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +79 -27
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +0 -1
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +87 -92
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +94 -163
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +70 -70
- package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +68 -114
- package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +3 -1
- package/package.json +2 -2
|
@@ -2,125 +2,95 @@
|
|
|
2
2
|
// CarouselDemo.swift
|
|
3
3
|
// Example
|
|
4
4
|
//
|
|
5
|
+
// Preview + Playground demo (DemoScreen pattern).
|
|
6
|
+
//
|
|
5
7
|
|
|
6
|
-
import SwiftUI
|
|
7
8
|
import MoMoUIKits
|
|
9
|
+
import SwiftUI
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@State private var autoplay = false
|
|
13
|
-
@State private var scrollEnabled = true
|
|
14
|
-
@State private var inactiveOpacity: Double = 1.0
|
|
15
|
-
@State private var inactiveScale: Double = 1.0
|
|
11
|
+
private let slideColors: [Color] = [
|
|
12
|
+
Colors.pink09, Colors.blue08, Colors.green08, Colors.orange08, Colors.mint08,
|
|
13
|
+
]
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
@ViewBuilder
|
|
16
|
+
private func carouselSlide(_ index: Int) -> some View {
|
|
17
|
+
ZStack {
|
|
18
|
+
slideColors[index % slideColors.count]
|
|
19
|
+
Text("Slide \(index + 1)")
|
|
20
|
+
.font(.headline)
|
|
21
|
+
.foregroundColor(Colors.black01)
|
|
22
|
+
}
|
|
23
|
+
.frame(maxWidth: .infinity)
|
|
24
|
+
.frame(height: 160)
|
|
25
|
+
.cornerRadius(Radius.M)
|
|
26
|
+
}
|
|
24
27
|
|
|
28
|
+
struct CarouselDemo: View {
|
|
25
29
|
var body: some View {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
playground
|
|
31
|
-
}
|
|
32
|
-
.padding(Spacing.L)
|
|
30
|
+
if #available(iOS 16.0, *) {
|
|
31
|
+
DemoScreen(preview: { CarouselPreview() }, playground: { CarouselPlayground() })
|
|
32
|
+
} else {
|
|
33
|
+
Text("Requires iOS 16+").padding()
|
|
33
34
|
}
|
|
34
35
|
}
|
|
36
|
+
}
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
private var preview: some View {
|
|
38
|
-
VStack(alignment: .leading, spacing: Spacing.XL) {
|
|
39
|
-
section("Basic (3 slides)") {
|
|
40
|
-
Carousel(itemCount: 3) { index in slide(index) }
|
|
41
|
-
.frame(height: 160)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
section("Loop enabled") {
|
|
45
|
-
Carousel(itemCount: 5, loop: true) { index in slide(index) }
|
|
46
|
-
.frame(height: 160)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
section("Autoplay (3s interval)") {
|
|
50
|
-
Carousel(
|
|
51
|
-
itemCount: 5,
|
|
52
|
-
loop: true,
|
|
53
|
-
autoplay: true,
|
|
54
|
-
autoplayInterval: 3.0
|
|
55
|
-
) { index in slide(index) }
|
|
56
|
-
.frame(height: 160)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
section("Inactive slide effects (opacity=0.5, scale=0.9)") {
|
|
60
|
-
Carousel(
|
|
61
|
-
itemCount: 5,
|
|
62
|
-
loop: true,
|
|
63
|
-
inactiveSlideOpacity: 0.5,
|
|
64
|
-
inactiveSlideScale: 0.9,
|
|
65
|
-
contentPadding: 32
|
|
66
|
-
) { index in slide(index) }
|
|
67
|
-
.frame(height: 160)
|
|
68
|
-
}
|
|
38
|
+
// MARK: - Preview
|
|
69
39
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
40
|
+
private struct CarouselPreview: View {
|
|
41
|
+
var body: some View {
|
|
42
|
+
BasicColumnBox("Basic (3 slides)", alignment: .leading) {
|
|
43
|
+
Carousel(itemCount: 3) { carouselSlide($0) }.frame(height: 160)
|
|
74
44
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
Text("Playground").font(.headline)
|
|
81
|
-
|
|
82
|
-
Toggle("Loop", isOn: $loop)
|
|
83
|
-
Toggle("Autoplay", isOn: $autoplay)
|
|
84
|
-
Toggle("Scroll Enabled", isOn: $scrollEnabled)
|
|
85
|
-
|
|
86
|
-
VStack(alignment: .leading) {
|
|
87
|
-
Text("Inactive Opacity: \(String(format: "%.2f", inactiveOpacity))")
|
|
88
|
-
Slider(value: $inactiveOpacity, in: 0 ... 1)
|
|
89
|
-
}
|
|
90
|
-
VStack(alignment: .leading) {
|
|
91
|
-
Text("Inactive Scale: \(String(format: "%.2f", inactiveScale))")
|
|
92
|
-
Slider(value: $inactiveScale, in: 0.5 ... 1)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
Carousel(
|
|
96
|
-
itemCount: 5,
|
|
97
|
-
loop: loop,
|
|
98
|
-
autoplay: autoplay,
|
|
99
|
-
scrollEnabled: scrollEnabled,
|
|
100
|
-
inactiveSlideOpacity: inactiveOpacity,
|
|
101
|
-
inactiveSlideScale: inactiveScale
|
|
102
|
-
) { index in slide(index) }
|
|
45
|
+
BasicColumnBox("Loop enabled", alignment: .leading) {
|
|
46
|
+
Carousel(itemCount: 5, loop: true) { carouselSlide($0) }.frame(height: 160)
|
|
47
|
+
}
|
|
48
|
+
BasicColumnBox("Autoplay (3s)", alignment: .leading) {
|
|
49
|
+
Carousel(itemCount: 5, loop: true, autoplay: true, autoplayInterval: 3.0) { carouselSlide($0) }
|
|
103
50
|
.frame(height: 160)
|
|
104
51
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
52
|
+
BasicColumnBox("Inactive effects", alignment: .leading) {
|
|
53
|
+
Carousel(itemCount: 5, loop: true, inactiveSlideOpacity: 0.5, inactiveSlideScale: 0.9, contentPadding: 32) {
|
|
54
|
+
carouselSlide($0)
|
|
55
|
+
}
|
|
56
|
+
.frame(height: 160)
|
|
57
|
+
}
|
|
58
|
+
BasicColumnBox("Scroll disabled", alignment: .leading) {
|
|
59
|
+
Carousel(itemCount: 3, scrollEnabled: false) { carouselSlide($0) }.frame(height: 160)
|
|
112
60
|
}
|
|
113
61
|
}
|
|
62
|
+
}
|
|
114
63
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
64
|
+
// MARK: - Playground
|
|
65
|
+
|
|
66
|
+
@available(iOS 16.0, *)
|
|
67
|
+
private struct CarouselPlayground: View {
|
|
68
|
+
@State private var loop = false
|
|
69
|
+
@State private var autoplay = false
|
|
70
|
+
@State private var scrollEnabled = true
|
|
71
|
+
@State private var inactiveOpacity: Double = 1.0
|
|
72
|
+
@State private var inactiveScale: Double = 1.0
|
|
73
|
+
|
|
74
|
+
var body: some View {
|
|
75
|
+
PlaygroundTab(
|
|
76
|
+
component: {
|
|
77
|
+
Carousel(
|
|
78
|
+
itemCount: 5,
|
|
79
|
+
loop: loop,
|
|
80
|
+
autoplay: autoplay,
|
|
81
|
+
scrollEnabled: scrollEnabled,
|
|
82
|
+
inactiveSlideOpacity: inactiveOpacity,
|
|
83
|
+
inactiveSlideScale: inactiveScale
|
|
84
|
+
) { carouselSlide($0) }
|
|
85
|
+
.frame(height: 160)
|
|
86
|
+
},
|
|
87
|
+
params: [
|
|
88
|
+
.checkbox("Loop", $loop),
|
|
89
|
+
.checkbox("Autoplay", $autoplay),
|
|
90
|
+
.checkbox("ScrollEnabled", $scrollEnabled),
|
|
91
|
+
.slider("InactiveOpacity", $inactiveOpacity, min: 0, max: 1, step: 0.1),
|
|
92
|
+
.slider("InactiveScale", $inactiveScale, min: 0.5, max: 1, step: 0.1),
|
|
93
|
+
]
|
|
94
|
+
)
|
|
125
95
|
}
|
|
126
96
|
}
|
|
@@ -1,63 +1,60 @@
|
|
|
1
1
|
//
|
|
2
|
-
//
|
|
2
|
+
// CheckboxDemo.swift
|
|
3
3
|
// Example
|
|
4
4
|
//
|
|
5
|
-
//
|
|
5
|
+
// Preview + Playground demo for Checkbox.
|
|
6
6
|
//
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
import MoMoUIKits
|
|
9
|
+
import SwiftUI
|
|
9
10
|
|
|
10
11
|
struct CheckboxDemo: View {
|
|
11
|
-
@State private var checked = false
|
|
12
|
-
|
|
13
12
|
var body: some View {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
Checkbox(
|
|
36
|
-
.constant(true),
|
|
37
|
-
disabled: true,
|
|
38
|
-
onChange: { _ in },
|
|
39
|
-
title: "Disable"
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
// Disabled indeterminate checkbox
|
|
43
|
-
Checkbox(
|
|
44
|
-
.constant(true),
|
|
45
|
-
disabled: true,
|
|
46
|
-
onChange: {_ in },
|
|
47
|
-
indeterminate: true,
|
|
48
|
-
title: "Disable checked"
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
// Disabled unchecked checkbox
|
|
52
|
-
Checkbox(
|
|
53
|
-
.constant(false),
|
|
54
|
-
disabled: true,
|
|
55
|
-
onChange: { _ in },
|
|
56
|
-
title: "Disable"
|
|
57
|
-
)
|
|
13
|
+
if #available(iOS 16.0, *) {
|
|
14
|
+
DemoScreen(preview: { CheckboxPreview() }, playground: { CheckboxPlayground() })
|
|
15
|
+
} else {
|
|
16
|
+
Text("Requires iOS 16+").padding()
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// MARK: - Preview
|
|
22
|
+
|
|
23
|
+
private struct CheckboxPreview: View {
|
|
24
|
+
var body: some View {
|
|
25
|
+
BasicColumnBox("States", alignment: .leading) {
|
|
26
|
+
Checkbox(.constant(true), onChange: { _ in }, title: "Checked")
|
|
27
|
+
Checkbox(.constant(false), onChange: { _ in }, title: "Unchecked")
|
|
28
|
+
Checkbox(.constant(true), onChange: { _ in }, indeterminate: true, title: "Indeterminate")
|
|
29
|
+
}
|
|
30
|
+
BasicColumnBox("Disabled", alignment: .leading) {
|
|
31
|
+
Checkbox(.constant(true), disabled: true, onChange: { _ in }, title: "Disabled checked")
|
|
32
|
+
Checkbox(.constant(true), disabled: true, onChange: { _ in }, indeterminate: true, title: "Disabled indeterminate")
|
|
33
|
+
Checkbox(.constant(false), disabled: true, onChange: { _ in }, title: "Disabled unchecked")
|
|
58
34
|
}
|
|
59
|
-
.padding()
|
|
60
35
|
}
|
|
61
36
|
}
|
|
62
37
|
|
|
38
|
+
// MARK: - Playground
|
|
39
|
+
|
|
40
|
+
@available(iOS 16.0, *)
|
|
41
|
+
private struct CheckboxPlayground: View {
|
|
42
|
+
@State private var checked = false
|
|
43
|
+
@State private var disabled = false
|
|
44
|
+
@State private var indeterminate = false
|
|
45
|
+
@State private var title = "Check Box"
|
|
63
46
|
|
|
47
|
+
var body: some View {
|
|
48
|
+
PlaygroundTab(
|
|
49
|
+
component: {
|
|
50
|
+
Checkbox($checked, disabled: disabled, indeterminate: indeterminate, title: title)
|
|
51
|
+
},
|
|
52
|
+
params: [
|
|
53
|
+
.checkbox("Checked", $checked),
|
|
54
|
+
.checkbox("Disabled", $disabled),
|
|
55
|
+
.checkbox("Indeterminate", $indeterminate),
|
|
56
|
+
.string("Title", $title),
|
|
57
|
+
]
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -1,20 +1,76 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ChipDemo.swift
|
|
3
|
+
// Example
|
|
4
|
+
//
|
|
5
|
+
// Preview + Playground demo for Chip.
|
|
6
|
+
//
|
|
1
7
|
|
|
2
|
-
import SwiftUI
|
|
3
8
|
import MoMoUIKits
|
|
9
|
+
import SwiftUI
|
|
10
|
+
|
|
11
|
+
private let chipSizeList: [PlaygroundOption] = [
|
|
12
|
+
.init("large", Chip.ChipSize.large),
|
|
13
|
+
.init("small", Chip.ChipSize.small),
|
|
14
|
+
]
|
|
4
15
|
|
|
5
16
|
struct ChipDemo: View {
|
|
6
|
-
|
|
7
17
|
var body: some View {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
18
|
+
if #available(iOS 16.0, *) {
|
|
19
|
+
DemoScreen(preview: { ChipPreview() }, playground: { ChipPlayground() })
|
|
20
|
+
} else {
|
|
21
|
+
Text("Requires iOS 16+").padding()
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// MARK: - Preview
|
|
27
|
+
|
|
28
|
+
private struct ChipPreview: View {
|
|
29
|
+
var body: some View {
|
|
30
|
+
BasicColumnBox("Size", alignment: .leading) {
|
|
31
|
+
Chip(label: "Large", size: .large)
|
|
32
|
+
Chip(label: "Small", size: .small)
|
|
33
|
+
}
|
|
34
|
+
BasicColumnBox("Icons", alignment: .leading) {
|
|
11
35
|
Chip(label: "Apple", iconLeft: "basic_home")
|
|
12
36
|
Chip(label: "Banana", iconRight: "basic_home")
|
|
37
|
+
}
|
|
38
|
+
BasicColumnBox("State", alignment: .leading) {
|
|
13
39
|
Chip(label: "Orange", backgroundColor: Colors.black01)
|
|
14
40
|
Chip(label: "Grape", selected: true)
|
|
15
41
|
Chip(label: "Grape", iconRight: "basic_home", selected: true, iconRightTint: Colors.black05)
|
|
16
|
-
Chip(label: "Tagged", accessibilityLabel: "chip_tagged")
|
|
17
42
|
}
|
|
18
|
-
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// MARK: - Playground
|
|
47
|
+
|
|
48
|
+
@available(iOS 16.0, *)
|
|
49
|
+
private struct ChipPlayground: View {
|
|
50
|
+
@State private var label = "Chip"
|
|
51
|
+
@State private var size: PlaygroundOption? = chipSizeList.first { $0.key == "large" }
|
|
52
|
+
@State private var selected = false
|
|
53
|
+
@State private var iconLeft: PlaygroundOption?
|
|
54
|
+
@State private var iconRight: PlaygroundOption?
|
|
55
|
+
|
|
56
|
+
var body: some View {
|
|
57
|
+
PlaygroundTab(
|
|
58
|
+
component: {
|
|
59
|
+
Chip(
|
|
60
|
+
label: label,
|
|
61
|
+
iconLeft: iconLeft?.value as? String,
|
|
62
|
+
iconRight: iconRight?.value as? String,
|
|
63
|
+
selected: selected,
|
|
64
|
+
size: (size?.value as? Chip.ChipSize) ?? .large
|
|
65
|
+
)
|
|
66
|
+
},
|
|
67
|
+
params: [
|
|
68
|
+
.string("Label", $label),
|
|
69
|
+
.radio("Size", chipSizeList, $size),
|
|
70
|
+
.checkbox("Selected", $selected),
|
|
71
|
+
.option("IconLeft", playgroundIcons, $iconLeft),
|
|
72
|
+
.option("IconRight", playgroundIcons, $iconRight),
|
|
73
|
+
]
|
|
74
|
+
)
|
|
19
75
|
}
|
|
20
76
|
}
|
|
@@ -1,93 +1,102 @@
|
|
|
1
|
-
|
|
1
|
+
//
|
|
2
|
+
// CollapseDemo.swift
|
|
3
|
+
// Example
|
|
4
|
+
//
|
|
5
|
+
// Preview + Playground demo (DemoScreen pattern).
|
|
6
|
+
//
|
|
7
|
+
|
|
2
8
|
import MoMoUIKits
|
|
9
|
+
import SwiftUI
|
|
10
|
+
|
|
11
|
+
private let collapseTitleSizeList: [PlaygroundOption] = [
|
|
12
|
+
.init("small", CollapseTitleSize.small),
|
|
13
|
+
.init("medium", CollapseTitleSize.medium),
|
|
14
|
+
.init("large", CollapseTitleSize.large),
|
|
15
|
+
]
|
|
3
16
|
|
|
4
17
|
struct CollapseDemo: View {
|
|
5
18
|
var body: some View {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
section("With Border") {
|
|
16
|
-
Collapse(title: "With border", showBorder: true) {
|
|
17
|
-
MomoText("Content inside a bordered collapse.", typography: .bodyDefaultRegular)
|
|
18
|
-
.padding(Spacing.M)
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
section("Expanded by Default") {
|
|
23
|
-
Collapse(title: "Pre-expanded", expandDefault: true) {
|
|
24
|
-
MomoText("This collapse starts expanded.", typography: .bodyDefaultRegular)
|
|
25
|
-
.padding(Spacing.M)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
section("With Description") {
|
|
30
|
-
Collapse(
|
|
31
|
-
title: "Collapse with description",
|
|
32
|
-
description: "A brief description below the title."
|
|
33
|
-
) {
|
|
34
|
-
MomoText("Detailed content.", typography: .bodyDefaultRegular)
|
|
35
|
-
.padding(Spacing.M)
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
section("Title Sizes") {
|
|
40
|
-
Collapse(title: "Small title", titleSize: .small) {
|
|
41
|
-
MomoText("Content", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
42
|
-
}
|
|
43
|
-
Collapse(title: "Medium title", titleSize: .medium) {
|
|
44
|
-
MomoText("Content", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
45
|
-
}
|
|
46
|
-
Collapse(title: "Large title", titleSize: .large) {
|
|
47
|
-
MomoText("Content", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
section("With SubTitle") {
|
|
52
|
-
Collapse(title: "Collapse with subTitle", subTitle: "Sub") {
|
|
53
|
-
MomoText("Content", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
section("With Tag") {
|
|
58
|
-
Collapse(title: "Collapse with tag", tagLabel: "New", tagColor: .red) {
|
|
59
|
-
MomoText("Content", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
19
|
+
if #available(iOS 16.0, *) {
|
|
20
|
+
DemoScreen(preview: { CollapsePreview() }, playground: { CollapsePlayground() })
|
|
21
|
+
} else {
|
|
22
|
+
Text("Requires iOS 16+").padding()
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
62
26
|
|
|
63
|
-
|
|
64
|
-
Collapse(title: "Tonal chevron button", useBackgroundCollapseButton: true) {
|
|
65
|
-
MomoText("Chevron has tonal background.", typography: .bodyDefaultRegular)
|
|
66
|
-
.padding(Spacing.M)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
27
|
+
// MARK: - Preview
|
|
69
28
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
29
|
+
private struct CollapsePreview: View {
|
|
30
|
+
var body: some View {
|
|
31
|
+
BasicColumnBox("Default", alignment: .leading) {
|
|
32
|
+
Collapse(title: "Default collapse") {
|
|
33
|
+
MomoText("This is the expanded content.", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
BasicColumnBox("With Border", alignment: .leading) {
|
|
37
|
+
Collapse(title: "With border", showBorder: true) {
|
|
38
|
+
MomoText("Content inside a bordered collapse.", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
BasicColumnBox("Expanded by Default", alignment: .leading) {
|
|
42
|
+
Collapse(title: "Pre-expanded", expandDefault: true) {
|
|
43
|
+
MomoText("This collapse starts expanded.", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
BasicColumnBox("With Description", alignment: .leading) {
|
|
47
|
+
Collapse(title: "Collapse with description", description: "A brief description below the title.") {
|
|
48
|
+
MomoText("Detailed content.", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
BasicColumnBox("Title Sizes", alignment: .leading) {
|
|
52
|
+
Collapse(title: "Small title", titleSize: .small) {
|
|
53
|
+
MomoText("Content", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
54
|
+
}
|
|
55
|
+
Collapse(title: "Large title", titleSize: .large) {
|
|
56
|
+
MomoText("Content", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
BasicColumnBox("With Tag", alignment: .leading) {
|
|
60
|
+
Collapse(title: "Collapse with tag", tagLabel: "New", tagColor: .red) {
|
|
61
|
+
MomoText("Content", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
81
62
|
}
|
|
82
|
-
.padding()
|
|
83
63
|
}
|
|
84
64
|
}
|
|
65
|
+
}
|
|
85
66
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
67
|
+
// MARK: - Playground
|
|
68
|
+
|
|
69
|
+
@available(iOS 16.0, *)
|
|
70
|
+
private struct CollapsePlayground: View {
|
|
71
|
+
@State private var title = "Collapse title"
|
|
72
|
+
@State private var description = ""
|
|
73
|
+
@State private var showBorder = false
|
|
74
|
+
@State private var expandDefault = false
|
|
75
|
+
@State private var titleSize: PlaygroundOption? = collapseTitleSizeList.first { $0.key == "medium" }
|
|
76
|
+
@State private var useBackgroundCollapseButton = false
|
|
77
|
+
|
|
78
|
+
var body: some View {
|
|
79
|
+
PlaygroundTab(
|
|
80
|
+
component: {
|
|
81
|
+
Collapse(
|
|
82
|
+
title: title,
|
|
83
|
+
description: description.isEmpty ? nil : description,
|
|
84
|
+
showBorder: showBorder,
|
|
85
|
+
expandDefault: expandDefault,
|
|
86
|
+
titleSize: (titleSize?.value as? CollapseTitleSize) ?? .medium,
|
|
87
|
+
useBackgroundCollapseButton: useBackgroundCollapseButton
|
|
88
|
+
) {
|
|
89
|
+
MomoText("Expanded content.", typography: .bodyDefaultRegular).padding(Spacing.M)
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
params: [
|
|
93
|
+
.string("Title", $title),
|
|
94
|
+
.string("Description", $description),
|
|
95
|
+
.checkbox("ShowBorder", $showBorder),
|
|
96
|
+
.checkbox("ExpandDefault", $expandDefault),
|
|
97
|
+
.radio("TitleSize", collapseTitleSizeList, $titleSize),
|
|
98
|
+
.checkbox("BackgroundCollapseButton", $useBackgroundCollapseButton),
|
|
99
|
+
]
|
|
100
|
+
)
|
|
92
101
|
}
|
|
93
102
|
}
|