@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.
- package/.claude/settings.local.json +11 -0
- package/.claude/skills/design-system/SKILL.md +88 -0
- package/.claude/skills/design-system/references/components/avatar.md +134 -0
- package/.claude/skills/design-system/references/components/badge.md +127 -0
- package/.claude/skills/design-system/references/components/bottom-tab.md +177 -0
- package/.claude/skills/design-system/references/components/bottomsheet.md +170 -0
- package/.claude/skills/design-system/references/components/button.md +206 -0
- package/.claude/skills/design-system/references/components/carousel.md +117 -0
- package/.claude/skills/design-system/references/components/checkbox.md +98 -0
- package/.claude/skills/design-system/references/components/chip.md +146 -0
- package/.claude/skills/design-system/references/components/collapse.md +120 -0
- package/.claude/skills/design-system/references/components/date-picker.md +119 -0
- package/.claude/skills/design-system/references/components/divider.md +84 -0
- package/.claude/skills/design-system/references/components/icon.md +130 -0
- package/.claude/skills/design-system/references/components/image.md +81 -0
- package/.claude/skills/design-system/references/components/information.md +107 -0
- package/.claude/skills/design-system/references/components/input-dropdown.md +138 -0
- package/.claude/skills/design-system/references/components/input-money.md +157 -0
- package/.claude/skills/design-system/references/components/input-otp.md +132 -0
- package/.claude/skills/design-system/references/components/input-phone-number.md +140 -0
- package/.claude/skills/design-system/references/components/input-search.md +124 -0
- package/.claude/skills/design-system/references/components/input-text-area.md +133 -0
- package/.claude/skills/design-system/references/components/input.md +152 -0
- package/.claude/skills/design-system/references/components/loader.md +87 -0
- package/.claude/skills/design-system/references/components/pagination.md +105 -0
- package/.claude/skills/design-system/references/components/popup-notify.md +128 -0
- package/.claude/skills/design-system/references/components/progress-info.md +114 -0
- package/.claude/skills/design-system/references/components/radio.md +86 -0
- package/.claude/skills/design-system/references/components/rating.md +126 -0
- package/.claude/skills/design-system/references/components/skeleton.md +120 -0
- package/.claude/skills/design-system/references/components/slider.md +141 -0
- package/.claude/skills/design-system/references/components/snackbar.md +97 -0
- package/.claude/skills/design-system/references/components/stepper.md +100 -0
- package/.claude/skills/design-system/references/components/steps.md +91 -0
- package/.claude/skills/design-system/references/components/suggest-action.md +95 -0
- package/.claude/skills/design-system/references/components/swipe.md +121 -0
- package/.claude/skills/design-system/references/components/switch.md +98 -0
- package/.claude/skills/design-system/references/components/tab-view.md +120 -0
- package/.claude/skills/design-system/references/components/tag.md +118 -0
- package/.claude/skills/design-system/references/components/text.md +151 -0
- package/.claude/skills/design-system/references/components/toast.md +99 -0
- package/.claude/skills/design-system/references/components/tooltip.md +138 -0
- package/.claude/skills/design-system/references/components/top-nav-miniapp.md +94 -0
- package/.claude/skills/design-system/references/components/top-nav.md +226 -0
- package/.claude/skills/design-system/references/components/uploader.md +115 -0
- package/.claude/skills/design-system/references/navigation/bottom-tab.md +131 -0
- package/.claude/skills/design-system/references/navigation/bottomsheet.md +161 -0
- package/.claude/skills/design-system/references/navigation/modal.md +133 -0
- package/.claude/skills/design-system/references/navigation/navigation-options.md +225 -0
- package/.claude/skills/design-system/references/navigation/navigator.md +111 -0
- package/.claude/skills/design-system/references/navigation/setup.md +134 -0
- package/.claude/skills/design-system/references/navigation/stack.md +128 -0
- package/.claude/skills/design-system/references/spec-convention.md +80 -0
- package/.claude/skills/design-system/references/tokens/colors.md +131 -0
- package/.claude/skills/design-system/references/tokens/spacing-radius.md +144 -0
- package/.claude/skills/design-system/references/tokens/theme.md +125 -0
- package/.claude/skills/design-system/references/tokens/typography.md +135 -0
- package/.claude/skills/design-system-kits/SKILL.md +102 -0
- package/.claude/skills/design-system-kits/references/code-convention.md +118 -0
- package/.claude/skills/design-system-kits/references/components/avatar.md +45 -0
- package/.claude/skills/design-system-kits/references/components/badge.md +27 -0
- package/.claude/skills/design-system-kits/references/components/button.md +65 -0
- package/.claude/skills/design-system-kits/references/components/carousel.md +51 -0
- package/.claude/skills/design-system-kits/references/components/checkbox.md +39 -0
- package/.claude/skills/design-system-kits/references/components/chip.md +54 -0
- package/.claude/skills/design-system-kits/references/components/collapse.md +63 -0
- package/.claude/skills/design-system-kits/references/components/date-picker.md +36 -0
- package/.claude/skills/design-system-kits/references/components/divider.md +21 -0
- package/.claude/skills/design-system-kits/references/components/icon.md +382 -0
- package/.claude/skills/design-system-kits/references/components/image.md +62 -0
- package/.claude/skills/design-system-kits/references/components/information.md +61 -0
- package/.claude/skills/design-system-kits/references/components/input-dropdown.md +92 -0
- package/.claude/skills/design-system-kits/references/components/input-money.md +128 -0
- package/.claude/skills/design-system-kits/references/components/input-otp.md +85 -0
- package/.claude/skills/design-system-kits/references/components/input-phone-number.md +96 -0
- package/.claude/skills/design-system-kits/references/components/input-search.md +127 -0
- package/.claude/skills/design-system-kits/references/components/input-text-area.md +100 -0
- package/.claude/skills/design-system-kits/references/components/input.md +126 -0
- package/.claude/skills/design-system-kits/references/components/loader.md +41 -0
- package/.claude/skills/design-system-kits/references/components/pagination.md +47 -0
- package/.claude/skills/design-system-kits/references/components/popup-notify.md +69 -0
- package/.claude/skills/design-system-kits/references/components/popup-promotion.md +35 -0
- package/.claude/skills/design-system-kits/references/components/progress-info.md +55 -0
- package/.claude/skills/design-system-kits/references/components/radio.md +42 -0
- package/.claude/skills/design-system-kits/references/components/rating.md +36 -0
- package/.claude/skills/design-system-kits/references/components/skeleton.md +25 -0
- package/.claude/skills/design-system-kits/references/components/slider.md +53 -0
- package/.claude/skills/design-system-kits/references/components/snackbar.md +52 -0
- package/.claude/skills/design-system-kits/references/components/stepper.md +46 -0
- package/.claude/skills/design-system-kits/references/components/steps.md +57 -0
- package/.claude/skills/design-system-kits/references/components/suggest-action.md +44 -0
- package/.claude/skills/design-system-kits/references/components/swipe.md +44 -0
- package/.claude/skills/design-system-kits/references/components/switch.md +43 -0
- package/.claude/skills/design-system-kits/references/components/tab-view.md +56 -0
- package/.claude/skills/design-system-kits/references/components/tag.md +50 -0
- package/.claude/skills/design-system-kits/references/components/text.md +56 -0
- package/.claude/skills/design-system-kits/references/components/toast.md +51 -0
- package/.claude/skills/design-system-kits/references/components/tooltip.md +95 -0
- package/.claude/skills/design-system-kits/references/components/uploader.md +48 -0
- package/.claude/skills/design-system-kits/references/design-spec-structure.md +356 -0
- package/.claude/skills/design-system-kits/references/design-spec-to-code.md +596 -0
- package/.claude/skills/design-system-kits/references/navigation/bottom-tab.md +155 -0
- package/.claude/skills/design-system-kits/references/navigation/bottomsheet.md +94 -0
- package/.claude/skills/design-system-kits/references/navigation/modal.md +125 -0
- package/.claude/skills/design-system-kits/references/navigation/navigation-options.md +430 -0
- package/.claude/skills/design-system-kits/references/navigation/navigator.md +177 -0
- package/.claude/skills/design-system-kits/references/navigation/setup.md +94 -0
- package/.claude/skills/design-system-kits/references/navigation/stack.md +152 -0
- package/.claude/skills/design-system-kits/references/screen-layout-rule.md +125 -0
- package/.claude/skills/design-system-kits/references/tokens/colors.md +183 -0
- package/.claude/skills/design-system-kits/references/tokens/spacing-radius.md +45 -0
- package/.claude/skills/design-system-kits/references/tokens/theme.md +97 -0
- package/.claude/skills/design-system-kits/references/tokens/typography.md +105 -0
- package/.claude/skills/vibe-design/SKILL.md +306 -0
- package/compose/build.gradle.kts +1 -1
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +7 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +3 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +5 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +2 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +5 -1
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +12 -0
- package/gradle.properties +1 -1
- package/ios/Popup/PopupPromotion.swift +2 -2
- package/local.properties +8 -0
- 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.
|