@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.
Files changed (149) hide show
  1. package/.claude/settings.local.json +55 -0
  2. package/compose/build.gradle.kts +1 -1
  3. package/compose/compose.podspec +1 -1
  4. package/gradle.properties +1 -1
  5. package/ios/Application/Components.swift +34 -43
  6. package/ios/Application/FloatingButton.swift +10 -8
  7. package/ios/Application/Navigation/BottomTab/BottomTab.swift +102 -0
  8. package/ios/Application/Navigation/BottomTab/BottomTabBar.swift +215 -0
  9. package/ios/Application/Navigation/BottomTab/CurvedContainer.swift +65 -0
  10. package/ios/Application/Navigation/HeaderBackProps.swift +66 -0
  11. package/ios/Application/Navigation/HeaderTitle.swift +57 -0
  12. package/ios/Application/Navigation/HeaderUser.swift +209 -0
  13. package/ios/Application/Navigation/NavigationContainer.swift +151 -0
  14. package/ios/Application/Navigation/NavigationOptions.swift +109 -0
  15. package/ios/Application/Navigation/Navigator.swift +360 -0
  16. package/ios/Application/Navigation/Overplay/BottomSheet.swift +176 -0
  17. package/ios/Application/Navigation/Overplay/ModalScreen.swift +68 -0
  18. package/ios/Application/Navigation/Overplay/SnackBar.swift +144 -0
  19. package/ios/Application/Navigation/component/Header.swift +178 -0
  20. package/ios/Application/Navigation/component/HeaderBackground.swift +83 -0
  21. package/ios/Application/Navigation/component/HeaderColor.swift +65 -0
  22. package/ios/Application/StackScreen.swift +449 -0
  23. package/ios/Avatar/Avatar.swift +193 -0
  24. package/ios/Badge/Badge.swift +11 -13
  25. package/ios/Badge/BadgeRibbon.swift +12 -19
  26. package/ios/BaselineView/BaselineView.swift +163 -0
  27. package/ios/Button/Button.swift +62 -23
  28. package/ios/Carousel/Carousel.swift +181 -0
  29. package/ios/Checkbox/Checkbox.swift +14 -12
  30. package/ios/Chip/Chip.swift +23 -9
  31. package/ios/Collapse/Collapse.swift +182 -0
  32. package/ios/Colors+Radius+Spacing/Colors.swift +1 -1
  33. package/ios/Colors+Radius+Spacing/Theme.swift +295 -0
  34. package/ios/DateTimePicker/DateTimePicker.swift +210 -0
  35. package/ios/DateTimePicker/DateTimePickerTypes.swift +55 -0
  36. package/ios/DateTimePicker/DateTimePickerUtils.swift +167 -0
  37. package/ios/DateTimePicker/WheelPicker.swift +161 -0
  38. package/ios/Divider/Divider.swift +16 -0
  39. package/ios/Icon/Icon.swift +6 -1
  40. package/ios/IconButton/IconButton.swift +112 -0
  41. package/ios/Information/Information.swift +151 -0
  42. package/ios/Input/Input.swift +42 -25
  43. package/ios/Input/InputPhoneNumber.swift +21 -19
  44. package/ios/Input/InputSearch.swift +101 -45
  45. package/ios/Input/InputTextArea.swift +67 -40
  46. package/ios/InputDropDown/InputDropDown.swift +198 -0
  47. package/ios/InputMoney/InputMoney.swift +335 -0
  48. package/ios/InputOTP/InputOTP.swift +210 -0
  49. package/ios/Loader/Loader.swift +113 -0
  50. package/ios/MoMoUIKits.podspec +5 -0
  51. package/ios/OTPKeyboard/KeyboardButton.swift +1 -1
  52. package/ios/Pagination/PaginationDot.swift +61 -0
  53. package/ios/Pagination/PaginationNumber.swift +35 -0
  54. package/ios/Pagination/PaginationScroll.swift +101 -0
  55. package/ios/Pagination/PaginationWhiteDot.swift +37 -0
  56. package/ios/Popup/PopupDisplay.swift +10 -12
  57. package/ios/Popup/PopupInput.swift +2 -6
  58. package/ios/Popup/PopupNotify.swift +219 -0
  59. package/ios/ProgressInfo/ProgressInfo.swift +294 -0
  60. package/ios/Radio/Radio.swift +70 -0
  61. package/ios/Rating/Rating.swift +82 -0
  62. package/ios/Skeleton/Skeleton.swift +99 -0
  63. package/ios/Slider/Slider.swift +237 -0
  64. package/ios/Stepper/Stepper.swift +220 -0
  65. package/ios/Steps/Steps.swift +451 -0
  66. package/ios/SuggestAction/SuggestAction.swift +97 -0
  67. package/ios/Swipeable/SwipeCell.swift +185 -0
  68. package/ios/Swipeable/SwipeCellModel.swift +21 -0
  69. package/ios/TabView/TabView.swift +530 -0
  70. package/ios/Tag/Tag.swift +98 -0
  71. package/ios/Template/TrustBanner/TrustBanner.swift +2 -0
  72. package/ios/Title/Title.swift +269 -0
  73. package/ios/Tooltip/Tooltip.swift +482 -0
  74. package/ios/Typography/Text.swift +77 -5
  75. package/ios/Typography/Typography.swift +9 -0
  76. package/ios/Uploader/Uploader.swift +183 -0
  77. package/ios/native-kits.podspec +58 -8
  78. package/ios-demo/MoMoUIKitsDemo.podspec +18 -0
  79. package/ios-demo/README.md +120 -0
  80. package/ios-demo/Resources/dot_loading.json +558 -0
  81. package/ios-demo/Resources/icon.json +4052 -0
  82. package/ios-demo/Resources/lottie_circle_loader.json +1 -0
  83. package/ios-demo/Sources/MoMoUIKitsDemo/DemoScaffold.swift +48 -0
  84. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsBadgeDemoView.swift +25 -0
  85. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsButtonDemoView.swift +26 -0
  86. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsCheckboxDemoView.swift +19 -0
  87. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsChipDemoView.swift +33 -0
  88. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsInputDemoView.swift +48 -0
  89. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsPopupDemoView.swift +21 -0
  90. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsRadioDemoView.swift +17 -0
  91. package/ios-demo/Sources/MoMoUIKitsDemo/Demos/UIKitsTypographyDemoView.swift +28 -0
  92. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoContext.swift +31 -0
  93. package/ios-demo/Sources/MoMoUIKitsDemo/MoMoUIKitsDemoFactory.swift +72 -0
  94. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AnimatedHeaderDemo.swift +110 -0
  95. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/AvatarDemo.swift +93 -0
  96. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BadgeDemo.swift +269 -0
  97. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BaselineView.swift +117 -0
  98. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/BottomTabDemo.swift +89 -0
  99. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ButtonDemo.swift +100 -0
  100. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CarouselDemo.swift +126 -0
  101. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CheckboxDemo.swift +63 -0
  102. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ChipDemo.swift +20 -0
  103. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/CollapseDemo.swift +93 -0
  104. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ContentView.swift +107 -0
  105. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DateTimePickerDemo.swift +124 -0
  106. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/DividerDemo.swift +14 -0
  107. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/HeaderUserDemo.swift +49 -0
  108. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/Home.swift +261 -0
  109. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/IconButtonDemo.swift +58 -0
  110. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ImageDemo.swift +78 -0
  111. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InformationDemo.swift +138 -0
  112. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDemo.swift +111 -0
  113. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputDropDownDemo.swift +136 -0
  114. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputMoneyDemo.swift +107 -0
  115. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputOTPDemo.swift +73 -0
  116. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputPhoneNumberDemo.swift +100 -0
  117. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputSearchDemo.swift +32 -0
  118. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/InputTextAreaDemo.swift +57 -0
  119. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/LoaderDemo.swift +70 -0
  120. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/NavigationDemo.swift +227 -0
  121. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PaginationDemo.swift +72 -0
  122. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupDisplayDemo.swift +175 -0
  123. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupNotifyDemo.swift +121 -0
  124. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/PopupPromotionDemo.swift +76 -0
  125. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ProgressInfoDemo.swift +89 -0
  126. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RadioDemo.swift +32 -0
  127. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/RatingDemo.swift +56 -0
  128. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SkeletonDemo.swift +32 -0
  129. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SliderDemo.swift +150 -0
  130. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SnackBarDemo.swift +138 -0
  131. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepperDemo.swift +103 -0
  132. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/StepsDemo.swift +94 -0
  133. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SuggestActionDemo.swift +79 -0
  134. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwipeDemo.swift +152 -0
  135. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/SwitchDemo.swift +33 -0
  136. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TabViewDemo.swift +190 -0
  137. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TagDemo.swift +34 -0
  138. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/ThemeDemo.swift +182 -0
  139. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TitleDemo.swift +109 -0
  140. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TooltipDemo.swift +187 -0
  141. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/TypographyDemo.swift +87 -0
  142. package/ios-demo/Sources/MoMoUIKitsDemo/SampleDemos/UploaderDemo.swift +131 -0
  143. package/ios-demo/Sources/MoMoUIKitsDemo/SwiftUIDemoBrowserView.swift +50 -0
  144. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoModels.swift +15 -0
  145. package/ios-demo/Sources/MoMoUIKitsDemo/UIKitsDemoRegistry.swift +73 -0
  146. package/local.properties +8 -0
  147. package/package.json +1 -1
  148. package/publish.sh +50 -0
  149. package/scripts/gen-ios-color.mjs +136 -0
@@ -1,6 +1,191 @@
1
1
  import Foundation
2
2
  import SwiftUI
3
3
 
4
+ private let swipeActionWidth: CGFloat = 56
5
+
6
+ // MARK: - Swipe
7
+
8
+ public struct Swipe<Content: View>: View {
9
+ private let leftActions: [SwipeAction]
10
+ private let rightActions: [SwipeAction]
11
+ private let height: CGFloat
12
+ private let itemRadius: CGFloat
13
+ private let onSwipeableOpen: () -> Void
14
+ private let onSwipeableClose: () -> Void
15
+ private let onSwipeableLeftOpen: () -> Void
16
+ private let onSwipeableRightOpen: () -> Void
17
+ private let content: () -> Content
18
+
19
+ @State private var offsetX: CGFloat = 0
20
+ @State private var dragStartOffsetX: CGFloat?
21
+
22
+ public init(
23
+ leftActions: [SwipeAction] = [],
24
+ rightActions: [SwipeAction] = [],
25
+ height: CGFloat = 56,
26
+ itemRadius: CGFloat = 0,
27
+ onSwipeableOpen: @escaping () -> Void = {},
28
+ onSwipeableClose: @escaping () -> Void = {},
29
+ onSwipeableLeftOpen: @escaping () -> Void = {},
30
+ onSwipeableRightOpen: @escaping () -> Void = {},
31
+ @ViewBuilder content: @escaping () -> Content
32
+ ) {
33
+ self.leftActions = Array(leftActions.prefix(3))
34
+ self.rightActions = Array(rightActions.prefix(3))
35
+ self.height = height
36
+ self.itemRadius = itemRadius
37
+ self.onSwipeableOpen = onSwipeableOpen
38
+ self.onSwipeableClose = onSwipeableClose
39
+ self.onSwipeableLeftOpen = onSwipeableLeftOpen
40
+ self.onSwipeableRightOpen = onSwipeableRightOpen
41
+ self.content = content
42
+ }
43
+
44
+ public var body: some View {
45
+ let leftWidth = swipeActionWidth * CGFloat(leftActions.count)
46
+ let rightWidth = swipeActionWidth * CGFloat(rightActions.count)
47
+ let shape = RoundedRectangle(cornerRadius: itemRadius)
48
+
49
+ ZStack {
50
+ if !leftActions.isEmpty {
51
+ HStack(spacing: 0) {
52
+ ForEach(Array(leftActions.enumerated()), id: \.offset) { _, action in
53
+ SwipeActionButton(
54
+ action: action,
55
+ height: height,
56
+ itemRadius: itemRadius,
57
+ defaultBackgroundColor: Colors.primary
58
+ )
59
+ }
60
+ Spacer(minLength: 0)
61
+ }
62
+ }
63
+
64
+ if !rightActions.isEmpty {
65
+ HStack(spacing: 0) {
66
+ Spacer(minLength: 0)
67
+ ForEach(Array(rightActions.enumerated()), id: \.offset) { _, action in
68
+ SwipeActionButton(
69
+ action: action,
70
+ height: height,
71
+ itemRadius: itemRadius,
72
+ defaultBackgroundColor: Colors.error
73
+ )
74
+ }
75
+ }
76
+ }
77
+
78
+ ZStack {
79
+ Colors.card
80
+ content()
81
+ }
82
+ .frame(maxWidth: .infinity)
83
+ .frame(height: height)
84
+ .clipShape(shape)
85
+ .offset(x: offsetX)
86
+ .gesture(
87
+ DragGesture(minimumDistance: 8, coordinateSpace: .local)
88
+ .onChanged { value in
89
+ dragOnChanged(value: value, leftWidth: leftWidth, rightWidth: rightWidth)
90
+ }
91
+ .onEnded { _ in
92
+ dragStartOffsetX = nil
93
+ snapToClosest(leftWidth: leftWidth, rightWidth: rightWidth)
94
+ }
95
+ )
96
+ }
97
+ .frame(maxWidth: .infinity)
98
+ .frame(height: height)
99
+ .clipped()
100
+ }
101
+
102
+ private func dragOnChanged(value: DragGesture.Value, leftWidth: CGFloat, rightWidth: CGFloat) {
103
+ if dragStartOffsetX == nil {
104
+ dragStartOffsetX = offsetX
105
+ }
106
+
107
+ let proposedOffset = (dragStartOffsetX ?? 0) + value.translation.width
108
+ offsetX = min(max(proposedOffset, -rightWidth), leftWidth)
109
+ }
110
+
111
+ private func snapToClosest(leftWidth: CGFloat, rightWidth: CGFloat) {
112
+ let target: CGFloat
113
+
114
+ if offsetX > leftWidth * 0.5, !leftActions.isEmpty {
115
+ onSwipeableLeftOpen()
116
+ onSwipeableOpen()
117
+ target = leftWidth
118
+ } else if offsetX < -rightWidth * 0.5, !rightActions.isEmpty {
119
+ onSwipeableRightOpen()
120
+ onSwipeableOpen()
121
+ target = -rightWidth
122
+ } else {
123
+ onSwipeableClose()
124
+ target = 0
125
+ }
126
+
127
+ withAnimation(.easeOut(duration: 0.2)) {
128
+ offsetX = target
129
+ }
130
+ }
131
+ }
132
+
133
+ public extension Swipe where Content == EmptyView {
134
+ init(
135
+ leftActions: [SwipeAction] = [],
136
+ rightActions: [SwipeAction] = [],
137
+ height: CGFloat = 56,
138
+ itemRadius: CGFloat = 0,
139
+ onSwipeableOpen: @escaping () -> Void = {},
140
+ onSwipeableClose: @escaping () -> Void = {},
141
+ onSwipeableLeftOpen: @escaping () -> Void = {},
142
+ onSwipeableRightOpen: @escaping () -> Void = {}
143
+ ) {
144
+ self.init(
145
+ leftActions: leftActions,
146
+ rightActions: rightActions,
147
+ height: height,
148
+ itemRadius: itemRadius,
149
+ onSwipeableOpen: onSwipeableOpen,
150
+ onSwipeableClose: onSwipeableClose,
151
+ onSwipeableLeftOpen: onSwipeableLeftOpen,
152
+ onSwipeableRightOpen: onSwipeableRightOpen
153
+ ) {
154
+ EmptyView()
155
+ }
156
+ }
157
+ }
158
+
159
+ private struct SwipeActionButton: View {
160
+ let action: SwipeAction
161
+ let height: CGFloat
162
+ let itemRadius: CGFloat
163
+ let defaultBackgroundColor: Color
164
+
165
+ var body: some View {
166
+ SwiftUI.Button(action: action.onPress) {
167
+ VStack(spacing: Spacing.XXS) {
168
+ if !action.icon.isEmpty {
169
+ Icon(source: action.icon, size: 20, color: Colors.black01)
170
+ }
171
+
172
+ if !action.label.isEmpty {
173
+ MomoText(
174
+ action.label,
175
+ typography: .labelSMedium,
176
+ color: Colors.black01,
177
+ maxLines: 1
178
+ )
179
+ }
180
+ }
181
+ .frame(width: swipeActionWidth, height: height)
182
+ .background(action.backgroundColor ?? defaultBackgroundColor)
183
+ .clipShape(RoundedRectangle(cornerRadius: itemRadius))
184
+ }
185
+ .buttonStyle(.plain)
186
+ }
187
+ }
188
+
4
189
  // MARK: - SwipeCellModifier
5
190
 
6
191
  public struct SwipeCellModifier: ViewModifier {
@@ -3,6 +3,27 @@
3
3
  import Foundation
4
4
  import SwiftUI
5
5
 
6
+ // MARK: - SwipeAction
7
+
8
+ public struct SwipeAction {
9
+ public init(
10
+ label: String = "",
11
+ icon: String = "",
12
+ backgroundColor: Color? = nil,
13
+ onPress: @escaping () -> Void = {}
14
+ ) {
15
+ self.label = label
16
+ self.icon = icon
17
+ self.backgroundColor = backgroundColor
18
+ self.onPress = onPress
19
+ }
20
+
21
+ public var label: String
22
+ public var icon: String
23
+ public var backgroundColor: Color?
24
+ public var onPress: () -> Void
25
+ }
26
+
6
27
  // MARK: - SwipeGroupSide
7
28
 
8
29
  public enum SwipeGroupSide {