@momo-kits/native-kits 0.89.32-nav.2 → 0.89.33-beta.20

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.
@@ -61,8 +61,6 @@ kotlin {
61
61
 
62
62
  publishing {
63
63
  repositories {
64
- google()
65
- mavenCentral()
66
64
  maven {
67
65
  group = libGroup
68
66
  version = libVersion
@@ -32,7 +32,6 @@ import androidx.compose.ui.graphics.Color
32
32
  import androidx.compose.ui.graphics.graphicsLayer
33
33
  import androidx.compose.ui.layout.ContentScale
34
34
  import androidx.compose.ui.platform.LocalDensity
35
- import androidx.compose.ui.semantics.contentDescription
36
35
  import androidx.compose.ui.semantics.semantics
37
36
  import androidx.compose.ui.semantics.testTag
38
37
  import androidx.compose.ui.text.style.TextAlign
@@ -51,7 +50,6 @@ import vn.momo.kits.const.AppTheme
51
50
  import vn.momo.kits.const.Colors
52
51
  import vn.momo.kits.const.Spacing
53
52
  import vn.momo.kits.const.Typography
54
- import vn.momo.kits.modifier.shadow
55
53
  import vn.momo.kits.platform.getStatusBarHeight
56
54
  import vn.momo.kits.utils.bottomBorder
57
55
 
@@ -68,7 +66,6 @@ data class AnimatedHeader(
68
66
  @Composable
69
67
  fun HeaderBackground(
70
68
  headerType: HeaderType = HeaderType.DEFAULT,
71
- useShadow: Boolean? = true,
72
69
  scrollState: Int
73
70
  ) {
74
71
  val statusBarHeight = AppStatusBar.current ?: getStatusBarHeight()
@@ -90,6 +87,7 @@ fun HeaderBackground(
90
87
  modifier = Modifier
91
88
  .height(height)
92
89
  .fillMaxWidth()
90
+ .alpha(opacityAni)
93
91
  .background(
94
92
  Brush.linearGradient(
95
93
  colors = listOf(
@@ -121,8 +119,8 @@ fun HeaderBackground(
121
119
  .background(
122
120
  Brush.linearGradient(
123
121
  colors = listOf(
124
- Color(0xFFFDCACE),
125
- Color(0x00FDCACE)
122
+ Color(0xFFFDCADE),
123
+ Color(0x00FDCADE)
126
124
  ),
127
125
  start = Offset(0f, 0f),
128
126
  end = Offset(0f, with(LocalDensity.current) { 154.dp.toPx() })
@@ -139,23 +137,13 @@ fun HeaderBackground(
139
137
  )
140
138
  }
141
139
  }
142
- Box(
143
- modifier = Modifier.fillMaxWidth().height(statusBarHeight + 52.dp)
144
- .alpha(1 - opacityAni)
145
- .background(Colors.black_01)
146
- .then(
147
- if (useShadow == true) Modifier.shadow() else Modifier.bottomBorder(
148
- 1.dp,
149
- Colors.black_04
150
- )
151
- )
152
- )
153
140
  }
154
141
 
155
142
  else -> {
156
143
  Box(modifier = Modifier.fillMaxWidth())
157
144
  }
158
145
  }
146
+
159
147
  }
160
148
 
161
149
  @Composable
@@ -163,12 +151,10 @@ fun Header(
163
151
  headerType: HeaderType = HeaderType.DEFAULT,
164
152
  titlePosition: TitlePosition,
165
153
  title: String,
166
- isBack: Boolean,
167
154
  headerRight: @Composable (() -> Unit)? = null,
168
- goBack: (() -> Unit) = { },
155
+ goBack: (() -> Unit)? = null,
169
156
  opacity: Float? = null,
170
157
  animatedHeader: AnimatedHeader? = null,
171
- useSearchInput: Boolean? = false,
172
158
  scrollState: Int = 0,
173
159
  inputSearchProps: InputSearchProps?
174
160
  ) {
@@ -185,14 +171,6 @@ fun Header(
185
171
  .collect { fraction -> colorFraction = fraction }
186
172
  }
187
173
 
188
- val tintIconColorAnim by animateColorAsState(
189
- targetValue = animateColor(
190
- Colors.black_01,
191
- AppTheme.current.colors.text.default,
192
- colorFraction
193
- )
194
- )
195
-
196
174
  val backgroundSearch by animateColorAsState(
197
175
  targetValue = animateColor(
198
176
  Colors.black_01,
@@ -216,7 +194,7 @@ fun Header(
216
194
  horizontalArrangement = Arrangement.SpaceBetween
217
195
  ) {
218
196
  Box {
219
- if (isBack) {
197
+ if (goBack != null) {
220
198
  Box(
221
199
  modifier = Modifier
222
200
  .size(28.dp)
@@ -242,18 +220,17 @@ fun Header(
242
220
  ) {
243
221
  Icon(
244
222
  source = "arrow-back",
245
- color = if (animatedHeader !== null) tintIconColorAnim else tintIconColor,
223
+ color = Colors.black_20,
246
224
  size = 20.dp,
247
225
  )
248
226
  }
249
227
  }
250
228
  }
251
- if (useSearchInput == false) {
252
- Box(Modifier.graphicsLayer {
253
- alpha = if (animatedHeader !== null) opacity ?: 1f else 1f
254
- }) {
255
- headerRight?.invoke()
256
- }
229
+
230
+ Box(Modifier.graphicsLayer {
231
+ alpha = if (animatedHeader !== null) opacity ?: 1f else 1f
232
+ }) {
233
+ headerRight?.invoke()
257
234
  }
258
235
  }
259
236
 
@@ -264,13 +241,12 @@ fun Header(
264
241
  .padding(horizontal = Spacing.M),
265
242
  verticalAlignment = Alignment.CenterVertically,
266
243
  ) {
267
- if (isBack) {
244
+ if (goBack != null && titlePosition == TitlePosition.LEFT) {
268
245
  Spacer(Modifier.width(40.dp))
269
246
  }
270
- if (useSearchInput == true && inputSearchProps != null) {
247
+ if (inputSearchProps != null) {
271
248
  InputSearch(inputSearchProps = inputSearchProps.copy(backgroundColor = backgroundSearch))
272
- }
273
- else{
249
+ } else{
274
250
  Box(
275
251
  Modifier.weight(1f).graphicsLayer {
276
252
  alpha = if (animatedHeader !== null) opacity ?: 1f else 1f
@@ -279,9 +255,8 @@ fun Header(
279
255
  ) {
280
256
  HeaderTitle(
281
257
  title = title,
282
- color = if (animatedHeader !== null) tintIconColorAnim else tintIconColor,
258
+ color = tintIconColor,
283
259
  modifier = Modifier.semantics {
284
- contentDescription = title
285
260
  testTag = "title_navigation_header"
286
261
  }
287
262
  )
@@ -303,7 +278,7 @@ fun HeaderTitle(
303
278
  modifier = Modifier.then(modifier).zIndex(1f),
304
279
  text = title,
305
280
  textAlign = textAlign,
306
- style = Typography.headerDefault,
281
+ style = Typography.actionS,
307
282
  color = color,
308
283
  maxLines = 1
309
284
  )
@@ -56,7 +56,7 @@ fun Screen(
56
56
  horizontalAlignment: Alignment.Horizontal = Alignment.Start,
57
57
  title: String = "Stack",
58
58
  titlePosition: TitlePosition = TitlePosition.LEFT,
59
- goBack: (() -> Unit) = { },
59
+ goBack: (() -> Unit)? = null,
60
60
  scrollable: Boolean = true,
61
61
  scrollState: ScrollState = rememberScrollState(),
62
62
  onContentLayout: ((LayoutCoordinates) -> Unit)? = null,
@@ -66,8 +66,6 @@ fun Screen(
66
66
  fabProps: FabProps? = null,
67
67
  animatedHeader: AnimatedHeader? = null,
68
68
  layoutOffset: Dp = 56.dp,
69
- useShadow: Boolean? = true,
70
- useSearchInput: Boolean? = false,
71
69
  inputSearchProps: InputSearchProps? = null,
72
70
  content: @Composable () -> Unit,
73
71
  ) {
@@ -100,13 +98,12 @@ fun Screen(
100
98
  HeaderBackground(headerType = headerType, scrollState = scrollState.value)
101
99
  } else {
102
100
  Box(
103
- Modifier.zIndex(5f)
101
+ Modifier.zIndex(2f)
104
102
  .background(Color.White.copy(alpha = opacity))
105
103
  .graphicsLayer { alpha = opacity }
106
104
  ) {
107
105
  HeaderBackground(
108
106
  headerType = headerType,
109
- useShadow = useShadow,
110
107
  scrollState = scrollState.value
111
108
  )
112
109
  }
@@ -117,11 +114,9 @@ fun Screen(
117
114
  title = title,
118
115
  titlePosition = titlePosition,
119
116
  headerRight = headerRight,
120
- isBack = isBack,
121
117
  goBack = goBack,
122
118
  opacity = opacity,
123
119
  animatedHeader = animatedHeader,
124
- useSearchInput = useSearchInput,
125
120
  inputSearchProps = inputSearchProps,
126
121
  scrollState = scrollState.value
127
122
  )
@@ -18,9 +18,6 @@ import androidx.compose.ui.Alignment
18
18
  import androidx.compose.ui.Modifier
19
19
  import androidx.compose.ui.draw.clip
20
20
  import androidx.compose.ui.graphics.Color
21
- import androidx.compose.ui.semantics.contentDescription
22
- import androidx.compose.ui.semantics.semantics
23
- import androidx.compose.ui.semantics.testTag
24
21
  import androidx.compose.ui.text.TextStyle
25
22
  import androidx.compose.ui.text.style.TextOverflow
26
23
  import androidx.compose.ui.unit.Dp
@@ -236,7 +233,6 @@ fun Button(
236
233
  isFull: Boolean = true,
237
234
  modifier: Modifier = Modifier,
238
235
  ) {
239
- val testId = "btn_${type.toString().lowercase()}_$title"
240
236
  val customModifier = if (isFull) {
241
237
  modifier
242
238
  .fillMaxWidth()
@@ -258,10 +254,7 @@ fun Button(
258
254
  .padding(horizontal = size.value.padding)
259
255
  .defaultMinSize(
260
256
  minWidth = size.value.width
261
- ).height(size.value.height)
262
- .semantics {
263
- contentDescription = title; testTag = testId
264
- },
257
+ ).height(size.value.height),
265
258
  horizontalArrangement = Arrangement.Center,
266
259
  verticalAlignment = Alignment.CenterVertically,
267
260
  ) {
@@ -1,13 +1,17 @@
1
1
  package vn.momo.kits.components
2
2
 
3
+ import androidx.compose.foundation.layout.Box
3
4
  import androidx.compose.foundation.layout.size
4
5
  import androidx.compose.runtime.Composable
5
6
  import androidx.compose.ui.Modifier
6
7
  import androidx.compose.ui.graphics.Color
7
8
  import androidx.compose.ui.graphics.ColorFilter
8
9
  import androidx.compose.ui.layout.ContentScale
10
+ import androidx.compose.ui.semantics.contentDescription
11
+ import androidx.compose.ui.semantics.semantics
9
12
  import androidx.compose.ui.unit.Dp
10
13
  import androidx.compose.ui.unit.dp
14
+ import coil3.compose.AsyncImage
11
15
  import vn.momo.kits.const.AppTheme
12
16
  import vn.momo.kits.utils.Icons
13
17
 
@@ -23,14 +27,14 @@ fun Icon(
23
27
  } else {
24
28
  Icons[source] ?: ""
25
29
  }
26
- Image(
27
- modifier = modifier.size(size),
28
- source = icon,
29
- loading = false,
30
- options = Options(
30
+ Box(modifier = modifier.size(size).semantics {contentDescription = "img|$icon"}) {
31
+ AsyncImage(
32
+ modifier = Modifier.matchParentSize(),
33
+ model = icon,
34
+ contentDescription = null,
31
35
  contentScale = ContentScale.Fit,
32
- colorFilter = color?.let { ColorFilter.tint(it) }
33
- ),
34
- )
36
+ colorFilter = color?.let { ColorFilter.tint(it) },
37
+ )
38
+ }
35
39
  }
36
40
 
@@ -14,7 +14,6 @@ import androidx.compose.ui.graphics.painter.Painter
14
14
  import androidx.compose.ui.layout.ContentScale
15
15
  import androidx.compose.ui.semantics.contentDescription
16
16
  import androidx.compose.ui.semantics.semantics
17
- import androidx.compose.ui.semantics.testTag
18
17
  import coil3.compose.AsyncImage
19
18
  import vn.momo.kits.const.AppTheme
20
19
 
@@ -48,9 +47,9 @@ fun Image(
48
47
  )
49
48
  }
50
49
 
51
- Box(modifier = modifier) {
50
+ Box(modifier = modifier.semantics {contentDescription = "img|$source"}) {
52
51
  AsyncImage(
53
- modifier = Modifier.matchParentSize().semantics {contentDescription = "img|$source"; testTag = "img|$source"},
52
+ modifier = Modifier.matchParentSize(),
54
53
  model = source,
55
54
  contentDescription = null,
56
55
  contentScale = imageOptions.contentScale,
@@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.size
15
15
  import androidx.compose.foundation.layout.width
16
16
  import androidx.compose.foundation.shape.RoundedCornerShape
17
17
  import androidx.compose.foundation.text.BasicTextField
18
+ import androidx.compose.foundation.text.KeyboardActions
18
19
  import androidx.compose.foundation.text.KeyboardOptions
19
20
  import androidx.compose.material3.CircularProgressIndicator
20
21
  import androidx.compose.runtime.Composable
@@ -90,6 +91,9 @@ data class InputSearchProps(
90
91
  val fontWeight: InputFontWeight = InputFontWeight.REGULAR,
91
92
  val keyboardType: KeyboardType = KeyboardType.Text,
92
93
  val backgroundColor: Color = Colors.black_01,
94
+ val keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
95
+ val keyboardActions: KeyboardActions = KeyboardActions.Default,
96
+ val modifier: Modifier = Modifier
93
97
  )
94
98
 
95
99
  @Composable
@@ -98,7 +102,7 @@ fun InputSearch(
98
102
  text = remember { mutableStateOf("") },
99
103
  iconColor = AppTheme.current.colors.text.default
100
104
  ),
101
-
105
+ clearCondition: (() -> Boolean)? = null
102
106
  ) {
103
107
  var isFocused by remember { mutableStateOf(false) }
104
108
  var isBlurred = false
@@ -124,7 +128,8 @@ fun InputSearch(
124
128
  lineHeight = 20.sp,
125
129
  fontWeight = inputSearchProps.fontWeight.value
126
130
  ),
127
- keyboardOptions = KeyboardOptions.Default.copy(keyboardType = inputSearchProps.keyboardType),
131
+ keyboardOptions = inputSearchProps.keyboardOptions.copy(keyboardType = inputSearchProps.keyboardType),
132
+ keyboardActions = inputSearchProps.keyboardActions,
128
133
  modifier = Modifier.height(36.dp).onFocusChanged {
129
134
  isFocused = it.isFocused
130
135
  if (it.isFocused) {
@@ -137,7 +142,7 @@ fun InputSearch(
137
142
  decorationBox = { innerTextField ->
138
143
  Row(verticalAlignment = Alignment.CenterVertically) {
139
144
  Row(
140
- modifier = Modifier.weight(inputSearchProps.showButtonText.ifTrue(8f, 1f))
145
+ modifier = inputSearchProps.modifier.weight(inputSearchProps.showButtonText.ifTrue(8f, 1f))
141
146
  .background(
142
147
  inputSearchProps.backgroundColor,
143
148
  RoundedCornerShape(Radius.XL)
@@ -152,7 +157,6 @@ fun InputSearch(
152
157
  ),
153
158
  verticalAlignment = Alignment.CenterVertically
154
159
  ) {
155
- //leading icon
156
160
  Icon(
157
161
  source = "navigation_search",
158
162
  modifier = Modifier.padding(end = Spacing.XS),
@@ -188,12 +192,14 @@ fun InputSearch(
188
192
  )
189
193
  }
190
194
  }
191
- RenderRightIconSearch(
192
- inputSearchProps.loading,
193
- inputSearchProps.icon,
194
- iconTintColor,
195
- inputSearchProps.onRightIconPressed
196
- )
195
+ if (clearCondition?.invoke() == true) {
196
+ RenderRightIconSearch(
197
+ inputSearchProps.loading,
198
+ inputSearchProps.icon,
199
+ iconTintColor,
200
+ inputSearchProps.onRightIconPressed
201
+ )
202
+ }
197
203
  }
198
204
  }
199
205
  if (inputSearchProps.showButtonText) {
@@ -27,7 +27,6 @@ import androidx.compose.runtime.setValue
27
27
  import androidx.compose.ui.Alignment
28
28
  import androidx.compose.ui.Modifier
29
29
  import androidx.compose.ui.draw.clip
30
- import androidx.compose.ui.semantics.contentDescription
31
30
  import androidx.compose.ui.semantics.semantics
32
31
  import androidx.compose.ui.semantics.testTag
33
32
  import androidx.compose.ui.text.TextLayoutResult
@@ -97,7 +96,7 @@ fun PopupNotify(
97
96
  }
98
97
 
99
98
  Box(Modifier.semantics {
100
- contentDescription = title; testTag = "popup_notify"
99
+ testTag = "popup_notify"
101
100
  }, contentAlignment = Alignment.TopEnd) {
102
101
  Column(
103
102
  modifier = Modifier
@@ -235,7 +234,7 @@ fun renderRow(
235
234
  title = it.title,
236
235
  type = ButtonType.TEXT,
237
236
  modifier = Modifier.semantics {
238
- contentDescription = it.title; testTag = "btn_popup_cancel"
237
+ testTag = "btn_popup_cancel"
239
238
  }
240
239
  )
241
240
  }
@@ -250,7 +249,7 @@ fun renderRow(
250
249
  },
251
250
  title = primary?.title ?: "",
252
251
  modifier = Modifier.semantics {
253
- contentDescription = primary?.title ?: ""; testTag = "btn_popup_allow"
252
+ testTag = "btn_popup_allow"
254
253
  }
255
254
  )
256
255
  }
@@ -273,7 +272,7 @@ fun renderColumn(
273
272
  },
274
273
  title = primary?.title ?: "",
275
274
  modifier = Modifier.semantics {
276
- contentDescription = primary?.title ?: ""; testTag = "btn_popup_allow"
275
+ testTag = "btn_popup_allow"
277
276
  }
278
277
  )
279
278
  secondary?.let {
@@ -288,7 +287,7 @@ fun renderColumn(
288
287
  title = it.title,
289
288
  type = ButtonType.TEXT,
290
289
  modifier = Modifier.semantics {
291
- contentDescription = it.title; testTag = "btn_popup_cancel"
290
+ testTag = "btn_popup_cancel"
292
291
  }
293
292
  )
294
293
  }
@@ -3,6 +3,8 @@ package vn.momo.kits.components
3
3
  import androidx.compose.runtime.Composable
4
4
  import androidx.compose.ui.Modifier
5
5
  import androidx.compose.ui.graphics.Color
6
+ import androidx.compose.ui.semantics.contentDescription
7
+ import androidx.compose.ui.semantics.semantics
6
8
  import androidx.compose.ui.text.TextLayoutResult
7
9
  import androidx.compose.ui.text.TextStyle
8
10
  import androidx.compose.ui.text.style.TextAlign
@@ -31,7 +33,7 @@ fun Text(
31
33
  val font = getFontFamily(fontFamily, style.fontWeight)
32
34
 
33
35
  androidx.compose.material3.Text(
34
- modifier = modifier,
36
+ modifier = modifier.semantics { contentDescription = text },
35
37
  text = text,
36
38
  color = color ?: AppTheme.current.colors.text.default,
37
39
  style = style,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momo-kits/native-kits",
3
- "version": "0.89.32-nav.2",
3
+ "version": "0.89.33-beta.20",
4
4
  "private": false,
5
5
  "dependencies": {},
6
6
  "devDependencies": {},