@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,43 @@
1
+ # Switch
2
+
3
+ ## React Native
4
+
5
+ ```tsx
6
+ import { Switch } from '@momo-kits/foundation';
7
+
8
+ <Switch
9
+ value={enabled} // current toggle state (default: false)
10
+ onChange={(enabled) => setEnabled(enabled)} // called with new boolean value
11
+ disabled={false} // disable the switch (default: false)
12
+ style={{}} // optional custom styles
13
+ accessibilityLabel="toggle_notifications" // accessibility label
14
+ params={{ field: 'notifications' }} // auto tracking params
15
+ />
16
+ ```
17
+
18
+ ## Compose
19
+
20
+ ```kotlin
21
+ import vn.momo.kits.components.Switch
22
+
23
+ Switch(
24
+ value = isEnabled, // current toggle state (default: false)
25
+ onChange = { enabled -> }, // called with new boolean value
26
+ disabled = false, // disable the switch (default: false)
27
+ title = "Notifications", // optional label text
28
+ accessibilityId = "toggle_notifications", // automation ID
29
+ modifier = Modifier, // optional modifier
30
+ )
31
+ ```
32
+
33
+ Same API naming on both platforms (`value`, `onChange`). Compose adds `title` and `accessibilityId`.
34
+
35
+ ## Key Differences
36
+
37
+ | Feature | React Native | Compose |
38
+ |---------|-------------|---------|
39
+ | Value prop | `value` | `value` |
40
+ | Change handler | `onChange` | `onChange` |
41
+ | Label | Not built-in (wrap in `Text`) | `title` param |
42
+ | Automation ID | `accessibilityLabel` | `accessibilityId` |
43
+ | Modifier/Style | `style` prop | `modifier` param |
@@ -0,0 +1,56 @@
1
+ # TabView
2
+
3
+ ## React Native
4
+
5
+ ```tsx
6
+ import { TabView } from '@momo-kits/tab-view';
7
+
8
+ <TabView
9
+ tabs={[
10
+ { title: 'Tab 1', component: <Tab1 /> },
11
+ { title: 'Tab 2', icon: '24_info', badgeValue: 3 },
12
+ ]}
13
+ scrollable={false}
14
+ type="default"
15
+ initialPage={0}
16
+ onPressTabItem={(index) => {}}
17
+ direction="row"
18
+ fitContent={false}
19
+ />
20
+ ```
21
+
22
+ ## Compose
23
+
24
+ ```kotlin
25
+ import vn.momo.kits.components.TabView
26
+ import vn.momo.kits.components.TabViewItem
27
+ import vn.momo.kits.components.TabViewType
28
+ import vn.momo.kits.components.TabViewDirection
29
+
30
+ TabView(
31
+ tabs = listOf(
32
+ TabViewItem(title = "Tab 1", content = { Text("Content 1") }),
33
+ TabViewItem(title = "Tab 2", icon = "24_info", badgeValue = "3", content = { Text("Content 2") }),
34
+ ),
35
+ initialPage = 0,
36
+ type = TabViewType.DEFAULT, // DEFAULT | CARD
37
+ scrollable = false,
38
+ fitContent = false,
39
+ selectedColor = null,
40
+ unselectedColor = null,
41
+ direction = TabViewDirection.ROW, // ROW | COLUMN
42
+ userScrollEnabled = true,
43
+ onPressTabItem = { index -> },
44
+ onPageSelected = { index -> },
45
+ )
46
+ ```
47
+
48
+ ## Key Differences
49
+
50
+ | Feature | React Native | Compose |
51
+ |---------|-------------|---------|
52
+ | Content | `component` prop | `content` slot |
53
+ | Lazy rendering | Built-in | `mutableStateListOf` tracks visited pages |
54
+ | Indicator animation | Native | `animateDpAsState` (200ms) |
55
+ | Direction | `string` | `TabViewDirection` enum |
56
+ | Type | `string` | `TabViewType` enum |
@@ -0,0 +1,50 @@
1
+ # Tag
2
+
3
+ ## React Native
4
+
5
+ ```tsx
6
+ import { Tag } from '@momo-kits/foundation';
7
+
8
+ <Tag
9
+ label="Active"
10
+ size="large" // 'medium'|'large' (default: 'large')
11
+ color="green" // 'default'|'orange'|'green'|'red'|'blue'|'grey'
12
+ icon="icon_name" // optional left icon
13
+ customColor={Colors.pink_03} // overrides color (use _03 tint recommended)
14
+ accessibilityLabel="tag_active"
15
+ style={{ marginRight: Spacing.S }} // optional custom style
16
+ />
17
+ ```
18
+
19
+ ## Compose
20
+
21
+ ```kotlin
22
+ import vn.momo.kits.components.Tag
23
+ import vn.momo.kits.components.TagSize
24
+ import vn.momo.kits.components.TagColor
25
+
26
+ Tag(
27
+ label = "Active",
28
+ size = TagSize.Medium, // Large(24f), Medium(18f)
29
+ color = TagColor.Green, // Default, Orange, Green, Red, Blue, Grey
30
+ customColor = Colors.pink_03, // overrides color when provided
31
+ )
32
+ ```
33
+
34
+ ### TagSize (Compose)
35
+
36
+ | Value | Height |
37
+ |-------|--------|
38
+ | `Large` | 24f |
39
+ | `Medium` | 18f |
40
+
41
+ ### TagColor (Compose)
42
+
43
+ | Value | Background | Text |
44
+ |-------|-----------|------|
45
+ | `Default` | black_04 | black_17 |
46
+ | `Orange` | orange_08 | orange_03 |
47
+ | `Green` | green_08 | green_03 |
48
+ | `Red` | red_08 | red_03 |
49
+ | `Blue` | blue_08 | blue_03 |
50
+ | `Grey` | black_04 | black_12 |
@@ -0,0 +1,56 @@
1
+ # Text
2
+
3
+ ## React Native
4
+
5
+ ```tsx
6
+ import { Text } from '@momo-kits/foundation';
7
+
8
+ <Text typography="body_default_regular" color={Colors.black_17} fontFamily="MomoTrustDisplay" maxScaleRate={1.5} style={{}}>Label</Text>
9
+ ```
10
+
11
+ ### Props
12
+
13
+ Extends `TextProps` (React Native `Text`). Plus:
14
+
15
+ | Prop | Type | Default | Description |
16
+ | -------------- | ---------------------- | ------------------------ | ---------------------- |
17
+ | `typography` | `Typography` | `'body_default_regular'` | Typography token |
18
+ | `color` | `string` | theme text color | Text color |
19
+ | `fontFamily` | `string` | theme font | Custom font family |
20
+ | `maxScaleRate` | `number` | — | Max font scale rate |
21
+ | `style` | `StyleProp<TextStyle>` | — | Additional text styles |
22
+ | `children` | `ReactNode` | — | Text content |
23
+
24
+ ## Compose
25
+
26
+ ```kotlin
27
+ import vn.momo.kits.components.Text
28
+ import vn.momo.kits.const.Typography
29
+
30
+ Text(text = "Label", style = Typography.bodyDefaultRegular)
31
+ Text(text = "Title", style = Typography.headlineDefaultBold)
32
+ ```
33
+
34
+ Signature:
35
+
36
+ ```kotlin
37
+ @Composable
38
+ fun Text(
39
+ text: String,
40
+ color: Color? = null,
41
+ style: TextStyle = Typography.bodyDefaultRegular,
42
+ modifier: Modifier = Modifier,
43
+ textAlign: TextAlign? = TextAlign.Start,
44
+ maxLines: Int = Int.MAX_VALUE,
45
+ overflow: TextOverflow = TextOverflow.Clip,
46
+ textDecoration: TextDecoration? = null,
47
+ onTextLayout: ((TextLayoutResult) -> Unit)? = null,
48
+ fontFamily: String? = null,
49
+ minLines: Int = 1,
50
+ letterSpacing: TextUnit = TextUnit.Unspecified,
51
+ softWrap: Boolean = true,
52
+ accessibilityId: String? = null,
53
+ )
54
+ ```
55
+
56
+ > **Note:** NO `token` parameter. Use `style = Typography.xxx` instead.
@@ -0,0 +1,51 @@
1
+ # Toast
2
+
3
+ ## React Native
4
+
5
+ ```tsx
6
+ import { ApplicationContext } from '@momo-kits/foundation';
7
+
8
+ navigator?.maxApi?.showToast({
9
+ title: 'Saved successfully',
10
+ type: 'success', // 'success'|'warning'|'network'|'default'
11
+ undoTitle: "Back",
12
+ onUndoPress: () => { },
13
+ });
14
+ ```
15
+
16
+ ## Compose
17
+
18
+ Toast uses the **MaxApi bridge** — no standalone Composable:
19
+
20
+ ```kotlin
21
+ import vn.momo.kits.navigation.LocalMaxApi
22
+
23
+ @Composable
24
+ fun ToastExample() {
25
+ val maxApi = LocalMaxApi.current
26
+
27
+ Button(
28
+ title = "Show toast",
29
+ onClick = {
30
+ maxApi?.showToast(
31
+ params = mapOf(
32
+ "title" to "Saved successfully",
33
+ "type" to "success",
34
+ "undoTitle" to "Undo",
35
+ ),
36
+ callback = { result -> },
37
+ )
38
+ }
39
+ )
40
+ }
41
+ ```
42
+
43
+ > `LocalMaxApi` is `null` outside a properly set up navigation tree. For inline banner notifications use **SnackBar** (`snackbar.md`).
44
+
45
+ ## Key Differences
46
+
47
+ | Feature | React Native | Compose |
48
+ |---------|-------------|---------|
49
+ | API | `navigator.maxApi` | `LocalMaxApi.current` |
50
+ | Inline composable | Not available | Not available |
51
+ | Navigation dependency | Required | Required |
@@ -0,0 +1,95 @@
1
+ # Tooltip
2
+
3
+ ## React Native
4
+
5
+ ```tsx
6
+ import { Tooltip } from '@momo-kits/animated-tooltip';
7
+ import type { TooltipRef, TooltipButton } from '@momo-kits/tooltip';
8
+
9
+ const tooltipRef = useRef<TooltipRef>(null);
10
+
11
+ <Tooltip
12
+ ref={tooltipRef}
13
+ placement="top" // 'top' | 'bottom' | 'left' | 'right' (default: 'top')
14
+ align="center" // 'start' | 'center' | 'end' (default: 'center')
15
+ title="Title"
16
+ description="Helpful hint"
17
+ buttons={[
18
+ { title: 'Action', onPress: () => {} },
19
+ ]}
20
+ onVisibleChange={(visible) => {}}
21
+ onPressClose={() => {}}
22
+ accessibilityLabel="info_tooltip"
23
+ containerStyle={{}}
24
+ >
25
+ <Button title="Info" type="text" />
26
+ </Tooltip>
27
+
28
+ // Ref methods
29
+ tooltipRef.current?.show();
30
+ tooltipRef.current?.hide();
31
+ ```
32
+
33
+ Package: `@momo-kits/animated-tooltip`
34
+
35
+ ### Types
36
+
37
+ ```tsx
38
+ type TooltipButton = {
39
+ title?: string;
40
+ icon?: string;
41
+ onPress?: () => void;
42
+ };
43
+
44
+ type TooltipRef = {
45
+ show: () => void;
46
+ hide: () => void;
47
+ };
48
+ ```
49
+
50
+ ## Compose
51
+
52
+ ```kotlin
53
+ import vn.momo.kits.components.Tooltip
54
+ import vn.momo.kits.components.TooltipButton
55
+ import vn.momo.kits.components.rememberTooltipState
56
+
57
+ val state = rememberTooltipState()
58
+
59
+ Tooltip(
60
+ state = state,
61
+ title = "Title", // optional tooltip title
62
+ description = "Helpful hint", // tooltip description text
63
+ buttons = listOf( // optional action buttons
64
+ TooltipButton(title = "Action", onPress = { })
65
+ ),
66
+ placement = TooltipPlacement.TOP, // TOP | BOTTOM | LEFT | RIGHT (default: TOP)
67
+ align = TooltipAlign.CENTER, // START | CENTER | END (default: CENTER)
68
+ onVisibleChange = { visible -> }, // visibility change callback
69
+ onPressClose = {}, // close button pressed callback
70
+ modifier = Modifier,
71
+ ) {
72
+ Button(
73
+ title = "Show tooltip",
74
+ onClick = { state.show() },
75
+ size = Size.SMALL,
76
+ )
77
+ }
78
+
79
+ // State methods
80
+ state.show()
81
+ state.hide()
82
+ state.toggle()
83
+ ```
84
+
85
+ ### Types
86
+
87
+ ```kotlin
88
+ enum class TooltipPlacement { TOP, BOTTOM, LEFT, RIGHT }
89
+ enum class TooltipAlign { START, CENTER, END }
90
+ data class TooltipButton(
91
+ val title: String? = null,
92
+ val icon: String? = null,
93
+ val onPress: (() -> Unit)? = null,
94
+ )
95
+ ```
@@ -0,0 +1,48 @@
1
+ # Uploader
2
+
3
+ ## React Native
4
+
5
+ ```tsx
6
+ import { Uploader } from '@momo-kits/uploader';
7
+
8
+ <Uploader
9
+ images={files}
10
+ numberOfImages={5}
11
+ disabled={false}
12
+ width={64}
13
+ height={64}
14
+ onAdd={() => launchImagePicker()}
15
+ onCancel={(image, index) => removeFile(index)}
16
+ onPressImage={(image, index) => previewImage(image)}
17
+ />
18
+ ```
19
+
20
+ ## Compose
21
+
22
+ ```kotlin
23
+ import vn.momo.kits.components.Uploader
24
+ import vn.momo.kits.components.UploadImage
25
+
26
+ Uploader(
27
+ images = listOf(
28
+ UploadImage(uri = "https://...", loading = false),
29
+ ),
30
+ numberOfImages = 5,
31
+ disabled = false,
32
+ width = 64.dp,
33
+ height = 64.dp,
34
+ onAdd = { launchPicker() },
35
+ onCancel = { image, index -> }, // null = hide cancel button
36
+ onPressImage = { image, index -> },
37
+ )
38
+ ```
39
+
40
+ ## Key Differences
41
+
42
+ | Feature | React Native | Compose |
43
+ |---------|-------------|---------|
44
+ | Image data | `{ uri, loading }[]` | `List<UploadImage>` |
45
+ | Cancel button | Always shown | `onCancel = null` hides it |
46
+ | Layout | Fixed grid | Horizontal scroll row |
47
+ | Dashed border | Built-in | `Modifier.dashedBorder` |
48
+ | Loading overlay | Built-in | White 40% + `Skeleton` |