@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
package/ios/Chip/Chip.swift
CHANGED
|
@@ -2,17 +2,18 @@ import SwiftUI
|
|
|
2
2
|
import Foundation
|
|
3
3
|
|
|
4
4
|
public struct Chip: View {
|
|
5
|
+
@Environment(\.appTheme) private var theme
|
|
5
6
|
public enum ChipSize { case small, large }
|
|
6
7
|
|
|
7
8
|
public struct Dimensions {
|
|
9
|
+
let height: CGFloat
|
|
8
10
|
let horizontal: CGFloat
|
|
9
|
-
let vertical: CGFloat
|
|
10
11
|
let iconSize: CGFloat
|
|
11
12
|
let iconSpacing: CGFloat
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
public static let Large = Dimensions(
|
|
15
|
-
public static let Small = Dimensions(
|
|
15
|
+
public static let Large = Dimensions(height: 32, horizontal: 12, iconSize: 20, iconSpacing: 4)
|
|
16
|
+
public static let Small = Dimensions(height: 24, horizontal: 10, iconSize: 16, iconSpacing: 4)
|
|
16
17
|
|
|
17
18
|
private let label: String?
|
|
18
19
|
private let iconLeft: String?
|
|
@@ -53,14 +54,14 @@ public struct Chip: View {
|
|
|
53
54
|
let dims = (size == .small) ? Self.Small : Self.Large
|
|
54
55
|
|
|
55
56
|
let bg: Color = {
|
|
56
|
-
if selected { return
|
|
57
|
+
if selected { return theme.colors.background.selected }
|
|
57
58
|
if let explicit = backgroundColor { return explicit }
|
|
58
59
|
return Colors.black03
|
|
59
60
|
}()
|
|
60
61
|
|
|
61
|
-
let textColor: Color = selected ?
|
|
62
|
-
let leftTint: Color = selected ?
|
|
63
|
-
let rightTint: Color = selected ?
|
|
62
|
+
let textColor: Color = selected ? theme.colors.primary : theme.colors.text.default
|
|
63
|
+
let leftTint: Color = selected ? theme.colors.primary : iconLeftTint ?? theme.colors.text.default
|
|
64
|
+
let rightTint: Color = selected ? theme.colors.primary : iconRightTint ?? theme.colors.text.default
|
|
64
65
|
|
|
65
66
|
HStack(spacing: dims.iconSpacing) {
|
|
66
67
|
if let iconLeft {
|
|
@@ -77,7 +78,7 @@ public struct Chip: View {
|
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
.padding(.horizontal, dims.horizontal)
|
|
80
|
-
.
|
|
81
|
+
.frame(height: dims.height)
|
|
81
82
|
.background(
|
|
82
83
|
RoundedRectangle(cornerRadius: Radius.L, style: .continuous)
|
|
83
84
|
.fill(bg)
|
|
@@ -86,11 +87,24 @@ public struct Chip: View {
|
|
|
86
87
|
Group {
|
|
87
88
|
if selected {
|
|
88
89
|
RoundedRectangle(cornerRadius: Radius.L, style: .continuous)
|
|
89
|
-
.stroke(
|
|
90
|
+
.stroke(theme.colors.secondary, lineWidth: 2)
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
)
|
|
93
94
|
.contentShape(RoundedRectangle(cornerRadius: Radius.L, style: .continuous))
|
|
94
95
|
.onTapGesture(perform: onClick)
|
|
96
|
+
.modifier(ChipAccessibilityModifier(accessibilityLabel: accessibilityLabel))
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private struct ChipAccessibilityModifier: ViewModifier {
|
|
101
|
+
let accessibilityLabel: String?
|
|
102
|
+
|
|
103
|
+
func body(content: Content) -> some View {
|
|
104
|
+
if let id = accessibilityLabel {
|
|
105
|
+
content.accessibilityIdentifier(id)
|
|
106
|
+
} else {
|
|
107
|
+
content
|
|
108
|
+
}
|
|
95
109
|
}
|
|
96
110
|
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public enum CollapseTitleSize {
|
|
4
|
+
case small
|
|
5
|
+
case medium
|
|
6
|
+
case large
|
|
7
|
+
|
|
8
|
+
var typography: TypographyStyle {
|
|
9
|
+
switch self {
|
|
10
|
+
case .small: return .headerSSemibold
|
|
11
|
+
case .medium: return .headerDefaultBold
|
|
12
|
+
case .large: return .headerMBold
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public struct Collapse<Content: View>: View {
|
|
18
|
+
@Environment(\.appTheme) private var theme
|
|
19
|
+
|
|
20
|
+
private let title: String
|
|
21
|
+
private let description: String?
|
|
22
|
+
private let image: String?
|
|
23
|
+
private let imageSize: CGFloat
|
|
24
|
+
private let subTitle: String?
|
|
25
|
+
private let tagLabel: String?
|
|
26
|
+
private let tagColor: Tag.TagColor
|
|
27
|
+
private let showBorder: Bool
|
|
28
|
+
private let expandDefault: Bool
|
|
29
|
+
private let titleSize: CollapseTitleSize
|
|
30
|
+
private let useBackgroundCollapseButton: Bool
|
|
31
|
+
private let backgroundColor: Color?
|
|
32
|
+
private let titleColor: Color?
|
|
33
|
+
private let onPress: ((Bool) -> Void)?
|
|
34
|
+
private let content: (() -> Content)?
|
|
35
|
+
|
|
36
|
+
@State private var expanded: Bool
|
|
37
|
+
|
|
38
|
+
public init(
|
|
39
|
+
title: String,
|
|
40
|
+
description: String? = nil,
|
|
41
|
+
image: String? = nil,
|
|
42
|
+
imageSize: CGFloat = 24,
|
|
43
|
+
subTitle: String? = nil,
|
|
44
|
+
tagLabel: String? = nil,
|
|
45
|
+
tagColor: Tag.TagColor = .default,
|
|
46
|
+
showBorder: Bool = false,
|
|
47
|
+
expandDefault: Bool = false,
|
|
48
|
+
titleSize: CollapseTitleSize = .medium,
|
|
49
|
+
useBackgroundCollapseButton: Bool = false,
|
|
50
|
+
backgroundColor: Color? = nil,
|
|
51
|
+
titleColor: Color? = nil,
|
|
52
|
+
onPress: ((Bool) -> Void)? = nil,
|
|
53
|
+
@ViewBuilder content: @escaping () -> Content
|
|
54
|
+
) {
|
|
55
|
+
self.title = title
|
|
56
|
+
self.description = description
|
|
57
|
+
self.image = image
|
|
58
|
+
self.imageSize = imageSize
|
|
59
|
+
self.subTitle = subTitle
|
|
60
|
+
self.tagLabel = tagLabel
|
|
61
|
+
self.tagColor = tagColor
|
|
62
|
+
self.showBorder = showBorder
|
|
63
|
+
self.expandDefault = expandDefault
|
|
64
|
+
self.titleSize = titleSize
|
|
65
|
+
self.useBackgroundCollapseButton = useBackgroundCollapseButton
|
|
66
|
+
self.backgroundColor = backgroundColor
|
|
67
|
+
self.titleColor = titleColor
|
|
68
|
+
self.onPress = onPress
|
|
69
|
+
self.content = content
|
|
70
|
+
_expanded = State(initialValue: expandDefault)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private var resolvedBackgroundColor: Color {
|
|
74
|
+
backgroundColor ?? theme.colors.background.surface
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public var body: some View {
|
|
78
|
+
VStack(spacing: 0) {
|
|
79
|
+
header
|
|
80
|
+
|
|
81
|
+
if let content {
|
|
82
|
+
if expanded {
|
|
83
|
+
VStack(spacing: 0) {
|
|
84
|
+
content()
|
|
85
|
+
}
|
|
86
|
+
.frame(maxWidth: .infinity)
|
|
87
|
+
.overlay(
|
|
88
|
+
showBorder
|
|
89
|
+
? RoundedRectangle(cornerRadius: 0)
|
|
90
|
+
.stroke(theme.colors.border.default, lineWidth: 1)
|
|
91
|
+
: nil
|
|
92
|
+
)
|
|
93
|
+
.transition(.move(edge: .top).combined(with: .opacity))
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
.frame(maxWidth: .infinity)
|
|
98
|
+
.background(resolvedBackgroundColor)
|
|
99
|
+
.clipShape(RoundedRectangle(cornerRadius: Radius.S, style: .continuous))
|
|
100
|
+
.overlay(
|
|
101
|
+
showBorder
|
|
102
|
+
? RoundedRectangle(cornerRadius: Radius.S, style: .continuous)
|
|
103
|
+
.stroke(theme.colors.border.default, lineWidth: 1)
|
|
104
|
+
: nil
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private var header: some View {
|
|
109
|
+
SwiftUI.Button(action: {
|
|
110
|
+
onPress?(expanded)
|
|
111
|
+
withAnimation(.easeInOut(duration: 0.3)) {
|
|
112
|
+
expanded.toggle()
|
|
113
|
+
}
|
|
114
|
+
}) {
|
|
115
|
+
HStack(alignment: .top, spacing: 0) {
|
|
116
|
+
if let image {
|
|
117
|
+
ImageView(image, contentMode: .fill)
|
|
118
|
+
.frame(width: imageSize, height: imageSize)
|
|
119
|
+
.clipShape(RoundedRectangle(cornerRadius: Radius.XS, style: .continuous))
|
|
120
|
+
Spacer().frame(width: Spacing.S)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
VStack(alignment: .leading, spacing: 0) {
|
|
124
|
+
MomoText(
|
|
125
|
+
title,
|
|
126
|
+
typography: titleSize.typography,
|
|
127
|
+
color: titleColor ?? theme.colors.text.default
|
|
128
|
+
)
|
|
129
|
+
if let description {
|
|
130
|
+
MomoText(
|
|
131
|
+
description,
|
|
132
|
+
typography: .bodyDefaultRegular,
|
|
133
|
+
color: theme.colors.text.secondary
|
|
134
|
+
)
|
|
135
|
+
.lineLimit(2)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
.frame(maxWidth: .infinity, alignment: .leading)
|
|
139
|
+
|
|
140
|
+
if subTitle != nil || tagLabel != nil {
|
|
141
|
+
Spacer().frame(width: Spacing.S)
|
|
142
|
+
if let subTitle {
|
|
143
|
+
MomoText(
|
|
144
|
+
subTitle,
|
|
145
|
+
typography: .bodyDefaultRegular,
|
|
146
|
+
color: theme.colors.text.secondary
|
|
147
|
+
)
|
|
148
|
+
.lineLimit(1)
|
|
149
|
+
} else if let tagLabel {
|
|
150
|
+
Tag(label: tagLabel, color: tagColor)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
Spacer().frame(width: Spacing.S)
|
|
155
|
+
chevron
|
|
156
|
+
}
|
|
157
|
+
.padding(.horizontal, Spacing.M)
|
|
158
|
+
.padding(.vertical, Spacing.S)
|
|
159
|
+
.frame(maxWidth: .infinity)
|
|
160
|
+
.contentShape(Rectangle())
|
|
161
|
+
}
|
|
162
|
+
.buttonStyle(.plain)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private var chevron: some View {
|
|
166
|
+
Group {
|
|
167
|
+
if useBackgroundCollapseButton {
|
|
168
|
+
Icon(source: "arrow_chevron_down_small", size: 16, color: theme.colors.primary)
|
|
169
|
+
.rotationEffect(.degrees(expanded ? 180 : 0))
|
|
170
|
+
.frame(width: 24, height: 24)
|
|
171
|
+
.background(
|
|
172
|
+
RoundedRectangle(cornerRadius: Radius.M, style: .continuous)
|
|
173
|
+
.fill(theme.colors.background.tonal)
|
|
174
|
+
)
|
|
175
|
+
} else {
|
|
176
|
+
Icon(source: "arrow_chevron_down_small", size: 24, color: theme.colors.text.default)
|
|
177
|
+
.rotationEffect(.degrees(expanded ? 180 : 0))
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
.animation(.easeInOut(duration: 0.3), value: expanded)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -9,7 +9,7 @@ public enum Colors {
|
|
|
9
9
|
public static let secondary = Color("Secondary")
|
|
10
10
|
public static let background = Color("Background")
|
|
11
11
|
public static let border = Color("Border")
|
|
12
|
-
public static let text = Color("
|
|
12
|
+
public static let text = Color("ThemeColors/text-default")
|
|
13
13
|
public static let textSecondary = Color("TextSecondary")
|
|
14
14
|
public static let card = Color("Card")
|
|
15
15
|
public static let error = Color("Error")
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Theme.swift
|
|
3
|
+
// MoMoUIKits
|
|
4
|
+
//
|
|
5
|
+
// Created by sophia on 25/2/26.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import SwiftUI
|
|
10
|
+
|
|
11
|
+
// MARK: - Background
|
|
12
|
+
|
|
13
|
+
public struct Background {
|
|
14
|
+
public let `default`: Color
|
|
15
|
+
public let surface: Color
|
|
16
|
+
public let tonal: Color
|
|
17
|
+
public let pressed: Color
|
|
18
|
+
public let selected: Color
|
|
19
|
+
public let disable: Color
|
|
20
|
+
|
|
21
|
+
public init(
|
|
22
|
+
default defaultColor: Color,
|
|
23
|
+
surface: Color,
|
|
24
|
+
tonal: Color,
|
|
25
|
+
pressed: Color,
|
|
26
|
+
selected: Color,
|
|
27
|
+
disable: Color
|
|
28
|
+
) {
|
|
29
|
+
self.default = defaultColor
|
|
30
|
+
self.surface = surface
|
|
31
|
+
self.tonal = tonal
|
|
32
|
+
self.pressed = pressed
|
|
33
|
+
self.selected = selected
|
|
34
|
+
self.disable = disable
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// MARK: - TextColors
|
|
39
|
+
|
|
40
|
+
public struct TextColors {
|
|
41
|
+
public let `default`: Color
|
|
42
|
+
public let secondary: Color
|
|
43
|
+
public let hint: Color
|
|
44
|
+
public let disable: Color
|
|
45
|
+
|
|
46
|
+
public init(
|
|
47
|
+
default defaultColor: Color,
|
|
48
|
+
secondary: Color,
|
|
49
|
+
hint: Color,
|
|
50
|
+
disable: Color
|
|
51
|
+
) {
|
|
52
|
+
self.default = defaultColor
|
|
53
|
+
self.secondary = secondary
|
|
54
|
+
self.hint = hint
|
|
55
|
+
self.disable = disable
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// MARK: - BorderColors
|
|
60
|
+
|
|
61
|
+
public struct BorderColors {
|
|
62
|
+
public let `default`: Color
|
|
63
|
+
public let disable: Color
|
|
64
|
+
|
|
65
|
+
public init(default defaultColor: Color, disable: Color) {
|
|
66
|
+
self.default = defaultColor
|
|
67
|
+
self.disable = disable
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// MARK: - ColorSet
|
|
72
|
+
|
|
73
|
+
public struct ColorSet {
|
|
74
|
+
public let primary: Color
|
|
75
|
+
public let secondary: Color
|
|
76
|
+
public let container: Color
|
|
77
|
+
|
|
78
|
+
public init(primary: Color, secondary: Color, container: Color) {
|
|
79
|
+
self.primary = primary
|
|
80
|
+
self.secondary = secondary
|
|
81
|
+
self.container = container
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// MARK: - ColorScheme
|
|
86
|
+
|
|
87
|
+
public struct ColorScheme {
|
|
88
|
+
public let primary: Color
|
|
89
|
+
public let secondary: Color
|
|
90
|
+
public let gradient: Color
|
|
91
|
+
public let background: Background
|
|
92
|
+
public let text: TextColors
|
|
93
|
+
public let border: BorderColors
|
|
94
|
+
public let success: ColorSet
|
|
95
|
+
public let warning: ColorSet
|
|
96
|
+
public let error: ColorSet
|
|
97
|
+
public let highlight: ColorSet
|
|
98
|
+
public let interactive: ColorSet
|
|
99
|
+
|
|
100
|
+
public init(
|
|
101
|
+
primary: Color,
|
|
102
|
+
secondary: Color,
|
|
103
|
+
gradient: Color,
|
|
104
|
+
background: Background,
|
|
105
|
+
text: TextColors,
|
|
106
|
+
border: BorderColors,
|
|
107
|
+
success: ColorSet,
|
|
108
|
+
warning: ColorSet,
|
|
109
|
+
error: ColorSet,
|
|
110
|
+
highlight: ColorSet,
|
|
111
|
+
interactive: ColorSet
|
|
112
|
+
) {
|
|
113
|
+
self.primary = primary
|
|
114
|
+
self.secondary = secondary
|
|
115
|
+
self.gradient = gradient
|
|
116
|
+
self.background = background
|
|
117
|
+
self.text = text
|
|
118
|
+
self.border = border
|
|
119
|
+
self.success = success
|
|
120
|
+
self.warning = warning
|
|
121
|
+
self.error = error
|
|
122
|
+
self.highlight = highlight
|
|
123
|
+
self.interactive = interactive
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// MARK: - ThemeAssets
|
|
128
|
+
|
|
129
|
+
public struct ThemeAssets {
|
|
130
|
+
public let headerBackground: String?
|
|
131
|
+
|
|
132
|
+
public init(headerBackground: String? = nil) {
|
|
133
|
+
self.headerBackground = headerBackground
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public var isHeaderImage: Bool {
|
|
137
|
+
guard let url = headerBackground else { return false }
|
|
138
|
+
return !url.isEmpty
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// MARK: - Theme
|
|
143
|
+
|
|
144
|
+
public struct Theme {
|
|
145
|
+
public let dark: Bool
|
|
146
|
+
public let colors: ColorScheme
|
|
147
|
+
public let font: String
|
|
148
|
+
public let assets: ThemeAssets
|
|
149
|
+
|
|
150
|
+
public init(dark: Bool, colors: ColorScheme, font: String, assets: ThemeAssets) {
|
|
151
|
+
self.dark = dark
|
|
152
|
+
self.colors = colors
|
|
153
|
+
self.font = font
|
|
154
|
+
self.assets = assets
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public func copy(
|
|
158
|
+
dark: Bool? = nil,
|
|
159
|
+
colors: ColorScheme? = nil,
|
|
160
|
+
font: String? = nil,
|
|
161
|
+
assets: ThemeAssets? = nil
|
|
162
|
+
) -> Theme {
|
|
163
|
+
Theme(
|
|
164
|
+
dark: dark ?? self.dark,
|
|
165
|
+
colors: colors ?? self.colors,
|
|
166
|
+
font: font ?? self.font,
|
|
167
|
+
assets: assets ?? self.assets
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// MARK: - Default Theme (Light)
|
|
173
|
+
|
|
174
|
+
public let defaultTheme = Theme(
|
|
175
|
+
dark: false,
|
|
176
|
+
colors: ColorScheme(
|
|
177
|
+
primary: Color("ThemeColors/primary"),
|
|
178
|
+
secondary: Color("ThemeColors/secondary"),
|
|
179
|
+
gradient: Color("ThemeColors/gradient"),
|
|
180
|
+
background: Background(
|
|
181
|
+
default: Color("ThemeColors/background-default"),
|
|
182
|
+
surface: Color("ThemeColors/background-surface"),
|
|
183
|
+
tonal: Color("ThemeColors/background-tonal"),
|
|
184
|
+
pressed: Color("ThemeColors/background-pressed"),
|
|
185
|
+
selected: Color("ThemeColors/background-selected"),
|
|
186
|
+
disable: Color("ThemeColors/background-disable")
|
|
187
|
+
),
|
|
188
|
+
text: TextColors(
|
|
189
|
+
default: Color("ThemeColors/text-default"),
|
|
190
|
+
secondary: Color("ThemeColors/text-secondary"),
|
|
191
|
+
hint: Color("ThemeColors/text-hint"),
|
|
192
|
+
disable: Color("ThemeColors/text-disable")
|
|
193
|
+
),
|
|
194
|
+
border: BorderColors(
|
|
195
|
+
default: Color("ThemeColors/border-default"),
|
|
196
|
+
disable: Color("ThemeColors/border-disable")
|
|
197
|
+
),
|
|
198
|
+
success: ColorSet(
|
|
199
|
+
primary: Colors.green03,
|
|
200
|
+
secondary: Colors.green07,
|
|
201
|
+
container: Colors.green08
|
|
202
|
+
),
|
|
203
|
+
warning: ColorSet(
|
|
204
|
+
primary: Colors.orange03,
|
|
205
|
+
secondary: Colors.orange07,
|
|
206
|
+
container: Colors.orange08
|
|
207
|
+
),
|
|
208
|
+
error: ColorSet(
|
|
209
|
+
primary: Colors.red03,
|
|
210
|
+
secondary: Colors.red07,
|
|
211
|
+
container: Colors.red08
|
|
212
|
+
),
|
|
213
|
+
highlight: ColorSet(
|
|
214
|
+
primary: Colors.mint03,
|
|
215
|
+
secondary: Colors.mint07,
|
|
216
|
+
container: Colors.mint08
|
|
217
|
+
),
|
|
218
|
+
interactive: ColorSet(
|
|
219
|
+
primary: Colors.blue03,
|
|
220
|
+
secondary: Colors.blue07,
|
|
221
|
+
container: Colors.blue08
|
|
222
|
+
)
|
|
223
|
+
),
|
|
224
|
+
font: "SFProText",
|
|
225
|
+
assets: ThemeAssets(headerBackground: nil)
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
// MARK: - Dark Theme
|
|
229
|
+
|
|
230
|
+
public let darkTheme = Theme(
|
|
231
|
+
dark: true,
|
|
232
|
+
colors: ColorScheme(
|
|
233
|
+
primary: Colors.pink04,
|
|
234
|
+
secondary: Colors.pink08,
|
|
235
|
+
gradient: Color(hex: "FDCADE"),
|
|
236
|
+
background: Background(
|
|
237
|
+
default: Color(hex: "121212"),
|
|
238
|
+
surface: Color(hex: "1E1E1E"),
|
|
239
|
+
tonal: Colors.pink10,
|
|
240
|
+
pressed: Color(hex: "1A1A1A"),
|
|
241
|
+
selected: Colors.pink11,
|
|
242
|
+
disable: Color(hex: "303030")
|
|
243
|
+
),
|
|
244
|
+
text: TextColors(
|
|
245
|
+
default: Color.white,
|
|
246
|
+
secondary: Color(hex: "B0B0B0"),
|
|
247
|
+
hint: Color(hex: "727272"),
|
|
248
|
+
disable: Color(hex: "505050")
|
|
249
|
+
),
|
|
250
|
+
border: BorderColors(
|
|
251
|
+
default: Color(hex: "2A2A2A"),
|
|
252
|
+
disable: Color(hex: "242424")
|
|
253
|
+
),
|
|
254
|
+
success: ColorSet(
|
|
255
|
+
primary: Colors.green03,
|
|
256
|
+
secondary: Colors.green07,
|
|
257
|
+
container: Colors.green08
|
|
258
|
+
),
|
|
259
|
+
warning: ColorSet(
|
|
260
|
+
primary: Colors.orange03,
|
|
261
|
+
secondary: Colors.orange07,
|
|
262
|
+
container: Colors.orange08
|
|
263
|
+
),
|
|
264
|
+
error: ColorSet(
|
|
265
|
+
primary: Colors.red03,
|
|
266
|
+
secondary: Colors.red07,
|
|
267
|
+
container: Colors.red08
|
|
268
|
+
),
|
|
269
|
+
highlight: ColorSet(
|
|
270
|
+
primary: Colors.mint03,
|
|
271
|
+
secondary: Colors.mint07,
|
|
272
|
+
container: Colors.mint08
|
|
273
|
+
),
|
|
274
|
+
interactive: ColorSet(
|
|
275
|
+
primary: Colors.blue03,
|
|
276
|
+
secondary: Colors.blue07,
|
|
277
|
+
container: Colors.blue08
|
|
278
|
+
)
|
|
279
|
+
),
|
|
280
|
+
font: "SFProText",
|
|
281
|
+
assets: ThemeAssets(headerBackground: nil)
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
// MARK: - AppTheme Environment Key
|
|
285
|
+
|
|
286
|
+
private struct AppThemeKey: EnvironmentKey {
|
|
287
|
+
static let defaultValue: Theme = defaultTheme
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
public extension EnvironmentValues {
|
|
291
|
+
var appTheme: Theme {
|
|
292
|
+
get { self[AppThemeKey.self] }
|
|
293
|
+
set { self[AppThemeKey.self] = newValue }
|
|
294
|
+
}
|
|
295
|
+
}
|