@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,155 @@
1
+ # Bottom Tab Navigation
2
+
3
+ ## React Native — BottomTab
4
+
5
+ The `BottomTab` component from `@momo-kits/foundation` wraps `@react-navigation/bottom-tabs` with KitX styling.
6
+
7
+ ```tsx
8
+ import { BottomTab } from '@momo-kits/foundation';
9
+
10
+ <BottomTab
11
+ navigation={navigation}
12
+ initialRouteName="Home"
13
+ tabs={[
14
+ {
15
+ name: 'Home',
16
+ label: 'Home',
17
+ icon: 'ic_home',
18
+ screen: HomeScreen,
19
+ options: { headerTitle: 'Home' },
20
+ },
21
+ {
22
+ name: 'Search',
23
+ label: 'Search',
24
+ icon: 'ic_search',
25
+ screen: SearchScreen,
26
+ options: { headerTitle: 'Search' },
27
+ },
28
+ {
29
+ name: 'Profile',
30
+ label: 'Profile',
31
+ icon: 'ic_profile',
32
+ badgeLabel: '3',
33
+ screen: ProfileScreen,
34
+ options: { headerTitle: 'Profile' },
35
+ },
36
+ ]}
37
+ floatingButton={{
38
+ icon: 'ic_plus',
39
+ label: 'New',
40
+ onPress: () => handleNewAction(),
41
+ }}
42
+ />
43
+ ```
44
+
45
+ ### BottomTab Props
46
+
47
+ | Prop | Type | Default | Description |
48
+ |------|------|---------|-------------|
49
+ | `tabs` | `BottomTabItemProps[]` | required | Array of tab configurations |
50
+ | `navigation` | `NavigationProps` | required | Navigation object from parent |
51
+ | `initialRouteName` | `string` | — | Initially focused tab name |
52
+ | `nested` | `boolean` | — | Whether tabs use shared parent stack or independent NavigationContainer |
53
+ | `listeners` | `{ tabPress?, focus?, blur? }` | — | Event listeners for tab events |
54
+ | `floatingButton` | `FloatingButtonProps` | — | Center floating action button |
55
+
56
+ ### BottomTabItemProps
57
+
58
+ | Prop | Type | Default | Description |
59
+ |------|------|---------|-------------|
60
+ | `name` | `string` | required | Tab route identifier |
61
+ | `label` | `string` | required | Tab bar display label |
62
+ | `icon` | `string` | required | Icon source string |
63
+ | `screen` | `React.ComponentType` | required | Tab content component |
64
+ | `options` | `NavigationOptions` | required | Navigation options for this tab |
65
+ | `badgeLabel` | `string \| number` | — | Badge: `""` = dot, `"3"` = count, `0` = hidden |
66
+ | `showDot` | `boolean` | — | Legacy prop (dot behavior is controlled by `badgeLabel=""`) |
67
+ | `initialParams` | `any` | — | Initial params passed to the tab screen |
68
+
69
+ ### FloatingButtonProps
70
+
71
+ | Prop | Type | Description |
72
+ |------|------|-------------|
73
+ | `icon` | `string \| ReactNode` | FAB icon (required) |
74
+ | `label` | `string` | FAB label (required) |
75
+ | `onPress` | `() => void` | Click handler (required) |
76
+ | `container` | `ReactNode` | Custom container component |
77
+
78
+ ### Tab Bar Details
79
+
80
+ - Icon size: 28px
81
+ - Animated indicator pill: 44px wide, centered in selected tab
82
+ - Tab transitions: fade + scale (200ms)
83
+ - Supports badges (dot via `badgeLabel=""` and count via `badgeLabel="3"`)
84
+
85
+ ---
86
+
87
+ ## Compose
88
+
89
+ ```kotlin
90
+ import vn.momo.kits.navigation.bottomtab.BottomTab
91
+ import vn.momo.kits.navigation.bottomtab.BottomTabItem
92
+ import vn.momo.kits.navigation.bottomtab.BottomTabFloatingButton
93
+
94
+ BottomTab(
95
+ items = listOf(
96
+ BottomTabItem(
97
+ name = "home",
98
+ label = "Home",
99
+ icon = "ic_home",
100
+ screen = { HomeScreen() },
101
+ options = NavigationOptions(
102
+ headerTitle = HeaderTitle.Default("Home"),
103
+ ),
104
+ ),
105
+ BottomTabItem(
106
+ name = "search",
107
+ label = "Search",
108
+ icon = "ic_search",
109
+ screen = { SearchScreen() },
110
+ ),
111
+ BottomTabItem(
112
+ name = "profile",
113
+ label = "Profile",
114
+ icon = "ic_profile",
115
+ showDot = true,
116
+ badgeLabel = "3",
117
+ screen = { ProfileScreen() },
118
+ ),
119
+ ),
120
+ floatingButton = BottomTabFloatingButton(
121
+ icon = "ic_plus",
122
+ label = "New",
123
+ onPress = { handleNewAction() },
124
+ ),
125
+ )
126
+ ```
127
+
128
+ ### BottomTabItem
129
+
130
+ | Prop | Type | Description |
131
+ |------|------|-------------|
132
+ | `name` | String | Tab identifier |
133
+ | `label` | String | Tab bar label |
134
+ | `icon` | String | Icon source string |
135
+ | `showDot` | Boolean | Show notification dot (default: false) |
136
+ | `badgeLabel` | String? | Badge text (null = no badge, "0" = hidden) |
137
+ | `screen` | @Composable () -> Unit | Tab content |
138
+ | `options` | NavigationOptions? | Navigation config for this tab |
139
+
140
+ ### BottomTabFloatingButton
141
+
142
+ | Prop | Type | Description |
143
+ |------|------|-------------|
144
+ | `icon` | String | FAB icon |
145
+ | `label` | String | FAB label |
146
+ | `onPress` | () -> Unit | Click handler |
147
+
148
+ The floating button appears centered between tabs with a curved container.
149
+
150
+ ### Tab Bar Details
151
+
152
+ - Height: 64dp
153
+ - Animated indicator bar follows selected tab
154
+ - Supports badges (dot and count)
155
+ - Tab transitions: fade + scale (200ms)
@@ -0,0 +1,94 @@
1
+ # Bottom Sheet
2
+
3
+ ## React Native — showBottomSheet
4
+
5
+ Bottom sheets are displayed via `navigator.showBottomSheet()` from `ApplicationContext`.
6
+
7
+ ```tsx
8
+ const { navigator } = useContext(ApplicationContext);
9
+
10
+ navigator.showBottomSheet({
11
+ screen: SheetContent,
12
+ options: { title: 'Sheet Title' },
13
+ surface: true,
14
+ draggable: true,
15
+ barrierDismissible: false,
16
+ onDismiss: (type) => console.log('dismissed by', type),
17
+ });
18
+ ```
19
+
20
+ Dismiss from inside:
21
+
22
+ ```tsx
23
+ navigator.pop();
24
+ // or from content component via injected prop:
25
+ props.onRequestClose?.(() => {
26
+ // callback after dismiss animation
27
+ });
28
+ ```
29
+
30
+ ### BottomSheetParams
31
+
32
+ | Prop | Type | Default | Description |
33
+ |------|------|---------|-------------|
34
+ | `screen` | `React.ComponentType` | required | Content component rendered inside the sheet |
35
+ | `options.title` | `string` | — | Title shown in the header |
36
+ | `options.header` | `ReactNode` | — | Custom header node (replaces title) |
37
+ | `surface` | `boolean` | — | Use `background.surface` color instead of `background.default` |
38
+ | `onDismiss` | `(type?: string) => void` | — | Callback on dismiss; `type` is `'touch'`, `'gesture'`, or `'icon_close'` |
39
+ | `barrierDismissible` | `boolean` | `false` | Allow backdrop tap to dismiss |
40
+ | `draggable` | `boolean` | `true` | Enable drag-to-dismiss gesture |
41
+ | `useBottomInset` | `boolean` | `true` | Add safe area bottom inset padding |
42
+ | `useKeyboardAvoidingView` | `boolean` | `true` | Wrap content in KeyboardAvoidingView |
43
+ | `keyboardVerticalOffset` | `number` | auto | Override keyboard avoiding offset |
44
+ | `useDivider` | `boolean` | `true` | Show bottom border under the header |
45
+ | `footerComponent` | `ReactNode` | — | Sticky footer below content |
46
+ | `useNativeModal` | `boolean` | `false` | Use native RN Modal (auto-enabled in widget mode) |
47
+ | `leftOptions.iconLeft` | `string` | `'ic_back'` | Left header button icon |
48
+ | `leftOptions.onPressIconLeft` | `() => void` | — | Left header button handler (adds a back button) |
49
+
50
+ Additional params are spread as props to the content `screen` component.
51
+
52
+ ### Left Options (Back Navigation in Sheet)
53
+
54
+ For stacked bottom sheets with back navigation:
55
+
56
+ ```tsx
57
+ navigator.showBottomSheet({
58
+ screen: SecondSheet,
59
+ options: { title: 'Step 2' },
60
+ leftOptions: {
61
+ iconLeft: 'ic_back_ios',
62
+ onPressIconLeft: () => navigator.pop(),
63
+ },
64
+ });
65
+ ```
66
+
67
+ ### Footer Component
68
+
69
+ ```tsx
70
+ navigator.showBottomSheet({
71
+ screen: SheetContent,
72
+ options: { title: 'Selection' },
73
+ footerComponent: <Button title="Confirm" onPress={handleConfirm} />,
74
+ });
75
+ ```
76
+
77
+ ---
78
+
79
+ ## Compose
80
+
81
+ ```kotlin
82
+ navigator.showBottomSheet(
83
+ content = { SheetContent() },
84
+ isSurface = false,
85
+ barrierDismissible = true,
86
+ onDismiss = { },
87
+ )
88
+ ```
89
+
90
+ Dismiss from inside:
91
+
92
+ ```kotlin
93
+ navigator.pop()
94
+ ```
@@ -0,0 +1,125 @@
1
+ # Modal
2
+
3
+ ## React Native — showModal
4
+
5
+ Modal overlays are displayed via `navigator.showModal()` from `ApplicationContext`.
6
+
7
+ ```tsx
8
+ const { navigator } = useContext(ApplicationContext);
9
+
10
+ navigator.showModal(
11
+ {
12
+ screen: MyModalContent,
13
+ barrierDismissible: true,
14
+ onDismiss: () => console.log('dismissed'),
15
+ },
16
+ (error) => console.log(error), // optional onError callback
17
+ );
18
+ ```
19
+
20
+ Dismiss from inside:
21
+
22
+ ```tsx
23
+ navigator.pop();
24
+ // or from content component via injected prop:
25
+ props.onRequestClose?.(() => {
26
+ // callback after dismiss animation
27
+ });
28
+ ```
29
+
30
+ ### ModalParams
31
+
32
+ | Prop | Type | Default | Description |
33
+ |------|------|---------|-------------|
34
+ | `screen` | `React.ComponentType` | required | Content component to render inside the modal |
35
+ | `barrierDismissible` | `boolean` | — | Allow backdrop tap to dismiss |
36
+ | `onDismiss` | `() => void` | — | Callback when modal is dismissed |
37
+ | `modalStyle` | `ViewStyle` | — | Custom style for the modal container |
38
+ | `useNativeModal` | `boolean` | `false` | Use native RN Modal (auto-enabled in widget mode) |
39
+
40
+ Additional params are spread as props to the content `screen` component.
41
+
42
+ ### PopupNotify in Modal
43
+
44
+ Show a confirmation dialog by passing `PopupNotify` as the modal content:
45
+
46
+ ```tsx
47
+ navigator.showModal({
48
+ screen: ({ onRequestClose }) => (
49
+ <PopupNotify
50
+ title="Confirm?"
51
+ description="Are you sure you want to proceed?"
52
+ primary={{ title: 'OK', onPress: () => onRequestClose?.() }}
53
+ secondary={{ title: 'Cancel', onPress: () => onRequestClose?.() }}
54
+ onRequestClose={onRequestClose}
55
+ />
56
+ ),
57
+ barrierDismissible: true,
58
+ });
59
+ ```
60
+
61
+ ### PopupNotify Props
62
+
63
+ | Prop | Type | Description |
64
+ |------|------|-------------|
65
+ | `title` | `string` | Title text (required) |
66
+ | `primary` | `{ title, onPress }` | Primary action button (required) |
67
+ | `description` | `string \| ReactNode` | Description text |
68
+ | `image` | `string` | Image URL/path |
69
+ | `error` | `string` | Error message text |
70
+ | `secondary` | `{ title, onPress }` | Secondary action button |
71
+ | `buttonDirection` | `'row' \| 'column' \| 'auto'` | Button layout (`'auto'` switches based on title length > 12 chars) |
72
+ | `onIconClose` | `() => void` | Close icon press handler |
73
+ | `onRequestClose` | `(callback?) => void` | Dismiss modal — accepts optional callback that runs after dismiss animation |
74
+ | `id` | `string` | Tracking component ID |
75
+
76
+ ### PopupPromotion
77
+
78
+ Full-screen promotional modal with an image.
79
+
80
+ ```tsx
81
+ navigator.showModal({
82
+ screen: ({ onRequestClose }) => (
83
+ <PopupPromotion
84
+ image="https://promo-image.png"
85
+ onActionClick={() => handlePromo()}
86
+ onIconClose={() => onRequestClose?.()}
87
+ onRequestClose={onRequestClose}
88
+ />
89
+ ),
90
+ });
91
+ ```
92
+
93
+ | Prop | Type | Description |
94
+ |------|------|-------------|
95
+ | `image` | `string` | Promotion image (required) |
96
+ | `onActionClick` | `() => void` | Action click handler |
97
+ | `onIconClose` | `() => void` | Close icon handler |
98
+ | `onRequestClose` | `(callback?) => void` | Dismiss modal |
99
+ | `id` | `string` | Tracking component ID |
100
+
101
+ ---
102
+
103
+ ## Compose — Modal Overlay
104
+
105
+ ```kotlin
106
+ navigator.showModal(
107
+ content = { ModalContent() },
108
+ barrierDismissible = true,
109
+ onDismiss = { },
110
+ )
111
+ ```
112
+
113
+ Dismiss from inside:
114
+
115
+ ```kotlin
116
+ navigator.pop()
117
+ ```
118
+
119
+ ## Compose — Present (Full-screen Modal)
120
+
121
+ ```kotlin
122
+ navigator.present(content = { FullScreenModal() })
123
+ ```
124
+
125
+ Use `present` for full-screen modals, `showModal` for overlay dialogs.