@momo-kits/native-kits 0.157.5 → 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 (246) 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/build.gradle.kts +11 -0
  116. package/compose/build.gradle.kts +180 -0
  117. package/compose/build.gradle.kts.backup +180 -0
  118. package/compose/compose.podspec +54 -0
  119. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +117 -0
  120. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  121. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  122. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  123. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  124. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  125. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  126. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  127. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  128. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  129. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  130. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  131. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  132. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  133. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +57 -0
  135. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +107 -0
  136. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +201 -0
  137. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +222 -0
  138. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +48 -0
  139. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  140. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  141. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  142. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +305 -0
  143. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  144. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +720 -0
  145. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +121 -0
  146. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +405 -0
  147. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  148. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  149. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +85 -0
  150. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  151. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +340 -0
  152. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +198 -0
  153. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +357 -0
  154. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
  155. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +94 -0
  156. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +136 -0
  157. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
  158. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +543 -0
  159. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
  160. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
  161. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +148 -0
  162. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +188 -0
  163. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +116 -0
  164. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +448 -0
  165. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +172 -0
  166. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +255 -0
  167. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +231 -0
  168. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +233 -0
  169. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +254 -0
  170. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +241 -0
  171. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +364 -0
  172. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  173. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  174. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  175. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +92 -0
  176. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  177. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +352 -0
  178. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +103 -0
  179. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
  180. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +70 -0
  181. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  182. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +17 -0
  183. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +96 -0
  184. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
  185. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
  186. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
  187. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
  188. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
  189. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +96 -0
  190. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
  191. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +92 -0
  192. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +130 -0
  193. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +214 -0
  194. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +590 -0
  195. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +177 -0
  196. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
  197. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +205 -0
  198. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  199. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +239 -0
  200. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +191 -0
  201. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +306 -0
  202. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  203. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
  204. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
  205. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +285 -0
  206. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
  207. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +35 -0
  208. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
  209. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +50 -0
  210. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +68 -0
  211. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  212. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +14 -0
  213. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
  214. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  215. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +239 -0
  216. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +119 -0
  217. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +98 -0
  218. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +161 -0
  219. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +331 -0
  220. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +497 -0
  221. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +162 -0
  222. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +243 -0
  223. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  224. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +187 -0
  225. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +279 -0
  226. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +80 -0
  227. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +306 -0
  228. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +32 -0
  229. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +370 -0
  230. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +132 -0
  231. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +46 -0
  232. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  233. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +62 -0
  234. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  235. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +88 -0
  236. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +161 -0
  237. package/gradle/libs.versions.toml +57 -0
  238. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  239. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  240. package/gradle.properties +26 -0
  241. package/gradlew +252 -0
  242. package/gradlew.bat +94 -0
  243. package/ios/Popup/PopupPromotion.swift +2 -2
  244. package/local.properties +8 -0
  245. package/package.json +1 -1
  246. package/settings.gradle.kts +52 -0
@@ -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
+ }
@@ -0,0 +1,96 @@
1
+ package vn.momo.kits.components
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.clickable
6
+ import androidx.compose.foundation.layout.Box
7
+ import androidx.compose.foundation.layout.height
8
+ import androidx.compose.foundation.layout.padding
9
+ import androidx.compose.foundation.layout.size
10
+ import androidx.compose.foundation.layout.width
11
+ import androidx.compose.foundation.shape.RoundedCornerShape
12
+ import androidx.compose.runtime.Composable
13
+ import androidx.compose.runtime.remember
14
+ import androidx.compose.ui.Alignment
15
+ import androidx.compose.ui.Modifier
16
+ import androidx.compose.ui.draw.clip
17
+ import androidx.compose.ui.graphics.Color
18
+ import androidx.compose.ui.unit.dp
19
+ import vn.momo.kits.application.IsShowBaseLineDebug
20
+ import vn.momo.kits.const.Colors
21
+ import vn.momo.kits.const.Spacing
22
+ import vn.momo.kits.modifier.conditional
23
+ import vn.momo.kits.modifier.setAutomationId
24
+
25
+ // Pre-computed shapes to avoid repeated creation
26
+ private val switchShape = RoundedCornerShape(20.dp)
27
+ private val circleShape = RoundedCornerShape(percent = 100)
28
+
29
+ @Composable
30
+ fun Switch(
31
+ value: Boolean = false,
32
+ onChange: (Boolean) -> Unit = {},
33
+ disabled: Boolean = false,
34
+ title: String? = "",
35
+ accessibilityId: String? = ""
36
+ ) {
37
+ // Memoize color calculations to avoid repeated conditional logic
38
+ val colors = remember(value, disabled) {
39
+ val circleColor = if (value) Colors.black_01 else Colors.black_03
40
+ val bgColor = when {
41
+ disabled && value -> Colors.green_09
42
+ disabled && !value -> Colors.black_05
43
+ value -> Colors.green_03
44
+ else -> Colors.black_07
45
+ }
46
+ circleColor to bgColor
47
+ }
48
+
49
+ val (circleBackgroundColor, backgroundColor) = colors
50
+
51
+ // Memoize automation ID to avoid string concatenation on every render
52
+ val automationIdValue = remember(accessibilityId, title, value) {
53
+ accessibilityId ?: "toggle_${title ?: "unknown"}_$value"
54
+ }
55
+
56
+ // Memoize alignment calculation
57
+ val contentAlignment = remember(value) {
58
+ if (value) Alignment.CenterEnd else Alignment.CenterStart
59
+ }
60
+
61
+ // Memoize click handler to avoid lambda recreation
62
+ val onClickHandler = remember(onChange, value) {
63
+ { onChange(!value) }
64
+ }
65
+
66
+ Box(modifier = Modifier.setAutomationId(automationIdValue)) {
67
+ Box(
68
+ modifier = Modifier
69
+ .width(38.dp)
70
+ .height(20.dp)
71
+ .border(0.dp, Color.Unspecified, switchShape)
72
+ .background(backgroundColor, switchShape)
73
+ .conditional(IsShowBaseLineDebug) {
74
+ border(1.dp, Colors.blue_03)
75
+ }
76
+ .clip(switchShape)
77
+ .clickable(enabled = !disabled, onClick = onClickHandler)
78
+ .padding(horizontal = Spacing.XS),
79
+ contentAlignment = contentAlignment
80
+ ) {
81
+ Box(
82
+ modifier = Modifier
83
+ .size(14.dp)
84
+ .border(0.dp, Color.Unspecified, circleShape)
85
+ .background(circleBackgroundColor, circleShape),
86
+ contentAlignment = Alignment.Center
87
+ ) {
88
+ Box(
89
+ Modifier
90
+ .size(6.dp)
91
+ .background(backgroundColor, circleShape)
92
+ )
93
+ }
94
+ }
95
+ }
96
+ }