@momo-kits/native-kits 0.157.5-debug → 0.158.1-beta.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 (139) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/.claude/skills/design-system/SKILL.md +88 -0
  3. package/.claude/skills/design-system/references/components/avatar.md +134 -0
  4. package/.claude/skills/design-system/references/components/badge.md +127 -0
  5. package/.claude/skills/design-system/references/components/bottom-tab.md +177 -0
  6. package/.claude/skills/design-system/references/components/bottomsheet.md +170 -0
  7. package/.claude/skills/design-system/references/components/button.md +206 -0
  8. package/.claude/skills/design-system/references/components/carousel.md +117 -0
  9. package/.claude/skills/design-system/references/components/checkbox.md +98 -0
  10. package/.claude/skills/design-system/references/components/chip.md +146 -0
  11. package/.claude/skills/design-system/references/components/collapse.md +120 -0
  12. package/.claude/skills/design-system/references/components/date-picker.md +119 -0
  13. package/.claude/skills/design-system/references/components/divider.md +84 -0
  14. package/.claude/skills/design-system/references/components/icon.md +130 -0
  15. package/.claude/skills/design-system/references/components/image.md +81 -0
  16. package/.claude/skills/design-system/references/components/information.md +107 -0
  17. package/.claude/skills/design-system/references/components/input-dropdown.md +138 -0
  18. package/.claude/skills/design-system/references/components/input-money.md +157 -0
  19. package/.claude/skills/design-system/references/components/input-otp.md +132 -0
  20. package/.claude/skills/design-system/references/components/input-phone-number.md +140 -0
  21. package/.claude/skills/design-system/references/components/input-search.md +124 -0
  22. package/.claude/skills/design-system/references/components/input-text-area.md +133 -0
  23. package/.claude/skills/design-system/references/components/input.md +152 -0
  24. package/.claude/skills/design-system/references/components/loader.md +87 -0
  25. package/.claude/skills/design-system/references/components/pagination.md +105 -0
  26. package/.claude/skills/design-system/references/components/popup-notify.md +128 -0
  27. package/.claude/skills/design-system/references/components/progress-info.md +114 -0
  28. package/.claude/skills/design-system/references/components/radio.md +86 -0
  29. package/.claude/skills/design-system/references/components/rating.md +126 -0
  30. package/.claude/skills/design-system/references/components/skeleton.md +120 -0
  31. package/.claude/skills/design-system/references/components/slider.md +141 -0
  32. package/.claude/skills/design-system/references/components/snackbar.md +97 -0
  33. package/.claude/skills/design-system/references/components/stepper.md +100 -0
  34. package/.claude/skills/design-system/references/components/steps.md +91 -0
  35. package/.claude/skills/design-system/references/components/suggest-action.md +95 -0
  36. package/.claude/skills/design-system/references/components/swipe.md +121 -0
  37. package/.claude/skills/design-system/references/components/switch.md +98 -0
  38. package/.claude/skills/design-system/references/components/tab-view.md +120 -0
  39. package/.claude/skills/design-system/references/components/tag.md +118 -0
  40. package/.claude/skills/design-system/references/components/text.md +151 -0
  41. package/.claude/skills/design-system/references/components/toast.md +99 -0
  42. package/.claude/skills/design-system/references/components/tooltip.md +138 -0
  43. package/.claude/skills/design-system/references/components/top-nav-miniapp.md +94 -0
  44. package/.claude/skills/design-system/references/components/top-nav.md +226 -0
  45. package/.claude/skills/design-system/references/components/uploader.md +115 -0
  46. package/.claude/skills/design-system/references/navigation/bottom-tab.md +131 -0
  47. package/.claude/skills/design-system/references/navigation/bottomsheet.md +161 -0
  48. package/.claude/skills/design-system/references/navigation/modal.md +133 -0
  49. package/.claude/skills/design-system/references/navigation/navigation-options.md +225 -0
  50. package/.claude/skills/design-system/references/navigation/navigator.md +111 -0
  51. package/.claude/skills/design-system/references/navigation/setup.md +134 -0
  52. package/.claude/skills/design-system/references/navigation/stack.md +128 -0
  53. package/.claude/skills/design-system/references/spec-convention.md +80 -0
  54. package/.claude/skills/design-system/references/tokens/colors.md +131 -0
  55. package/.claude/skills/design-system/references/tokens/spacing-radius.md +144 -0
  56. package/.claude/skills/design-system/references/tokens/theme.md +125 -0
  57. package/.claude/skills/design-system/references/tokens/typography.md +135 -0
  58. package/.claude/skills/design-system-kits/SKILL.md +102 -0
  59. package/.claude/skills/design-system-kits/references/code-convention.md +118 -0
  60. package/.claude/skills/design-system-kits/references/components/avatar.md +45 -0
  61. package/.claude/skills/design-system-kits/references/components/badge.md +27 -0
  62. package/.claude/skills/design-system-kits/references/components/button.md +65 -0
  63. package/.claude/skills/design-system-kits/references/components/carousel.md +51 -0
  64. package/.claude/skills/design-system-kits/references/components/checkbox.md +39 -0
  65. package/.claude/skills/design-system-kits/references/components/chip.md +54 -0
  66. package/.claude/skills/design-system-kits/references/components/collapse.md +63 -0
  67. package/.claude/skills/design-system-kits/references/components/date-picker.md +36 -0
  68. package/.claude/skills/design-system-kits/references/components/divider.md +21 -0
  69. package/.claude/skills/design-system-kits/references/components/icon.md +382 -0
  70. package/.claude/skills/design-system-kits/references/components/image.md +62 -0
  71. package/.claude/skills/design-system-kits/references/components/information.md +61 -0
  72. package/.claude/skills/design-system-kits/references/components/input-dropdown.md +92 -0
  73. package/.claude/skills/design-system-kits/references/components/input-money.md +128 -0
  74. package/.claude/skills/design-system-kits/references/components/input-otp.md +85 -0
  75. package/.claude/skills/design-system-kits/references/components/input-phone-number.md +96 -0
  76. package/.claude/skills/design-system-kits/references/components/input-search.md +127 -0
  77. package/.claude/skills/design-system-kits/references/components/input-text-area.md +100 -0
  78. package/.claude/skills/design-system-kits/references/components/input.md +126 -0
  79. package/.claude/skills/design-system-kits/references/components/loader.md +41 -0
  80. package/.claude/skills/design-system-kits/references/components/pagination.md +47 -0
  81. package/.claude/skills/design-system-kits/references/components/popup-notify.md +69 -0
  82. package/.claude/skills/design-system-kits/references/components/popup-promotion.md +35 -0
  83. package/.claude/skills/design-system-kits/references/components/progress-info.md +55 -0
  84. package/.claude/skills/design-system-kits/references/components/radio.md +42 -0
  85. package/.claude/skills/design-system-kits/references/components/rating.md +36 -0
  86. package/.claude/skills/design-system-kits/references/components/skeleton.md +25 -0
  87. package/.claude/skills/design-system-kits/references/components/slider.md +53 -0
  88. package/.claude/skills/design-system-kits/references/components/snackbar.md +52 -0
  89. package/.claude/skills/design-system-kits/references/components/stepper.md +46 -0
  90. package/.claude/skills/design-system-kits/references/components/steps.md +57 -0
  91. package/.claude/skills/design-system-kits/references/components/suggest-action.md +44 -0
  92. package/.claude/skills/design-system-kits/references/components/swipe.md +44 -0
  93. package/.claude/skills/design-system-kits/references/components/switch.md +43 -0
  94. package/.claude/skills/design-system-kits/references/components/tab-view.md +56 -0
  95. package/.claude/skills/design-system-kits/references/components/tag.md +50 -0
  96. package/.claude/skills/design-system-kits/references/components/text.md +56 -0
  97. package/.claude/skills/design-system-kits/references/components/toast.md +51 -0
  98. package/.claude/skills/design-system-kits/references/components/tooltip.md +95 -0
  99. package/.claude/skills/design-system-kits/references/components/uploader.md +48 -0
  100. package/.claude/skills/design-system-kits/references/design-spec-structure.md +356 -0
  101. package/.claude/skills/design-system-kits/references/design-spec-to-code.md +596 -0
  102. package/.claude/skills/design-system-kits/references/navigation/bottom-tab.md +155 -0
  103. package/.claude/skills/design-system-kits/references/navigation/bottomsheet.md +94 -0
  104. package/.claude/skills/design-system-kits/references/navigation/modal.md +125 -0
  105. package/.claude/skills/design-system-kits/references/navigation/navigation-options.md +430 -0
  106. package/.claude/skills/design-system-kits/references/navigation/navigator.md +177 -0
  107. package/.claude/skills/design-system-kits/references/navigation/setup.md +94 -0
  108. package/.claude/skills/design-system-kits/references/navigation/stack.md +152 -0
  109. package/.claude/skills/design-system-kits/references/screen-layout-rule.md +125 -0
  110. package/.claude/skills/design-system-kits/references/tokens/colors.md +183 -0
  111. package/.claude/skills/design-system-kits/references/tokens/spacing-radius.md +45 -0
  112. package/.claude/skills/design-system-kits/references/tokens/theme.md +97 -0
  113. package/.claude/skills/design-system-kits/references/tokens/typography.md +105 -0
  114. package/.claude/skills/vibe-design/SKILL.md +306 -0
  115. package/compose/build.gradle.kts +1 -1
  116. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +7 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +2 -2
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +3 -0
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +5 -2
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +2 -11
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +5 -1
  135. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +12 -0
  136. package/gradle.properties +1 -1
  137. package/ios/Popup/PopupPromotion.swift +2 -2
  138. package/local.properties +8 -0
  139. package/package.json +1 -1
@@ -0,0 +1,215 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.animation.core.Animatable
4
+ import androidx.compose.animation.core.tween
5
+ import androidx.compose.foundation.background
6
+ import androidx.compose.foundation.border
7
+ import androidx.compose.foundation.gestures.detectHorizontalDragGestures
8
+ import androidx.compose.foundation.layout.Box
9
+ import androidx.compose.foundation.layout.Column
10
+ import androidx.compose.foundation.layout.Row
11
+ import androidx.compose.foundation.layout.fillMaxHeight
12
+ import androidx.compose.foundation.layout.fillMaxWidth
13
+ import androidx.compose.foundation.layout.height
14
+ import androidx.compose.foundation.layout.offset
15
+ import androidx.compose.foundation.layout.width
16
+ import androidx.compose.foundation.shape.RoundedCornerShape
17
+ import androidx.compose.runtime.Composable
18
+ import androidx.compose.runtime.remember
19
+ import androidx.compose.runtime.rememberCoroutineScope
20
+ import androidx.compose.ui.Alignment
21
+ import androidx.compose.ui.Modifier
22
+ import androidx.compose.ui.draw.clip
23
+ import androidx.compose.ui.graphics.Color
24
+ import androidx.compose.ui.input.pointer.pointerInput
25
+ import androidx.compose.ui.platform.LocalDensity
26
+ import androidx.compose.ui.unit.Dp
27
+ import androidx.compose.ui.unit.IntOffset
28
+ import androidx.compose.ui.unit.dp
29
+ import kotlinx.coroutines.launch
30
+ import vn.momo.kits.application.IsShowBaseLineDebug
31
+ import vn.momo.kits.const.AppTheme
32
+ import vn.momo.kits.const.Colors
33
+ import vn.momo.kits.const.Radius
34
+ import vn.momo.kits.const.Spacing
35
+ import vn.momo.kits.const.Typography
36
+ import vn.momo.kits.modifier.activeOpacityClickable
37
+ import vn.momo.kits.modifier.conditional
38
+ import kotlin.math.roundToInt
39
+
40
+ data class SwipeAction(
41
+ val label: String = "",
42
+ val icon: String = "",
43
+ val onPress: () -> Unit = {},
44
+ val backgroundColor: Color? = null,
45
+ )
46
+
47
+ private val ACTION_WIDTH = 56.dp
48
+
49
+ @Composable
50
+ fun Swipe(
51
+ modifier: Modifier = Modifier,
52
+ leftActions: List<SwipeAction> = emptyList(),
53
+ rightActions: List<SwipeAction> = emptyList(),
54
+ height: Dp = 56.dp,
55
+ itemRadius: Dp = 0.dp,
56
+ onSwipeableOpen: () -> Unit = {},
57
+ onSwipeableClose: () -> Unit = {},
58
+ onSwipeableLeftOpen: () -> Unit = {},
59
+ onSwipeableRightOpen: () -> Unit = {},
60
+ content: @Composable () -> Unit = {},
61
+ ) {
62
+ val theme = AppTheme.current
63
+ val density = LocalDensity.current
64
+ val scope = rememberCoroutineScope()
65
+
66
+ val left = leftActions.take(3)
67
+ val right = rightActions.take(3)
68
+
69
+ val leftWidthPx = with(density) { (ACTION_WIDTH * left.size).toPx() }
70
+ val rightWidthPx = with(density) { (ACTION_WIDTH * right.size).toPx() }
71
+
72
+ val offsetX = remember { Animatable(0f) }
73
+
74
+ val shape = remember(itemRadius) {
75
+ if (itemRadius > 0.dp) RoundedCornerShape(itemRadius) else RoundedCornerShape(0.dp)
76
+ }
77
+
78
+ fun snapToClosest() {
79
+ scope.launch {
80
+ val current = offsetX.value
81
+ val target = when {
82
+ current > leftWidthPx * 0.5f && left.isNotEmpty() -> {
83
+ onSwipeableLeftOpen()
84
+ onSwipeableOpen()
85
+ leftWidthPx
86
+ }
87
+ current < -rightWidthPx * 0.5f && right.isNotEmpty() -> {
88
+ onSwipeableRightOpen()
89
+ onSwipeableOpen()
90
+ -rightWidthPx
91
+ }
92
+ else -> {
93
+ onSwipeableClose()
94
+ 0f
95
+ }
96
+ }
97
+ offsetX.animateTo(target, tween(200))
98
+ }
99
+ }
100
+
101
+ fun close() {
102
+ scope.launch {
103
+ offsetX.animateTo(0f, tween(200))
104
+ onSwipeableClose()
105
+ }
106
+ }
107
+
108
+ Box(
109
+ modifier = modifier
110
+ .fillMaxWidth()
111
+ .height(height)
112
+ .conditional(IsShowBaseLineDebug) { border(1.dp, Colors.blue_03) }
113
+ ) {
114
+ // Left actions
115
+ if (left.isNotEmpty()) {
116
+ Row(
117
+ modifier = Modifier
118
+ .align(Alignment.CenterStart)
119
+ .fillMaxHeight()
120
+ ) {
121
+ left.forEach { action ->
122
+ SwipeActionButton(
123
+ action = action,
124
+ width = ACTION_WIDTH,
125
+ height = height,
126
+ shape = shape,
127
+ defaultColor = theme.colors.primary,
128
+ )
129
+ }
130
+ }
131
+ }
132
+
133
+ // Right actions
134
+ if (right.isNotEmpty()) {
135
+ Row(
136
+ modifier = Modifier
137
+ .align(Alignment.CenterEnd)
138
+ .fillMaxHeight()
139
+ ) {
140
+ right.forEach { action ->
141
+ SwipeActionButton(
142
+ action = action,
143
+ width = ACTION_WIDTH,
144
+ height = height,
145
+ shape = shape,
146
+ defaultColor = theme.colors.error.primary,
147
+ )
148
+ }
149
+ }
150
+ }
151
+
152
+ // Main content
153
+ Box(
154
+ modifier = Modifier
155
+ .fillMaxWidth()
156
+ .height(height)
157
+ .offset { IntOffset(offsetX.value.roundToInt(), 0) }
158
+ .clip(shape)
159
+ .background(theme.colors.background.surface)
160
+ .pointerInput(left.size, right.size) {
161
+ detectHorizontalDragGestures(
162
+ onDragEnd = { snapToClosest() },
163
+ onDragCancel = { snapToClosest() },
164
+ ) { _, dragAmount ->
165
+ scope.launch {
166
+ val newOffset = offsetX.value + dragAmount
167
+ val clamped = newOffset.coerceIn(-rightWidthPx, leftWidthPx)
168
+ offsetX.snapTo(clamped)
169
+ }
170
+ }
171
+ }
172
+ ) {
173
+ content()
174
+ }
175
+ }
176
+ }
177
+
178
+ @Composable
179
+ private fun SwipeActionButton(
180
+ action: SwipeAction,
181
+ width: Dp,
182
+ height: Dp,
183
+ shape: RoundedCornerShape,
184
+ defaultColor: Color,
185
+ ) {
186
+ val bgColor = action.backgroundColor ?: defaultColor
187
+
188
+ Box(
189
+ modifier = Modifier
190
+ .width(width)
191
+ .height(height)
192
+ .clip(shape)
193
+ .background(bgColor)
194
+ .activeOpacityClickable(onClick = action.onPress),
195
+ contentAlignment = Alignment.Center,
196
+ ) {
197
+ Column(horizontalAlignment = Alignment.CenterHorizontally) {
198
+ if (action.icon.isNotEmpty()) {
199
+ Icon(
200
+ source = action.icon,
201
+ size = 20.dp,
202
+ color = Colors.black_01,
203
+ )
204
+ }
205
+ if (action.label.isNotEmpty()) {
206
+ Text(
207
+ text = action.label,
208
+ style = Typography.labelSMedium,
209
+ color = Colors.black_01,
210
+ maxLines = 1,
211
+ )
212
+ }
213
+ }
214
+ }
215
+ }