@momo-kits/native-kits 0.160.1-beta.2-debug → 0.160.1-beta.4-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/compose/build.gradle.kts +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +1 -6
- package/gradle/libs.versions.toml +1 -1
- package/gradle.properties +1 -1
- package/ios/Application/ApplicationEnvironment.swift +2 -0
- package/ios/Input/Input.swift +20 -20
- package/ios/Input/InputPhoneNumber.swift +17 -17
- package/ios/Typography/Text.swift +10 -17
- package/ios/Typography/Typography.swift +1 -22
- package/package.json +1 -1
package/compose/build.gradle.kts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
package vn.momo.kits.application
|
|
2
2
|
|
|
3
|
-
import androidx.compose.runtime.Composable
|
|
4
3
|
import androidx.compose.runtime.Immutable
|
|
5
|
-
import androidx.compose.runtime.ReadOnlyComposable
|
|
6
4
|
import androidx.compose.runtime.staticCompositionLocalOf
|
|
7
5
|
import vn.momo.kits.components.TrustBannerData
|
|
8
6
|
|
|
@@ -94,10 +92,7 @@ val ApplicationContext = staticCompositionLocalOf<MiniAppContext?> {
|
|
|
94
92
|
null
|
|
95
93
|
}
|
|
96
94
|
|
|
97
|
-
|
|
98
|
-
@Composable
|
|
99
|
-
@ReadOnlyComposable
|
|
100
|
-
get() = ApplicationContext.current?.features?.isBaselineEnabled ?: false
|
|
95
|
+
var IsShowBaseLineDebug = false
|
|
101
96
|
|
|
102
97
|
val AppConfig = staticCompositionLocalOf<KitConfig?> {
|
|
103
98
|
null
|
package/gradle.properties
CHANGED
package/ios/Input/Input.swift
CHANGED
|
@@ -4,7 +4,7 @@ import Combine
|
|
|
4
4
|
|
|
5
5
|
public struct Input: View {
|
|
6
6
|
@Binding public var text: String
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
public var placeholder: String
|
|
9
9
|
public var floatingValue: String
|
|
10
10
|
public var floatingIcon: String
|
|
@@ -29,10 +29,10 @@ public struct Input: View {
|
|
|
29
29
|
public var onFocus: (() -> Void)?
|
|
30
30
|
public var onBlur: (() -> Void)?
|
|
31
31
|
public var onRightIconPressed: (() -> Void)?
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
@State private var isFocused: Bool = false
|
|
34
34
|
@State private var isPasswordHidden: Bool = true
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
public init(
|
|
37
37
|
text: Binding<String>,
|
|
38
38
|
placeholder: String = "",
|
|
@@ -96,7 +96,7 @@ public struct Input: View {
|
|
|
96
96
|
self.onChangeText?(newValue)
|
|
97
97
|
}
|
|
98
98
|
)
|
|
99
|
-
|
|
99
|
+
|
|
100
100
|
VStack(alignment: .leading, spacing: 4) {
|
|
101
101
|
ZStack(alignment: .topLeading) {
|
|
102
102
|
// Floating label
|
|
@@ -115,7 +115,7 @@ public struct Input: View {
|
|
|
115
115
|
.offset(x: Spacing.S, y: -8)
|
|
116
116
|
.zIndex(10)
|
|
117
117
|
}
|
|
118
|
-
|
|
118
|
+
|
|
119
119
|
// Input container
|
|
120
120
|
HStack(alignment: .center, spacing: 0) {
|
|
121
121
|
// Leading icon
|
|
@@ -123,7 +123,7 @@ public struct Input: View {
|
|
|
123
123
|
Icon(source: leadingIcon, size: size == .small ? 24 : 32, color: leadingIconColor)
|
|
124
124
|
.padding(.trailing, Spacing.M)
|
|
125
125
|
}
|
|
126
|
-
|
|
126
|
+
|
|
127
127
|
// Text input field
|
|
128
128
|
ZStack(alignment: .leading) {
|
|
129
129
|
if text.isEmpty {
|
|
@@ -133,7 +133,7 @@ public struct Input: View {
|
|
|
133
133
|
color: getPlaceholderColor()
|
|
134
134
|
)
|
|
135
135
|
}
|
|
136
|
-
|
|
136
|
+
|
|
137
137
|
if secureTextEntry && isPasswordHidden {
|
|
138
138
|
SecureInputField(
|
|
139
139
|
text: $text,
|
|
@@ -158,7 +158,7 @@ public struct Input: View {
|
|
|
158
158
|
.applyPrimaryCursorColor()
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
|
-
|
|
161
|
+
|
|
162
162
|
// Clear button (only show when focused and has text)
|
|
163
163
|
if isFocused && !text.isEmpty {
|
|
164
164
|
SwiftUI.Button(action: {
|
|
@@ -169,14 +169,14 @@ public struct Input: View {
|
|
|
169
169
|
.padding(.leading, Spacing.S).accessibility(identifier: "ic_clear")
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
|
-
|
|
172
|
+
|
|
173
173
|
// Loading indicator
|
|
174
174
|
if loading {
|
|
175
175
|
ActivityIndicator(isAnimating: .constant(true), style: .medium)
|
|
176
176
|
.frame(width: 16, height: 16)
|
|
177
177
|
.padding(.leading, Spacing.S)
|
|
178
178
|
}
|
|
179
|
-
|
|
179
|
+
|
|
180
180
|
// Right icon (password toggle or custom icon)
|
|
181
181
|
if secureTextEntry {
|
|
182
182
|
if !text.isEmpty {
|
|
@@ -197,7 +197,7 @@ public struct Input: View {
|
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
.padding(.horizontal, Spacing.M)
|
|
200
|
-
.frame(height: scaleSize(size == .small ? 48 : 56
|
|
200
|
+
.frame(height: scaleSize(size == .small ? 48 : 56))
|
|
201
201
|
.background(
|
|
202
202
|
RoundedRectangle(cornerRadius: Radius.S)
|
|
203
203
|
.fill(Colors.black01)
|
|
@@ -207,7 +207,7 @@ public struct Input: View {
|
|
|
207
207
|
.stroke(borderColor(), lineWidth: 1)
|
|
208
208
|
)
|
|
209
209
|
}
|
|
210
|
-
|
|
210
|
+
|
|
211
211
|
// Error or hint
|
|
212
212
|
ErrorView(
|
|
213
213
|
errorMessage: error,
|
|
@@ -223,9 +223,9 @@ public struct Input: View {
|
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
|
-
|
|
226
|
+
|
|
227
227
|
// MARK: - Helpers
|
|
228
|
-
|
|
228
|
+
|
|
229
229
|
private func handleFocusChange(_ focused: Bool) {
|
|
230
230
|
isFocused = focused
|
|
231
231
|
if focused {
|
|
@@ -234,12 +234,12 @@ public struct Input: View {
|
|
|
234
234
|
onBlur?()
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
|
-
|
|
237
|
+
|
|
238
238
|
private func togglePasswordVisibility() {
|
|
239
239
|
isPasswordHidden.toggle()
|
|
240
240
|
onRightIconPressed?()
|
|
241
241
|
}
|
|
242
|
-
|
|
242
|
+
|
|
243
243
|
private func borderColor() -> Color {
|
|
244
244
|
if disabled {
|
|
245
245
|
return Colors.black04 // border.disable
|
|
@@ -252,19 +252,19 @@ public struct Input: View {
|
|
|
252
252
|
}
|
|
253
253
|
return Colors.black04 // border.default
|
|
254
254
|
}
|
|
255
|
-
|
|
255
|
+
|
|
256
256
|
private func getTextColor() -> Color {
|
|
257
257
|
return disabled ? Colors.black09 : Colors.black17
|
|
258
258
|
}
|
|
259
|
-
|
|
259
|
+
|
|
260
260
|
private func getPlaceholderColor() -> Color {
|
|
261
261
|
return disabled ? Colors.black09 : Colors.black12
|
|
262
262
|
}
|
|
263
|
-
|
|
263
|
+
|
|
264
264
|
private func getFloatingColor() -> Color {
|
|
265
265
|
return disabled ? Colors.black09 : Colors.black12
|
|
266
266
|
}
|
|
267
|
-
|
|
267
|
+
|
|
268
268
|
private func getFloatingIconColor() -> Color {
|
|
269
269
|
return disabled ? Colors.black09 : floatingIconColor
|
|
270
270
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import SwiftUI
|
|
9
9
|
public struct InputPhoneNumber: View {
|
|
10
10
|
@Binding public var text: String
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
public var placeholder: String
|
|
13
13
|
public var size: InputSize
|
|
14
14
|
public var hintText: String
|
|
@@ -22,9 +22,9 @@ public struct InputPhoneNumber: View {
|
|
|
22
22
|
public var onBlur: (() -> Void)?
|
|
23
23
|
public var onRightIconPressed: (() -> Void)?
|
|
24
24
|
public var accessibilityLabel: String?
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
@State private var isFocused: Bool = false
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
public init(
|
|
29
29
|
text: Binding<String>,
|
|
30
30
|
placeholder: String = "0123456789",
|
|
@@ -57,7 +57,7 @@ public struct InputPhoneNumber: View {
|
|
|
57
57
|
self.onRightIconPressed = onRightIconPressed
|
|
58
58
|
self.accessibilityLabel = accessibilityLabel
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
|
|
61
61
|
// MARK: - Body
|
|
62
62
|
public var body: some View {
|
|
63
63
|
let textBinding = Binding<String>(
|
|
@@ -67,28 +67,28 @@ public struct InputPhoneNumber: View {
|
|
|
67
67
|
self.onChangeText?(newValue)
|
|
68
68
|
}
|
|
69
69
|
)
|
|
70
|
-
|
|
70
|
+
|
|
71
71
|
VStack(alignment: .leading, spacing: 4) {
|
|
72
72
|
HStack(spacing: 0) {
|
|
73
73
|
// 🇻🇳 Flag
|
|
74
74
|
ImageView("https://static.momocdn.net/app/img/icon/ic-qrcode-package/ic_vn_flag.png")
|
|
75
75
|
.frame(width: 24, height: 24)
|
|
76
76
|
.padding(.trailing, Spacing.XS)
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
MomoText("+84", typography: size == .small ? .headerSSemibold : .headerMBold)
|
|
79
79
|
.foregroundColor(Colors.black17)
|
|
80
|
-
|
|
80
|
+
|
|
81
81
|
Rectangle()
|
|
82
82
|
.fill(Colors.black04)
|
|
83
83
|
.frame(width: 1, height: size == .small ? 24 : 32)
|
|
84
84
|
.padding(.horizontal, Spacing.M)
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
// Text input
|
|
87
87
|
ZStack(alignment: .leading) {
|
|
88
88
|
if text.isEmpty {
|
|
89
89
|
MomoText(placeholder, typography: size == .small ? .headerSSemibold : .headerMBold, color: Colors.black12)
|
|
90
90
|
}
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
TextField("", text: textBinding, onEditingChanged: { focused in
|
|
93
93
|
handleFocusChange(focused)
|
|
94
94
|
})
|
|
@@ -100,7 +100,7 @@ public struct InputPhoneNumber: View {
|
|
|
100
100
|
.accessibility(identifier: accessibilityLabel ?? "")
|
|
101
101
|
.accessibilityValue(textBinding.wrappedValue.isEmpty ? placeholder : textBinding.wrappedValue)
|
|
102
102
|
}
|
|
103
|
-
|
|
103
|
+
|
|
104
104
|
// Clear button
|
|
105
105
|
if isFocused && !text.isEmpty {
|
|
106
106
|
SwiftUI.Button(action: {
|
|
@@ -111,13 +111,13 @@ public struct InputPhoneNumber: View {
|
|
|
111
111
|
.padding(.leading, Spacing.S).accessibility(identifier: "ic_clear")
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
|
-
|
|
114
|
+
|
|
115
115
|
// Loading indicator
|
|
116
116
|
if loading {
|
|
117
117
|
ActivityIndicator(isAnimating: .constant(true), style: .medium)
|
|
118
118
|
.frame(width: 16, height: 16)
|
|
119
119
|
}
|
|
120
|
-
|
|
120
|
+
|
|
121
121
|
// ✅ Right icon
|
|
122
122
|
if !rightIcon.isEmpty {
|
|
123
123
|
SwiftUI.Button(action: { onRightIconPressed?() }) {
|
|
@@ -127,7 +127,7 @@ public struct InputPhoneNumber: View {
|
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
.padding(.horizontal, Spacing.M)
|
|
130
|
-
.frame(height: scaleSize(size == .small ? 48 : 56
|
|
130
|
+
.frame(height: scaleSize(size == .small ? 48 : 56))
|
|
131
131
|
.background(
|
|
132
132
|
RoundedRectangle(cornerRadius: Radius.S)
|
|
133
133
|
.fill(Colors.black01)
|
|
@@ -136,7 +136,7 @@ public struct InputPhoneNumber: View {
|
|
|
136
136
|
RoundedRectangle(cornerRadius: Radius.S)
|
|
137
137
|
.stroke(borderColor(), lineWidth: isFocused ? 1.5 : 1)
|
|
138
138
|
)
|
|
139
|
-
|
|
139
|
+
|
|
140
140
|
// Error or hint
|
|
141
141
|
ErrorView(
|
|
142
142
|
errorMessage: error,
|
|
@@ -145,9 +145,9 @@ public struct InputPhoneNumber: View {
|
|
|
145
145
|
)
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
|
|
148
|
+
|
|
149
149
|
// MARK: - Helpers
|
|
150
|
-
|
|
150
|
+
|
|
151
151
|
private func handleFocusChange(_ focused: Bool) {
|
|
152
152
|
isFocused = focused
|
|
153
153
|
if focused {
|
|
@@ -156,7 +156,7 @@ public struct InputPhoneNumber: View {
|
|
|
156
156
|
onBlur?()
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
|
-
|
|
159
|
+
|
|
160
160
|
private func borderColor() -> Color {
|
|
161
161
|
if !error.isEmpty { return Colors.red03 }
|
|
162
162
|
if isFocused { return Colors.primary }
|
|
@@ -1,30 +1,23 @@
|
|
|
1
1
|
import SwiftUI
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
private let DEFAULT_SCREEN_SIZE: CGFloat = 375
|
|
4
|
+
private let MAX_FONT_SCALE: CGFloat = 1.2
|
|
5
|
+
|
|
6
|
+
public func scaleSize(_ size: CGFloat) -> CGFloat {
|
|
7
|
+
if IsShowBaseLineDebug { return size }
|
|
7
8
|
|
|
8
9
|
let deviceWidth = UIScreen.main.bounds.width
|
|
9
|
-
let deviceScale = deviceWidth /
|
|
10
|
+
let deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE
|
|
10
11
|
|
|
11
12
|
let defaultFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
|
|
12
13
|
let scaledFont = UIFontMetrics.default.scaledFont(for: defaultFont)
|
|
13
14
|
let fontScale = scaledFont.pointSize / defaultFont.pointSize
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if deviceScale > 1 {
|
|
20
|
-
fontSizeDeviceScale = min(fontSizeDeviceScale * deviceScale, fontSizeDeviceScale + maxDeviceScale)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if fontScale > 1 {
|
|
24
|
-
fontSizeOSScale = min(fontSizeOSScale * fontScale, fontSizeOSScale * maxFontScale)
|
|
25
|
-
}
|
|
16
|
+
let maxSize = size * MAX_FONT_SCALE
|
|
17
|
+
let fontSizeScaleDevice = deviceScale > 1 ? deviceScale * size : size
|
|
18
|
+
let fontSizeScaleOS = fontScale > 1 ? fontScale * size : size
|
|
26
19
|
|
|
27
|
-
return max(
|
|
20
|
+
return min(max(fontSizeScaleDevice, fontSizeScaleOS), maxSize)
|
|
28
21
|
}
|
|
29
22
|
|
|
30
23
|
public enum TypographyStyle {
|
|
@@ -2,28 +2,7 @@ import SwiftUI
|
|
|
2
2
|
|
|
3
3
|
public extension Font {
|
|
4
4
|
static func appFont(size: CGFloat) -> Font {
|
|
5
|
-
|
|
6
|
-
let maxFontScale: CGFloat = 1.5
|
|
7
|
-
let maxDeviceScale: CGFloat = 5
|
|
8
|
-
|
|
9
|
-
let deviceWidth = UIScreen.main.bounds.width
|
|
10
|
-
let deviceScale = deviceWidth / defaultScreenSize
|
|
11
|
-
|
|
12
|
-
let defaultFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
|
|
13
|
-
let scaledFont = UIFontMetrics.default.scaledFont(for: defaultFont)
|
|
14
|
-
let fontScale = scaledFont.pointSize / defaultFont.pointSize
|
|
15
|
-
|
|
16
|
-
var fontSize = size
|
|
17
|
-
|
|
18
|
-
if deviceScale > 1 {
|
|
19
|
-
fontSize = min(fontSize * deviceScale, fontSize + maxDeviceScale)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
if fontScale > 1 {
|
|
23
|
-
fontSize = min(fontSize * fontScale, fontSize * maxFontScale)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return Font.system(size: fontSize)
|
|
5
|
+
return Font.system(size: scaleSize(size))
|
|
27
6
|
}
|
|
28
7
|
|
|
29
8
|
// New supported typography styles
|