@momo-kits/native-kits 0.160.7-debug → 0.161.1-beta.15-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 (33) hide show
  1. package/compose/build.gradle.kts +1 -1
  2. package/compose/compose.podspec +1 -1
  3. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +1 -2
  4. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +14 -8
  5. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +3 -4
  6. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +0 -4
  7. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +1 -5
  8. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +1 -5
  9. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +14 -19
  10. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +12 -27
  11. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +28 -1
  12. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +2 -2
  13. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +1 -14
  14. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +7 -11
  15. package/example/ios/Example.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  16. package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  17. package/example/ios/Example.xcworkspace/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
  18. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +58 -0
  19. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/Pods-Example.xcscheme +58 -0
  20. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
  21. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
  22. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
  23. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/huynhdung.xcuserdatad/xcschemes/xcschememanagement.plist +46 -0
  24. package/gradle/libs.versions.toml +1 -1
  25. package/gradle.properties +1 -1
  26. package/ios/Application/ApplicationEnvironment.swift +6 -2
  27. package/ios/Input/Input.swift +21 -50
  28. package/ios/Input/InputPhoneNumber.swift +17 -17
  29. package/ios/Typography/Text.swift +14 -19
  30. package/ios/Typography/Typography.swift +1 -22
  31. package/local.properties +8 -0
  32. package/package.json +1 -1
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +0 -17
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "3847153A6E5EEFB86565BA840768F429"
18
+ BuildableName = "SDWebImage.framework"
19
+ BlueprintName = "SDWebImage"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "92EBFA3E7005B4C18A9C0B44324EB80F"
18
+ BuildableName = "SDWebImageSwiftUI.framework"
19
+ BlueprintName = "SDWebImageSwiftUI"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1600"
4
+ version = "1.3">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "6510766A9670BFA3B251E2A62446FC5D"
18
+ BuildableName = "SkeletonUI.framework"
19
+ BlueprintName = "SkeletonUI"
20
+ ReferencedContainer = "container:Pods.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES">
30
+ <Testables>
31
+ </Testables>
32
+ </TestAction>
33
+ <LaunchAction
34
+ buildConfiguration = "Debug"
35
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37
+ launchStyle = "0"
38
+ useCustomWorkingDirectory = "NO"
39
+ ignoresPersistentStateOnLaunch = "NO"
40
+ debugDocumentVersioning = "YES"
41
+ debugServiceExtension = "internal"
42
+ allowLocationSimulation = "YES">
43
+ </LaunchAction>
44
+ <ProfileAction
45
+ buildConfiguration = "Release"
46
+ shouldUseLaunchSchemeArgsEnv = "YES"
47
+ savedToolIdentifier = ""
48
+ useCustomWorkingDirectory = "NO"
49
+ debugDocumentVersioning = "YES">
50
+ </ProfileAction>
51
+ <AnalyzeAction
52
+ buildConfiguration = "Debug">
53
+ </AnalyzeAction>
54
+ <ArchiveAction
55
+ buildConfiguration = "Release"
56
+ revealArchiveInOrganizer = "YES">
57
+ </ArchiveAction>
58
+ </Scheme>
@@ -0,0 +1,46 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>SchemeUserState</key>
6
+ <dict>
7
+ <key>MoMoUIKits.xcscheme</key>
8
+ <dict>
9
+ <key>isShown</key>
10
+ <false />
11
+ <key>orderHint</key>
12
+ <integer>0</integer>
13
+ </dict>
14
+ <key>Pods-Example.xcscheme</key>
15
+ <dict>
16
+ <key>isShown</key>
17
+ <false />
18
+ <key>orderHint</key>
19
+ <integer>1</integer>
20
+ </dict>
21
+ <key>SDWebImage.xcscheme</key>
22
+ <dict>
23
+ <key>isShown</key>
24
+ <false />
25
+ <key>orderHint</key>
26
+ <integer>2</integer>
27
+ </dict>
28
+ <key>SDWebImageSwiftUI.xcscheme</key>
29
+ <dict>
30
+ <key>isShown</key>
31
+ <false />
32
+ <key>orderHint</key>
33
+ <integer>3</integer>
34
+ </dict>
35
+ <key>SkeletonUI.xcscheme</key>
36
+ <dict>
37
+ <key>isShown</key>
38
+ <false />
39
+ <key>orderHint</key>
40
+ <integer>4</integer>
41
+ </dict>
42
+ </dict>
43
+ <key>SuppressBuildableAutocreation</key>
44
+ <dict />
45
+ </dict>
46
+ </plist>
@@ -18,7 +18,7 @@ androidx-appcompat = "1.7.0"
18
18
  material = "1.10.0"
19
19
  maxapi = "0.1.1"
20
20
  vanniktechMavenPublish = "0.34.0"
21
- kits = "0.159.1-beta.7"
21
+ kits = "0.160.1-beta.6"
22
22
  nativemaxapi = "0.0.6"
23
23
 
24
24
  [libraries]
package/gradle.properties CHANGED
@@ -18,7 +18,7 @@ kotlin.apple.xcodeCompatibility.nowarn=true
18
18
  name="ComposeKits"
19
19
  group=vn.momo.kits
20
20
  artifact.id=kits
21
- version=0.160.7
21
+ version=0.161.1-beta.15
22
22
 
23
23
  repo=GitLab
24
24
  url=https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven
@@ -17,7 +17,7 @@ public class MiniAppContext {
17
17
  public var toolkitConfig: [String: Any] = [:]
18
18
  public var providerId: String = "momo"
19
19
  public var permissions: [[String: Any]] = []
20
-
20
+
21
21
  public init(appId: String, appCode: String, appName: Any? = nil, appIcon: String, description: Any? = nil, support: [String: Any] = [:], toolkitConfig: [String: Any] = [:], providerId: String = "momo", permissions: [[String: Any]] = []) {
22
22
  self.appId = appId
23
23
  self.appCode = appCode
@@ -37,11 +37,15 @@ public class KitConfig {
37
37
  public var headerGradient: String? = nil
38
38
  }
39
39
 
40
+ public var IsShowBaseLineDebug = false
41
+
42
+ public var UseFontScaleSystem = true
43
+
40
44
  public class ApplicationEnvironment: ObservableObject {
41
45
  let applicationContext: MiniAppContext?
42
46
  let composeApi: KitComposeApi?
43
47
  let config: KitConfig?
44
-
48
+
45
49
  public init(applicationContext: MiniAppContext? = nil, composeApi: KitComposeApi? = nil, config: KitConfig? = nil) {
46
50
  self.applicationContext = applicationContext
47
51
  self.composeApi = composeApi
@@ -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
@@ -22,7 +22,6 @@ public struct Input: View {
22
22
  public var leadingIconColor: Color
23
23
  public var loading: Bool
24
24
  public var required: Bool
25
- public var maxLength: Int?
26
25
  public var fontWeight: InputFontWeight
27
26
  public var keyboardType: UIKeyboardType
28
27
  public var autofocus: Bool
@@ -30,10 +29,10 @@ public struct Input: View {
30
29
  public var onFocus: (() -> Void)?
31
30
  public var onBlur: (() -> Void)?
32
31
  public var onRightIconPressed: (() -> Void)?
33
-
32
+
34
33
  @State private var isFocused: Bool = false
35
34
  @State private var isPasswordHidden: Bool = true
36
-
35
+
37
36
  public init(
38
37
  text: Binding<String>,
39
38
  placeholder: String = "",
@@ -53,7 +52,6 @@ public struct Input: View {
53
52
  leadingIconColor: Color = Colors.black12,
54
53
  loading: Bool = false,
55
54
  required: Bool = false,
56
- maxLength: Int? = nil,
57
55
  fontWeight: InputFontWeight = .regular,
58
56
  keyboardType: UIKeyboardType = .default,
59
57
  autofocus: Bool = false,
@@ -80,7 +78,6 @@ public struct Input: View {
80
78
  self.leadingIconColor = leadingIconColor
81
79
  self.loading = loading
82
80
  self.required = required
83
- self.maxLength = maxLength
84
81
  self.fontWeight = fontWeight
85
82
  self.keyboardType = keyboardType
86
83
  self.autofocus = autofocus
@@ -96,7 +93,7 @@ public struct Input: View {
96
93
  get: { self.text },
97
94
  set: { newValue in
98
95
  self.text = newValue
99
- self.onChangeText?(limitText(newValue))
96
+ self.onChangeText?(newValue)
100
97
  }
101
98
  )
102
99
 
@@ -118,7 +115,7 @@ public struct Input: View {
118
115
  .offset(x: Spacing.S, y: -8)
119
116
  .zIndex(10)
120
117
  }
121
-
118
+
122
119
  // Input container
123
120
  HStack(alignment: .center, spacing: 0) {
124
121
  // Leading icon
@@ -126,7 +123,7 @@ public struct Input: View {
126
123
  Icon(source: leadingIcon, size: size == .small ? 24 : 32, color: leadingIconColor)
127
124
  .padding(.trailing, Spacing.M)
128
125
  }
129
-
126
+
130
127
  // Text input field
131
128
  ZStack(alignment: .leading) {
132
129
  if text.isEmpty {
@@ -136,7 +133,7 @@ public struct Input: View {
136
133
  color: getPlaceholderColor()
137
134
  )
138
135
  }
139
-
136
+
140
137
  if secureTextEntry && isPasswordHidden {
141
138
  SecureInputField(
142
139
  text: $text,
@@ -145,7 +142,6 @@ public struct Input: View {
145
142
  fontWeight: fontWeight == .bold ? .bold : .regular,
146
143
  textColor: UIColor(getTextColor()),
147
144
  isDisabled: disabled || readOnly,
148
- maxLength: maxLength,
149
145
  onFocusChange: { focused in
150
146
  handleFocusChange(focused)
151
147
  },
@@ -160,15 +156,9 @@ public struct Input: View {
160
156
  .foregroundColor(getTextColor())
161
157
  .disabled(disabled || readOnly)
162
158
  .applyPrimaryCursorColor()
163
- .onChange(of: text) { newValue in
164
- let limited = limitText(newValue)
165
- if limited != newValue {
166
- text = limited
167
- }
168
- }
169
159
  }
170
160
  }
171
-
161
+
172
162
  // Clear button (only show when focused and has text)
173
163
  if isFocused && !text.isEmpty {
174
164
  SwiftUI.Button(action: {
@@ -179,14 +169,14 @@ public struct Input: View {
179
169
  .padding(.leading, Spacing.S).accessibility(identifier: "ic_clear")
180
170
  }
181
171
  }
182
-
172
+
183
173
  // Loading indicator
184
174
  if loading {
185
175
  ActivityIndicator(isAnimating: .constant(true), style: .medium)
186
176
  .frame(width: 16, height: 16)
187
177
  .padding(.leading, Spacing.S)
188
178
  }
189
-
179
+
190
180
  // Right icon (password toggle or custom icon)
191
181
  if secureTextEntry {
192
182
  if !text.isEmpty {
@@ -207,7 +197,7 @@ public struct Input: View {
207
197
  }
208
198
  }
209
199
  .padding(.horizontal, Spacing.M)
210
- .frame(height: scaleSize(size == .small ? 48 : 56, 1.1))
200
+ .frame(height: scaleSize(size == .small ? 48 : 56))
211
201
  .background(
212
202
  RoundedRectangle(cornerRadius: Radius.S)
213
203
  .fill(Colors.black01)
@@ -217,7 +207,7 @@ public struct Input: View {
217
207
  .stroke(borderColor(), lineWidth: 1)
218
208
  )
219
209
  }
220
-
210
+
221
211
  // Error or hint
222
212
  ErrorView(
223
213
  errorMessage: error,
@@ -233,9 +223,9 @@ public struct Input: View {
233
223
  }
234
224
  }
235
225
  }
236
-
226
+
237
227
  // MARK: - Helpers
238
-
228
+
239
229
  private func handleFocusChange(_ focused: Bool) {
240
230
  isFocused = focused
241
231
  if focused {
@@ -244,19 +234,12 @@ public struct Input: View {
244
234
  onBlur?()
245
235
  }
246
236
  }
247
-
237
+
248
238
  private func togglePasswordVisibility() {
249
239
  isPasswordHidden.toggle()
250
240
  onRightIconPressed?()
251
241
  }
252
242
 
253
- private func limitText(_ value: String) -> String {
254
- guard let maxLength = maxLength else {
255
- return value
256
- }
257
- return String(value.prefix(maxLength))
258
- }
259
-
260
243
  private func borderColor() -> Color {
261
244
  if disabled {
262
245
  return Colors.black04 // border.disable
@@ -269,19 +252,19 @@ public struct Input: View {
269
252
  }
270
253
  return Colors.black04 // border.default
271
254
  }
272
-
255
+
273
256
  private func getTextColor() -> Color {
274
257
  return disabled ? Colors.black09 : Colors.black17
275
258
  }
276
-
259
+
277
260
  private func getPlaceholderColor() -> Color {
278
261
  return disabled ? Colors.black09 : Colors.black12
279
262
  }
280
-
263
+
281
264
  private func getFloatingColor() -> Color {
282
265
  return disabled ? Colors.black09 : Colors.black12
283
266
  }
284
-
267
+
285
268
  private func getFloatingIconColor() -> Color {
286
269
  return disabled ? Colors.black09 : floatingIconColor
287
270
  }
@@ -296,7 +279,6 @@ private struct SecureInputField: UIViewRepresentable {
296
279
  var fontWeight: UIFont.Weight
297
280
  var textColor: UIColor
298
281
  var isDisabled: Bool
299
- var maxLength: Int?
300
282
  var onFocusChange: (Bool) -> Void
301
283
  var onChangeText: ((String) -> Void)?
302
284
 
@@ -325,7 +307,6 @@ private struct SecureInputField: UIViewRepresentable {
325
307
  }
326
308
 
327
309
  func updateUIView(_ textField: UITextField, context: Context) {
328
- context.coordinator.parent = self
329
310
  if textField.text != text {
330
311
  textField.text = text
331
312
  }
@@ -361,7 +342,7 @@ private struct SecureInputField: UIViewRepresentable {
361
342
  }
362
343
 
363
344
  func textFieldDidEndEditing(_ textField: UITextField) {
364
- parent.text = limitText(textField.text ?? "")
345
+ parent.text = textField.text ?? ""
365
346
  parent.onFocusChange(false)
366
347
  }
367
348
 
@@ -376,10 +357,7 @@ private struct SecureInputField: UIViewRepresentable {
376
357
 
377
358
  @objc func textFieldDidChange(_ textField: UITextField) {
378
359
  if isResettingText { return }
379
- let newText = limitText(textField.text ?? "")
380
- if textField.text != newText {
381
- textField.text = newText
382
- }
360
+ let newText = textField.text ?? ""
383
361
  parent.text = newText
384
362
  parent.onChangeText?(newText)
385
363
  }
@@ -388,13 +366,6 @@ private struct SecureInputField: UIViewRepresentable {
388
366
  textField.resignFirstResponder()
389
367
  return true
390
368
  }
391
-
392
- private func limitText(_ value: String) -> String {
393
- guard let maxLength = parent.maxLength else {
394
- return value
395
- }
396
- return String(value.prefix(maxLength))
397
- }
398
369
  }
399
370
  }
400
371
 
@@ -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, 1.1))
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,25 @@
1
1
  import SwiftUI
2
2
 
3
- public func scaleSize(_ size: CGFloat, _ scaleRate: CGFloat? = nil) -> CGFloat {
4
- let defaultScreenSize: CGFloat = 375
5
- let maxFontScale: CGFloat = scaleRate ?? 1.5
6
- let maxDeviceScale: CGFloat = 5
3
+ private let DEFAULT_SCREEN_SIZE: CGFloat = 375
4
+ private let MAX_FONT_SCALE: CGFloat = 1.2
7
5
 
8
- let deviceWidth = UIScreen.main.bounds.width
9
- let deviceScale = deviceWidth / defaultScreenSize
6
+ public func scaleSize(_ size: CGFloat) -> CGFloat {
7
+ if UseFontScaleSystem {
8
+ let deviceWidth = UIScreen.main.bounds.width
9
+ let deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE
10
10
 
11
- let defaultFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
12
- let scaledFont = UIFontMetrics.default.scaledFont(for: defaultFont)
13
- let fontScale = scaledFont.pointSize / defaultFont.pointSize
11
+ let defaultFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
12
+ let scaledFont = UIFontMetrics.default.scaledFont(for: defaultFont)
13
+ let fontScale = scaledFont.pointSize / defaultFont.pointSize
14
14
 
15
- var fontSizeDeviceScale = size
16
- var fontSizeOSScale = size
15
+ let maxSize = size * MAX_FONT_SCALE
16
+ let fontSizeScaleDevice = deviceScale > 1 ? deviceScale * size : size
17
+ let fontSizeScaleOS = fontScale > 1 ? fontScale * size : size
17
18
 
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)
19
+ return min(max(fontSizeScaleDevice, fontSizeScaleOS), maxSize)
25
20
  }
26
21
 
27
- return max(fontSizeDeviceScale, fontSizeOSScale)
22
+ return size
28
23
  }
29
24
 
30
25
  public enum TypographyStyle {