@momo-kits/native-kits 0.158.1-beta.1-debug → 0.158.1-beta.2-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/compose/build.gradle.kts +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +15 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +15 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +1 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +4 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +11 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +56 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +167 -0
- package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +32 -0
- package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +16 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +6 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +60 -0
- package/gradle.properties +1 -1
- package/local.properties +2 -2
- package/package.json +1 -1
- package/.claude/settings.local.json +0 -11
- package/.claude/skills/design-system/SKILL.md +0 -88
- package/.claude/skills/design-system/references/components/avatar.md +0 -134
- package/.claude/skills/design-system/references/components/badge.md +0 -127
- package/.claude/skills/design-system/references/components/bottom-tab.md +0 -177
- package/.claude/skills/design-system/references/components/bottomsheet.md +0 -170
- package/.claude/skills/design-system/references/components/button.md +0 -206
- package/.claude/skills/design-system/references/components/carousel.md +0 -117
- package/.claude/skills/design-system/references/components/checkbox.md +0 -98
- package/.claude/skills/design-system/references/components/chip.md +0 -146
- package/.claude/skills/design-system/references/components/collapse.md +0 -120
- package/.claude/skills/design-system/references/components/date-picker.md +0 -119
- package/.claude/skills/design-system/references/components/divider.md +0 -84
- package/.claude/skills/design-system/references/components/icon.md +0 -130
- package/.claude/skills/design-system/references/components/image.md +0 -81
- package/.claude/skills/design-system/references/components/information.md +0 -107
- package/.claude/skills/design-system/references/components/input-dropdown.md +0 -138
- package/.claude/skills/design-system/references/components/input-money.md +0 -157
- package/.claude/skills/design-system/references/components/input-otp.md +0 -132
- package/.claude/skills/design-system/references/components/input-phone-number.md +0 -140
- package/.claude/skills/design-system/references/components/input-search.md +0 -124
- package/.claude/skills/design-system/references/components/input-text-area.md +0 -133
- package/.claude/skills/design-system/references/components/input.md +0 -152
- package/.claude/skills/design-system/references/components/loader.md +0 -87
- package/.claude/skills/design-system/references/components/pagination.md +0 -105
- package/.claude/skills/design-system/references/components/popup-notify.md +0 -128
- package/.claude/skills/design-system/references/components/progress-info.md +0 -114
- package/.claude/skills/design-system/references/components/radio.md +0 -86
- package/.claude/skills/design-system/references/components/rating.md +0 -126
- package/.claude/skills/design-system/references/components/skeleton.md +0 -120
- package/.claude/skills/design-system/references/components/slider.md +0 -141
- package/.claude/skills/design-system/references/components/snackbar.md +0 -97
- package/.claude/skills/design-system/references/components/stepper.md +0 -100
- package/.claude/skills/design-system/references/components/steps.md +0 -91
- package/.claude/skills/design-system/references/components/suggest-action.md +0 -95
- package/.claude/skills/design-system/references/components/swipe.md +0 -121
- package/.claude/skills/design-system/references/components/switch.md +0 -98
- package/.claude/skills/design-system/references/components/tab-view.md +0 -120
- package/.claude/skills/design-system/references/components/tag.md +0 -118
- package/.claude/skills/design-system/references/components/text.md +0 -151
- package/.claude/skills/design-system/references/components/toast.md +0 -99
- package/.claude/skills/design-system/references/components/tooltip.md +0 -138
- package/.claude/skills/design-system/references/components/top-nav-miniapp.md +0 -94
- package/.claude/skills/design-system/references/components/top-nav.md +0 -226
- package/.claude/skills/design-system/references/components/uploader.md +0 -115
- package/.claude/skills/design-system/references/navigation/bottom-tab.md +0 -131
- package/.claude/skills/design-system/references/navigation/bottomsheet.md +0 -161
- package/.claude/skills/design-system/references/navigation/modal.md +0 -133
- package/.claude/skills/design-system/references/navigation/navigation-options.md +0 -225
- package/.claude/skills/design-system/references/navigation/navigator.md +0 -111
- package/.claude/skills/design-system/references/navigation/setup.md +0 -134
- package/.claude/skills/design-system/references/navigation/stack.md +0 -128
- package/.claude/skills/design-system/references/spec-convention.md +0 -80
- package/.claude/skills/design-system/references/tokens/colors.md +0 -131
- package/.claude/skills/design-system/references/tokens/spacing-radius.md +0 -144
- package/.claude/skills/design-system/references/tokens/theme.md +0 -125
- package/.claude/skills/design-system/references/tokens/typography.md +0 -135
- package/.claude/skills/design-system-kits/SKILL.md +0 -102
- package/.claude/skills/design-system-kits/references/code-convention.md +0 -118
- package/.claude/skills/design-system-kits/references/components/avatar.md +0 -45
- package/.claude/skills/design-system-kits/references/components/badge.md +0 -27
- package/.claude/skills/design-system-kits/references/components/button.md +0 -65
- package/.claude/skills/design-system-kits/references/components/carousel.md +0 -51
- package/.claude/skills/design-system-kits/references/components/checkbox.md +0 -39
- package/.claude/skills/design-system-kits/references/components/chip.md +0 -54
- package/.claude/skills/design-system-kits/references/components/collapse.md +0 -63
- package/.claude/skills/design-system-kits/references/components/date-picker.md +0 -36
- package/.claude/skills/design-system-kits/references/components/divider.md +0 -21
- package/.claude/skills/design-system-kits/references/components/icon.md +0 -382
- package/.claude/skills/design-system-kits/references/components/image.md +0 -62
- package/.claude/skills/design-system-kits/references/components/information.md +0 -61
- package/.claude/skills/design-system-kits/references/components/input-dropdown.md +0 -92
- package/.claude/skills/design-system-kits/references/components/input-money.md +0 -128
- package/.claude/skills/design-system-kits/references/components/input-otp.md +0 -85
- package/.claude/skills/design-system-kits/references/components/input-phone-number.md +0 -96
- package/.claude/skills/design-system-kits/references/components/input-search.md +0 -127
- package/.claude/skills/design-system-kits/references/components/input-text-area.md +0 -100
- package/.claude/skills/design-system-kits/references/components/input.md +0 -126
- package/.claude/skills/design-system-kits/references/components/loader.md +0 -41
- package/.claude/skills/design-system-kits/references/components/pagination.md +0 -47
- package/.claude/skills/design-system-kits/references/components/popup-notify.md +0 -69
- package/.claude/skills/design-system-kits/references/components/popup-promotion.md +0 -35
- package/.claude/skills/design-system-kits/references/components/progress-info.md +0 -55
- package/.claude/skills/design-system-kits/references/components/radio.md +0 -42
- package/.claude/skills/design-system-kits/references/components/rating.md +0 -36
- package/.claude/skills/design-system-kits/references/components/skeleton.md +0 -25
- package/.claude/skills/design-system-kits/references/components/slider.md +0 -53
- package/.claude/skills/design-system-kits/references/components/snackbar.md +0 -52
- package/.claude/skills/design-system-kits/references/components/stepper.md +0 -46
- package/.claude/skills/design-system-kits/references/components/steps.md +0 -57
- package/.claude/skills/design-system-kits/references/components/suggest-action.md +0 -44
- package/.claude/skills/design-system-kits/references/components/swipe.md +0 -44
- package/.claude/skills/design-system-kits/references/components/switch.md +0 -43
- package/.claude/skills/design-system-kits/references/components/tab-view.md +0 -56
- package/.claude/skills/design-system-kits/references/components/tag.md +0 -50
- package/.claude/skills/design-system-kits/references/components/text.md +0 -56
- package/.claude/skills/design-system-kits/references/components/toast.md +0 -51
- package/.claude/skills/design-system-kits/references/components/tooltip.md +0 -95
- package/.claude/skills/design-system-kits/references/components/uploader.md +0 -48
- package/.claude/skills/design-system-kits/references/design-spec-structure.md +0 -356
- package/.claude/skills/design-system-kits/references/design-spec-to-code.md +0 -596
- package/.claude/skills/design-system-kits/references/navigation/bottom-tab.md +0 -155
- package/.claude/skills/design-system-kits/references/navigation/bottomsheet.md +0 -94
- package/.claude/skills/design-system-kits/references/navigation/modal.md +0 -125
- package/.claude/skills/design-system-kits/references/navigation/navigation-options.md +0 -430
- package/.claude/skills/design-system-kits/references/navigation/navigator.md +0 -177
- package/.claude/skills/design-system-kits/references/navigation/setup.md +0 -94
- package/.claude/skills/design-system-kits/references/navigation/stack.md +0 -152
- package/.claude/skills/design-system-kits/references/screen-layout-rule.md +0 -125
- package/.claude/skills/design-system-kits/references/tokens/colors.md +0 -183
- package/.claude/skills/design-system-kits/references/tokens/spacing-radius.md +0 -45
- package/.claude/skills/design-system-kits/references/tokens/theme.md +0 -97
- package/.claude/skills/design-system-kits/references/tokens/typography.md +0 -105
- package/.claude/skills/vibe-design/SKILL.md +0 -306
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
# Stack Screen Configuration
|
|
2
|
-
|
|
3
|
-
## React Native — Screen Component
|
|
4
|
-
|
|
5
|
-
The `Screen` component from `@momo-kits/foundation` is the outermost container for every screen. It manages the header, scroll, keyboard avoidance, safe areas, and grid layout.
|
|
6
|
-
|
|
7
|
-
### Screen Props
|
|
8
|
-
|
|
9
|
-
| Prop | Type | Default | Description |
|
|
10
|
-
|------|------|---------|-------------|
|
|
11
|
-
| `navigation` | `Navigation` | — | Navigation object (injected by NavigationContainer) |
|
|
12
|
-
| `scrollable` | `boolean` | — | Enable scrollable content |
|
|
13
|
-
| `headerType` | `HeaderType` | `'default'` | `'default'` \| `'extended'` \| `'none'` |
|
|
14
|
-
| `animatedHeader` | `AnimatedHeader` | — | Object: `{ headerTintColor?, component?, headerTitle? }` — collapses on scroll |
|
|
15
|
-
| `headerComponent` | `ReactNode` | — | Custom header component |
|
|
16
|
-
| `footerComponent` | `ReactNode` | — | Sticky footer component |
|
|
17
|
-
| `backgroundColor` | `string` | — | Screen background color |
|
|
18
|
-
| `enableKeyboardAvoidingView` | `boolean` | — | Wrap content in KeyboardAvoidingView |
|
|
19
|
-
| `keyboardVerticalOffset` | `number` | auto | Override keyboard avoiding offset |
|
|
20
|
-
| `floatingButtonProps` | `FloatingButtonProps` | — | `{ icon, label, onPress, container? }` |
|
|
21
|
-
| `scrollViewProps` | `ScrollViewProps` | — | Pass-through props for underlying ScrollView |
|
|
22
|
-
| `layoutOffset` | `-8 \| -24 \| -56` | `-56` | Card offset overlap with header banner |
|
|
23
|
-
| `headerRightWidth` | `0 \| 73 \| 110 \| number` | `73` | Width of the right header area |
|
|
24
|
-
| `useGridLayout` | `boolean` | `true` | Apply auto grid spacing to children |
|
|
25
|
-
| `inputSearchProps` | `SearchHeaderProps` | — | Animated search header config |
|
|
26
|
-
| `inputSearchRef` | `Ref<InputRef>` | — | Ref for the search input |
|
|
27
|
-
| `animatedValue` | `Animated.Value` | auto | Inject a custom animated value |
|
|
28
|
-
| `useShadowHeader` | `boolean` | `true` | Header shadow |
|
|
29
|
-
| `headerBackground` | `string` | — | Custom header background image |
|
|
30
|
-
| `trackingParams` | `ScreenTrackingParams` | — | `{ value1?, value2? }` for auto tracking |
|
|
31
|
-
|
|
32
|
-
### ScreenRef (imperative methods)
|
|
33
|
-
|
|
34
|
-
```tsx
|
|
35
|
-
import { Screen, ScreenRef } from '@momo-kits/foundation';
|
|
36
|
-
|
|
37
|
-
const screenRef = useRef<ScreenRef>(null);
|
|
38
|
-
|
|
39
|
-
<Screen ref={screenRef} navigation={navigation} scrollable headerType="default">
|
|
40
|
-
{/* content */}
|
|
41
|
-
</Screen>
|
|
42
|
-
|
|
43
|
-
// Dynamically update header options
|
|
44
|
-
screenRef.current?.setOptions({
|
|
45
|
-
headerTitle: 'New Title',
|
|
46
|
-
hiddenBack: false,
|
|
47
|
-
headerRight: { useShortcut: true },
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Show/update search header
|
|
51
|
-
screenRef.current?.setSearchHeader({
|
|
52
|
-
placeholder: 'Search...',
|
|
53
|
-
onChangeText: setQuery,
|
|
54
|
-
});
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### HeaderType
|
|
58
|
-
|
|
59
|
-
| Value | Description |
|
|
60
|
-
|-------|-------------|
|
|
61
|
-
| `'default'` | Standard header with title + back button |
|
|
62
|
-
| `'extended'` | Taller header, supports search and collapse animation |
|
|
63
|
-
| `'none'` | No header rendered |
|
|
64
|
-
|
|
65
|
-
### AnimatedHeader
|
|
66
|
-
|
|
67
|
-
```tsx
|
|
68
|
-
animatedHeader={{
|
|
69
|
-
headerTintColor: '#FFFFFF',
|
|
70
|
-
headerTitle: 'Animated Title', // string | HeaderTitleProps
|
|
71
|
-
component: (props) => <CustomBanner {...props} />,
|
|
72
|
-
}}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### FloatingButtonProps
|
|
76
|
-
|
|
77
|
-
| Prop | Type | Description |
|
|
78
|
-
|------|------|-------------|
|
|
79
|
-
| `icon` | `string \| ReactNode` | FAB icon (required) |
|
|
80
|
-
| `label` | `string` | FAB label (required) |
|
|
81
|
-
| `onPress` | `() => void` | Click handler (required) |
|
|
82
|
-
| `container` | `ReactNode` | Optional custom container |
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Compose — Screen-level Configuration
|
|
87
|
-
|
|
88
|
-
Use `LazyColumn` + `rememberLazyListState()` as the preferred scrollable — triggers header collapse via `ScrollData(scrollState = lazyListState)`.
|
|
89
|
-
|
|
90
|
-
```kotlin
|
|
91
|
-
import vn.momo.kits.navigation.LocalNavigation
|
|
92
|
-
import vn.momo.kits.navigation.LocalNavigator
|
|
93
|
-
import vn.momo.kits.navigation.ScrollData
|
|
94
|
-
import androidx.compose.foundation.lazy.LazyColumn
|
|
95
|
-
import androidx.compose.foundation.lazy.rememberLazyListState
|
|
96
|
-
|
|
97
|
-
@Composable
|
|
98
|
-
fun MyScreen() {
|
|
99
|
-
val navigation = LocalNavigation.current
|
|
100
|
-
val navigator = LocalNavigator.current
|
|
101
|
-
val lazyListState = rememberLazyListState()
|
|
102
|
-
|
|
103
|
-
LaunchedEffect(Unit) {
|
|
104
|
-
navigation.setOptions(
|
|
105
|
-
headerTitle = HeaderTitle.Default("Screen Title"),
|
|
106
|
-
headerType = HeaderType.Default(),
|
|
107
|
-
headerRight = HeaderRight.Toolkit(),
|
|
108
|
-
hiddenBack = false,
|
|
109
|
-
scrollData = ScrollData(scrollState = lazyListState),
|
|
110
|
-
footerComponent = { FooterContent() },
|
|
111
|
-
floatingButtonProps = FloatingButtonProps(icon = "ic_plus", label = "Add", onClick = { }),
|
|
112
|
-
)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
LazyColumn(state = lazyListState) {
|
|
116
|
-
// content
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### setOptions params
|
|
122
|
-
|
|
123
|
-
```kotlin
|
|
124
|
-
navigation.setOptions(
|
|
125
|
-
headerTitle: HeaderTitle,
|
|
126
|
-
headerType: HeaderType,
|
|
127
|
-
headerRight: HeaderRight,
|
|
128
|
-
hiddenBack: Boolean,
|
|
129
|
-
scrollData: ScrollData,
|
|
130
|
-
backgroundColor: Color?,
|
|
131
|
-
tintColor: Color?,
|
|
132
|
-
footerComponent: @Composable () -> Unit,
|
|
133
|
-
floatingButtonProps: FloatingButtonProps?,
|
|
134
|
-
onBackHandler: (() -> Unit)?,
|
|
135
|
-
)
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### HeaderType Options
|
|
139
|
-
|
|
140
|
-
- `HeaderType.Default()` — standard header with title + back button
|
|
141
|
-
- `HeaderType.Extended()` — larger header (supports `inputSearchProps` for animated search)
|
|
142
|
-
- `HeaderType.Animated()` — collapses on scroll
|
|
143
|
-
- `HeaderType.None` — no header
|
|
144
|
-
|
|
145
|
-
### ScrollData
|
|
146
|
-
|
|
147
|
-
```kotlin
|
|
148
|
-
ScrollData(scrollable = true)
|
|
149
|
-
ScrollData(scrollState = lazyListState) // triggers header collapse
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
Use `LazyColumn` + `rememberLazyListState()` as preferred scrollable.
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# Screen Layout Rules
|
|
2
|
-
|
|
3
|
-
How `Screen` manages spacing, grid, and content layout in React Native and Compose.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## useGridLayout (React Native)
|
|
8
|
-
|
|
9
|
-
`Screen` has a `useGridLayout` prop (default: `true`) that controls whether the screen automatically applies grid-based spacing to its body and children.
|
|
10
|
-
|
|
11
|
-
| `useGridLayout` | Behavior |
|
|
12
|
-
|-----------------|----------|
|
|
13
|
-
| `true` (default) | Screen **automatically constrains** spacing — body padding, Section/Card margins, Item gutters are all managed by the grid system. You do **not** add manual padding/margin to Section, Card, or Item. |
|
|
14
|
-
| `false` | Screen does **not** apply automatic spacing. Each element (Section, Card, Item, View) must define its own padding, margin, and gap explicitly. Use this when you need full manual control over layout. |
|
|
15
|
-
|
|
16
|
-
### When to use `useGridLayout={true}` (default)
|
|
17
|
-
|
|
18
|
-
- Standard screens with Section/Card/Item layout
|
|
19
|
-
- Design spec screens — the grid system matches design tokens automatically
|
|
20
|
-
- Most screens in the app — this is the recommended default
|
|
21
|
-
|
|
22
|
-
### When to use `useGridLayout={false}`
|
|
23
|
-
|
|
24
|
-
- Custom layouts that don't follow the Section/Card/Item pattern
|
|
25
|
-
- Full-bleed content (edge-to-edge images, maps, video players)
|
|
26
|
-
- Screens where you need pixel-perfect manual control over every spacing value
|
|
27
|
-
- Embedding third-party components that manage their own layout
|
|
28
|
-
|
|
29
|
-
```tsx
|
|
30
|
-
// Default: grid layout ON — spacing is automatic
|
|
31
|
-
<Screen navigation={navigation} scrollable>
|
|
32
|
-
<Section>
|
|
33
|
-
<Item>{/* auto-spaced by grid */}</Item>
|
|
34
|
-
</Section>
|
|
35
|
-
<Card>
|
|
36
|
-
<Item>{/* auto-spaced by grid */}</Item>
|
|
37
|
-
</Card>
|
|
38
|
-
</Screen>
|
|
39
|
-
|
|
40
|
-
// Grid layout OFF — you control all spacing
|
|
41
|
-
<Screen navigation={navigation} scrollable useGridLayout={false}>
|
|
42
|
-
<View style={{ padding: Spacing.L }}>
|
|
43
|
-
{/* manual spacing everywhere */}
|
|
44
|
-
</View>
|
|
45
|
-
</Screen>
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Screen Layout Hierarchy (React Native)
|
|
51
|
-
|
|
52
|
-
`Section` and `Card` are **siblings** (same level) under `Screen` — never nest one inside the other.
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
Screen
|
|
56
|
-
├── Section > Item (margin container — no background/elevation)
|
|
57
|
-
├── Card > Item (elevated container with background + optional shadow)
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
```tsx
|
|
61
|
-
import { Screen, Section, Card, Item } from '@momo-kits/foundation';
|
|
62
|
-
|
|
63
|
-
<Screen navigation={navigation} scrollable headerType="default">
|
|
64
|
-
<Section>
|
|
65
|
-
<Item widthSpan={12}>{/* full width */}</Item>
|
|
66
|
-
<Item widthSpan={6}>{/* half width */}</Item>
|
|
67
|
-
</Section>
|
|
68
|
-
<Card>
|
|
69
|
-
<Item widthSpan={12}>{/* elevated content */}</Item>
|
|
70
|
-
</Card>
|
|
71
|
-
</Screen>
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
- **Screen**: Outermost container (header, scroll, keyboard, safe areas). See `navigation/stack.md` for full props.
|
|
75
|
-
- **Section**: Margin container (12px margin, gutter 12px) — contains `Item` directly
|
|
76
|
-
- **Card**: Elevated container (background + optional shadow, gutter 8px) — contains `Item` directly
|
|
77
|
-
- **Item**: Grid item, `widthSpan` 1-12 (12 = full width)
|
|
78
|
-
- **Section and Card are siblings** — both are direct children of Screen, never nested
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## Section Props
|
|
83
|
-
|
|
84
|
-
| Prop | Type | Default | Description |
|
|
85
|
-
|------|------|---------|-------------|
|
|
86
|
-
| `expanded` | `boolean` | `false` | Display in expanded state |
|
|
87
|
-
| `useMargin` | `boolean` | `true` | Apply 12px horizontal margin |
|
|
88
|
-
| `backgroundImage` | `string` | — | Background image source |
|
|
89
|
-
|
|
90
|
-
Grid context: `numberOfColumns` (12), `gutterSize` (12px), `sizePerSpan`, `getSizeSpan(span)`.
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Card Props
|
|
95
|
-
|
|
96
|
-
| Prop | Type | Default | Description |
|
|
97
|
-
|------|------|---------|-------------|
|
|
98
|
-
| `useShadow` | `boolean` | `false` | Show card shadow |
|
|
99
|
-
| `backgroundImage` | `string` | — | Background image source |
|
|
100
|
-
|
|
101
|
-
Grid context: `numberOfColumns` (12), `gutterSize` (8px), `sizePerSpan`, `getSizeSpan(span)`.
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## Item Props
|
|
106
|
-
|
|
107
|
-
```tsx
|
|
108
|
-
<Item widthSpan={6} heightSpan={2} style={viewStyle} />
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
`widthSpan` and `heightSpan` accept values 1-12.
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Automatic Spacing Summary
|
|
116
|
-
|
|
117
|
-
When `useGridLayout={true}` (default), the Screen applies:
|
|
118
|
-
|
|
119
|
-
| Container | Horizontal margin | Gutter (gap between Items) | Background |
|
|
120
|
-
|-----------|-------------------|---------------------------|------------|
|
|
121
|
-
| **Section** | 12px (when `useMargin={true}`) | 12px | None (transparent) |
|
|
122
|
-
| **Card** | 12px | 8px | Surface color + optional shadow |
|
|
123
|
-
| **Item** | Auto (from grid) | Auto (from grid) | None |
|
|
124
|
-
|
|
125
|
-
The body itself gets automatic vertical spacing between Section/Card blocks. You do **not** need to add `marginTop`/`marginBottom` between siblings — the grid handles it.
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
# Colors Reference
|
|
2
|
-
|
|
3
|
-
Both platforms share identical color token names and values.
|
|
4
|
-
|
|
5
|
-
## Import
|
|
6
|
-
|
|
7
|
-
| Platform | Import |
|
|
8
|
-
|----------|--------|
|
|
9
|
-
| React Native | `import { Colors } from '@momo-kits/foundation'` |
|
|
10
|
-
| Compose | `import vn.momo.kits.const.Colors` |
|
|
11
|
-
|
|
12
|
-
Usage is identical: `Colors.pink_03`, `Colors.black_17`, etc.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Grayscale (black_01 – black_20)
|
|
17
|
-
|
|
18
|
-
| Token | Hex | Notes |
|
|
19
|
-
|-------|-----|-------|
|
|
20
|
-
| `black_01` | #FFFFFF | White |
|
|
21
|
-
| `black_02` | #F9F9F9 | |
|
|
22
|
-
| `black_03` | #F0F0F0 | Border disable |
|
|
23
|
-
| `black_04` | #E8E8E8 | Border default |
|
|
24
|
-
| `black_05` | #E5E5E5 | |
|
|
25
|
-
| `black_06` | #D8D8D8 | |
|
|
26
|
-
| `black_07` | #CCCCCC | |
|
|
27
|
-
| `black_08` | #C6C6C6 | Text disable |
|
|
28
|
-
| `black_09` | #B9B9B9 | |
|
|
29
|
-
| `black_10` | #A0A0A0 | |
|
|
30
|
-
| `black_11` | #878787 | |
|
|
31
|
-
| `black_12` | #727272 | Text hint |
|
|
32
|
-
| `black_13` | #646464 | |
|
|
33
|
-
| `black_14` | #565656 | |
|
|
34
|
-
| `black_15` | #484848 | Text secondary |
|
|
35
|
-
| `black_16` | #404040 | |
|
|
36
|
-
| `black_17` | #303233 | Text default |
|
|
37
|
-
| `black_18` | #242424 | |
|
|
38
|
-
| `black_19` | #18191A | |
|
|
39
|
-
| `black_20` | #000000 | Black |
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Brand Color Families
|
|
44
|
-
|
|
45
|
-
Each family has 11 tint levels: **01** (darkest) → **11** (lightest). Levels 07–11 are suitable for backgrounds and containers.
|
|
46
|
-
|
|
47
|
-
### pink — Brand / primary
|
|
48
|
-
|
|
49
|
-
| Token | Hex | Token | Hex |
|
|
50
|
-
|-------|-----|-------|-----|
|
|
51
|
-
| `pink_01` | #BC2678 | `pink_07` | #F7ACD5 |
|
|
52
|
-
| `pink_02` | #D42A87 | `pink_08` | #FBD5EA |
|
|
53
|
-
| `pink_03` | #EB2F96 | `pink_09` | #FDEAF4 |
|
|
54
|
-
| `pink_04` | #ED43A0 | `pink_10` | #FEF4FA |
|
|
55
|
-
| `pink_05` | #EF59AB | `pink_11` | #FEF8FC |
|
|
56
|
-
| `pink_06` | #F382C0 | | |
|
|
57
|
-
|
|
58
|
-
Special: `pink_MoMo_Branding` = #A50064
|
|
59
|
-
|
|
60
|
-
### violet — Accents, special features
|
|
61
|
-
|
|
62
|
-
| Token | Hex | Token | Hex |
|
|
63
|
-
|-------|-----|-------|-----|
|
|
64
|
-
| `violet_01` | #7822C0 | `violet_07` | #D5AAF9 |
|
|
65
|
-
| `violet_02` | #8726D8 | `violet_08` | #EAD4FC |
|
|
66
|
-
| `violet_03` | #962AF0 | `violet_09` | #F4E9FD |
|
|
67
|
-
| `violet_04` | #A03FF1 | `violet_10` | #FAF4FE |
|
|
68
|
-
| `violet_05` | #AB55F3 | `violet_11` | #FCF8FE |
|
|
69
|
-
| `violet_06` | #C07FF6 | `violet_11_stroke` | #DFE1E5 |
|
|
70
|
-
|
|
71
|
-
### indigo — Accents
|
|
72
|
-
|
|
73
|
-
| Token | Hex | Token | Hex |
|
|
74
|
-
|-------|-----|-------|-----|
|
|
75
|
-
| `indigo_01` | #3E3CCC | `indigo_07` | #B8B7FF |
|
|
76
|
-
| `indigo_02` | #4644E6 | `indigo_08` | #DCDBFF |
|
|
77
|
-
| `indigo_03` | #4E4BFF | `indigo_09` | #EDEDFF |
|
|
78
|
-
| `indigo_04` | #5F5DFF | `indigo_10` | #F6F6FF |
|
|
79
|
-
| `indigo_05` | #716FFF | `indigo_11` | #F9F9FF |
|
|
80
|
-
| `indigo_06` | #9593FF | | |
|
|
81
|
-
|
|
82
|
-
### blue — Interactive
|
|
83
|
-
|
|
84
|
-
| Token | Hex | Token | Hex |
|
|
85
|
-
|-------|-----|-------|-----|
|
|
86
|
-
| `blue_01` | #0062CC | `blue_07` | #99CAFF |
|
|
87
|
-
| `blue_02` | #006EE6 | `blue_08` | #CCE4FF |
|
|
88
|
-
| `blue_03` | #007AFF | `blue_09` | #E5F1FF |
|
|
89
|
-
| `blue_04` | #1987FF | `blue_10` | #F2F8FF |
|
|
90
|
-
| `blue_05` | #3395FF | `blue_11` | #F7FBFF |
|
|
91
|
-
| `blue_06` | #66AFFF | | |
|
|
92
|
-
|
|
93
|
-
### mint — Highlight
|
|
94
|
-
|
|
95
|
-
| Token | Hex | Token | Hex |
|
|
96
|
-
|-------|-----|-------|-----|
|
|
97
|
-
| `mint_01` | #0F9B9B | `mint_07` | #A1E7E7 |
|
|
98
|
-
| `mint_02` | #11AFAF | `mint_08` | #D0F3F3 |
|
|
99
|
-
| `mint_03` | #13C2C2 | `mint_09` | #E7F8F8 |
|
|
100
|
-
| `mint_04` | #2AC8C8 | `mint_10` | #F3FCFC |
|
|
101
|
-
| `mint_05` | #42CECE | `mint_11` | #F8FDFD |
|
|
102
|
-
| `mint_06` | #71DADA | | |
|
|
103
|
-
|
|
104
|
-
### green — Success
|
|
105
|
-
|
|
106
|
-
| Token | Hex | Token | Hex |
|
|
107
|
-
|-------|-----|-------|-----|
|
|
108
|
-
| `green_01` | #2A9F47 | `green_07` | #AEE9BD |
|
|
109
|
-
| `green_02` | #2FB350 | `green_08` | #D6F4DE |
|
|
110
|
-
| `green_03` | #34C759 | `green_09` | #EAF9EE |
|
|
111
|
-
| `green_04` | #48CC69 | `green_10` | #F5FCF6 |
|
|
112
|
-
| `green_05` | #5DD27A | `green_11` | #F9FDFA |
|
|
113
|
-
| `green_06` | #85DD9B | | |
|
|
114
|
-
|
|
115
|
-
### lime — Accents
|
|
116
|
-
|
|
117
|
-
| Token | Hex | Token | Hex |
|
|
118
|
-
|-------|-----|-------|-----|
|
|
119
|
-
| `lime_01` | #80AE0E | `lime_07` | #D9F0A0 |
|
|
120
|
-
| `lime_02` | #90C30F | `lime_08` | #ECF7CF |
|
|
121
|
-
| `lime_03` | #A0D911 | `lime_09` | #F5FBE7 |
|
|
122
|
-
| `lime_04` | #A9DC28 | `lime_10` | #FAFDF3 |
|
|
123
|
-
| `lime_05` | #B3E141 | `lime_11` | #FCFEF8 |
|
|
124
|
-
| `lime_06` | #C6E870 | | |
|
|
125
|
-
|
|
126
|
-
### yellow — Accents
|
|
127
|
-
|
|
128
|
-
| Token | Hex | Token | Hex |
|
|
129
|
-
|-------|-----|-------|-----|
|
|
130
|
-
| `yellow_01` | #CCA300 | `yellow_07` | #FFEB99 |
|
|
131
|
-
| `yellow_02` | #E6B800 | `yellow_08` | #FFF5CC |
|
|
132
|
-
| `yellow_03` | #FFCC00 | `yellow_09` | #FFF9E5 |
|
|
133
|
-
| `yellow_04` | #FFD119 | `yellow_10` | #FFFCF2 |
|
|
134
|
-
| `yellow_05` | #FFD633 | `yellow_11` | #FFFDF7 |
|
|
135
|
-
| `yellow_06` | #FFE066 | | |
|
|
136
|
-
|
|
137
|
-
### gold — Gold accents
|
|
138
|
-
|
|
139
|
-
| Token | Hex | Token | Hex |
|
|
140
|
-
|-------|-----|-------|-----|
|
|
141
|
-
| `gold_01` | #C87012 | `gold_07` | #FDD1A2 |
|
|
142
|
-
| `gold_02` | #E17E14 | `gold_08` | #FEE8D0 |
|
|
143
|
-
| `gold_03` | #FA8C16 | `gold_09` | #FEF3E7 |
|
|
144
|
-
| `gold_04` | #FA972D | `gold_10` | #FFF9F3 |
|
|
145
|
-
| `gold_05` | #FBA345 | `gold_11` | #FEFBF8 |
|
|
146
|
-
| `gold_06` | #FCBA73 | | |
|
|
147
|
-
|
|
148
|
-
### orange — Warning
|
|
149
|
-
|
|
150
|
-
| Token | Hex | Token | Hex |
|
|
151
|
-
|-------|-----|-------|-----|
|
|
152
|
-
| `orange_01` | #C84316 | `orange_07` | #FDBBA4 |
|
|
153
|
-
| `orange_02` | #E14C19 | `orange_08` | #FEDDD2 |
|
|
154
|
-
| `orange_03` | #FA541C | `orange_09` | #FEEDE8 |
|
|
155
|
-
| `orange_04` | #FA6532 | `orange_10` | #FFF6F3 |
|
|
156
|
-
| `orange_05` | #FB7649 | `orange_11` | #FEFAF8 |
|
|
157
|
-
| `orange_06` | #FC9877 | | |
|
|
158
|
-
|
|
159
|
-
### red — Error / danger
|
|
160
|
-
|
|
161
|
-
| Token | Hex | Token | Hex |
|
|
162
|
-
|-------|-----|-------|-----|
|
|
163
|
-
| `red_01` | #C41B24 | `red_07` | #FBA7AB |
|
|
164
|
-
| `red_02` | #DD1F29 | `red_08` | #FDD3D5 |
|
|
165
|
-
| `red_03` | #F5222D | `red_09` | #FEE8EA |
|
|
166
|
-
| `red_04` | #F63842 | `red_10` | #FEF4F4 |
|
|
167
|
-
| `red_05` | #F74E57 | `red_11` | #FEF8F8 |
|
|
168
|
-
| `red_06` | #F97A81 | | |
|
|
169
|
-
|
|
170
|
-
### Quick Usage
|
|
171
|
-
|
|
172
|
-
- Brand: `Colors.pink_03`
|
|
173
|
-
- Interactive links/buttons: `Colors.blue_03`
|
|
174
|
-
- Error/danger: `Colors.red_03`
|
|
175
|
-
- Success: `Colors.green_03`
|
|
176
|
-
- Warning: `Colors.orange_03`
|
|
177
|
-
- Highlight: `Colors.mint_03`
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
## Rule
|
|
182
|
-
|
|
183
|
-
**Never hardcode hex values.** Always use `Colors.*` tokens for consistency across themes and platforms.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Spacing & Radius Reference
|
|
2
|
-
|
|
3
|
-
## Spacing
|
|
4
|
-
|
|
5
|
-
| Token | Value | RN Type | Compose Type |
|
|
6
|
-
|-------|-------|---------|-------------|
|
|
7
|
-
| `Spacing.XXS` | 2 | number | Dp |
|
|
8
|
-
| `Spacing.XS` | 4 | number | Dp |
|
|
9
|
-
| `Spacing.S` | 8 | number | Dp |
|
|
10
|
-
| `Spacing.M` | 12 | number | Dp |
|
|
11
|
-
| `Spacing.L` | 16 | number | Dp |
|
|
12
|
-
| `Spacing.XL` | 24 | number | Dp |
|
|
13
|
-
| `Spacing.XXL` | 32 | number | Dp |
|
|
14
|
-
| `Spacing.Size3XL` | 48 | number | Dp |
|
|
15
|
-
| `Spacing.Size4XL` | 56 | number | Dp |
|
|
16
|
-
| `Spacing.Size5XL` | 64 | number | Dp |
|
|
17
|
-
|
|
18
|
-
### Import
|
|
19
|
-
|
|
20
|
-
| Platform | Import |
|
|
21
|
-
|----------|--------|
|
|
22
|
-
| React Native | `import { Spacing } from '@momo-kits/foundation'` |
|
|
23
|
-
| Compose | `import vn.momo.kits.const.Spacing` |
|
|
24
|
-
|
|
25
|
-
> **Note:** Compose `Spacing.L`, `Spacing.M`, `Spacing.S` are already `Dp` values — do NOT call `.dp` on them.
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Radius
|
|
30
|
-
|
|
31
|
-
| Token | Value | Use for |
|
|
32
|
-
|-------|-------|---------|
|
|
33
|
-
| `Radius.XXS` | 2 | Subtle rounding |
|
|
34
|
-
| `Radius.XS` | 4 | Small elements |
|
|
35
|
-
| `Radius.S` | 8 | Cards, inputs |
|
|
36
|
-
| `Radius.M` | 12 | Medium containers |
|
|
37
|
-
| `Radius.L` | 16 | Modals, sheets |
|
|
38
|
-
| `Radius.XL` | 24 | Pills, chips |
|
|
39
|
-
|
|
40
|
-
### Import
|
|
41
|
-
|
|
42
|
-
| Platform | Import |
|
|
43
|
-
|----------|--------|
|
|
44
|
-
| React Native | `import { Radius } from '@momo-kits/foundation'` |
|
|
45
|
-
| Compose | `import vn.momo.kits.const.Radius` |
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# Theme Reference
|
|
2
|
-
|
|
3
|
-
The theme system provides semantic color mappings for light/dark mode support.
|
|
4
|
-
|
|
5
|
-
## Accessing Theme
|
|
6
|
-
|
|
7
|
-
| Platform | Access |
|
|
8
|
-
|----------|--------|
|
|
9
|
-
| React Native | `const { theme } = useContext(ApplicationContext)` |
|
|
10
|
-
| Compose | `val theme = AppTheme.current` |
|
|
11
|
-
|
|
12
|
-
Both expose an identical structure:
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
theme.colors.primary → Color (pink_03 light / pink_04 dark)
|
|
16
|
-
theme.colors.secondary → Color
|
|
17
|
-
theme.colors.gradient → Color
|
|
18
|
-
theme.colors.background.default / .surface / .tonal / .pressed / .selected / .disable
|
|
19
|
-
theme.colors.text.default / .secondary / .hint / .disable
|
|
20
|
-
theme.colors.border.default / .disable
|
|
21
|
-
theme.colors.success.primary / .secondary / .container
|
|
22
|
-
theme.colors.warning.primary / .secondary / .container
|
|
23
|
-
theme.colors.error.primary / .secondary / .container
|
|
24
|
-
theme.colors.highlight.primary / .secondary / .container
|
|
25
|
-
theme.colors.interactive.primary / .secondary / .container
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Light Theme (defaultTheme)
|
|
31
|
-
|
|
32
|
-
| Path | Value |
|
|
33
|
-
|------|-------|
|
|
34
|
-
| `primary` | `pink_03` (#EB2F96) |
|
|
35
|
-
| `secondary` | `pink_07` |
|
|
36
|
-
| `gradient` | #FDCADE |
|
|
37
|
-
| `background.default` | #F2F2F6 |
|
|
38
|
-
| `background.surface` | `black_01` (white) |
|
|
39
|
-
| `background.tonal` | `pink_09` |
|
|
40
|
-
| `background.pressed` | #DFDFE6 |
|
|
41
|
-
| `background.selected` | `pink_10` |
|
|
42
|
-
| `background.disable` | #EBEBF2 |
|
|
43
|
-
| `text.default` | `black_17` (#303233) |
|
|
44
|
-
| `text.secondary` | `black_15` (#484848) |
|
|
45
|
-
| `text.hint` | `black_12` (#727272) |
|
|
46
|
-
| `text.disable` | `black_08` (#C6C6C6) |
|
|
47
|
-
| `border.default` | `black_04` (#E8E8E8) |
|
|
48
|
-
| `border.disable` | `black_02` (#F9F9F9) |
|
|
49
|
-
| `success` | `green_03` / `green_07` / `green_08` |
|
|
50
|
-
| `warning` | `orange_03` / `orange_07` / `orange_08` |
|
|
51
|
-
| `error` | `red_03` / `red_07` / `red_08` |
|
|
52
|
-
| `highlight` | `mint_03` / `mint_07` / `mint_08` |
|
|
53
|
-
| `interactive` | `blue_03` / `blue_07` / `blue_08` |
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Dark Theme (darkTheme)
|
|
58
|
-
|
|
59
|
-
| Path | Value |
|
|
60
|
-
|------|-------|
|
|
61
|
-
| `primary` | `pink_04` |
|
|
62
|
-
| `secondary` | `pink_08` |
|
|
63
|
-
| `gradient` | #FDCADE |
|
|
64
|
-
| `background.default` | #121212 |
|
|
65
|
-
| `background.surface` | #1E1E1E |
|
|
66
|
-
| `background.tonal` | `pink_10` |
|
|
67
|
-
| `background.pressed` | #1A1A1A |
|
|
68
|
-
| `background.selected` | `pink_11` |
|
|
69
|
-
| `background.disable` | #303030 |
|
|
70
|
-
| `text.default` | White |
|
|
71
|
-
| `text.secondary` | #B0B0B0 |
|
|
72
|
-
| `text.hint` | #727272 |
|
|
73
|
-
| `text.disable` | #505050 |
|
|
74
|
-
| `border.default` | #2A2A2A |
|
|
75
|
-
| `border.disable` | #242424 |
|
|
76
|
-
|
|
77
|
-
Success, warning, error, highlight, and interactive colors are the same in both themes.
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Compose Theme Data Structures
|
|
82
|
-
|
|
83
|
-
```kotlin
|
|
84
|
-
data class Theme(dark: Boolean, colors: ColorScheme, font: String, assets: ThemeAssets)
|
|
85
|
-
data class ColorScheme(primary, secondary, gradient: Color, background: Background, text: TextColors, border: BorderColors, success/warning/error/highlight/interactive: ColorSet)
|
|
86
|
-
data class Background(default, surface, tonal, pressed, selected, disable: Color)
|
|
87
|
-
data class TextColors(default, secondary, hint, disable: Color)
|
|
88
|
-
data class BorderColors(default, disable: Color)
|
|
89
|
-
data class ColorSet(primary, secondary, container: Color)
|
|
90
|
-
data class ThemeAssets(headerBackground: String?)
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## Best Practice
|
|
96
|
-
|
|
97
|
-
Always prefer `theme.colors.*` over direct `Colors.*` tokens so the UI automatically adapts to light/dark mode.
|